我正在尝试从投注网站 etipos.sk 中抓取数据。 API 响应在 ReturnValue 字段中包含 Base64 编码的 Protobuf 字符串。
以下是 API 响应的示例:
{
Result: 1,
Token: '4c6a71e287a5499a54e7c284a5d9bd4d',
ReturnValue: 'CrIICq8ICg0KAjY1EgdGbG9yYmFsGNUGIv0BChIKBHgxNjASBsSMZXNrbxoCNjUS5gEK4wEKBXh4MzQ2EglTdXBlcmxpZ2EaBHgxNjAqyAEIyZ5WEh9Ccm5vIC0gRkIgSHVycmljYW4gS2FybG92eSBWYXJ5IgcIgN2ombgyKgg1MjM3MjAwNzKBAQhZEg9IbGF2bsOpIHN0w6F2a3kabAoMMTlkMTc1NDk3NTc1EgZaw6FwYXMyUAjnwtdTEgZaw6FwYXMY+sINIhMKCTQ5NDYzOTMzNRIBMR1xPQpAIhMKCTQ5NDYzOTMzNhIBWB2Pwq1AIhMKCTQ5NDYzOTMzNxIBMh3XoxBAWAJgAjoFeHgzNDZQAWDVBiL3AQoRCgJ4NxIHRsOtbnNrbxoCNjUS4QEK3gEKBnh4NzQyOBIORi1MaWlnYSwgxb5lbnkaAng3Kr8BCKKdVxIVRXJhdmlpa2luZ2l0IC0gU0ItUHJvIgcIwIHNr6kyKgg1MTc5MjI3NTKBAQhZEg9IbGF2bsOpIHN0w6F2a3kabAoMMTlkMTc3NzI2NDU5EgZaw6FwYXMyUAj7x99UEgZaw6FwYXMY3PoaIhMKCTUwMDM1MDg5NhIBMR1I4bo/IhMKCTUwMDM1MDg5NxIBWB3D9aBAIhMKCTUwMDM1MDg5OBIBMh1xPZpAWAJgAjoGeHg3NDI4UAFg1QYipgIKGQoEeDE2NRINxaB2YWrEjWlhcnNrbxoCNjUSiAIKhQIKBnh4NzQ1NBIdVW5paG9ja2V5IFByaW1lIExlYWd1ZSwgxb5lbnkaBHgxNjUq1QEIk6RXEitSZWQgQW50cyBSeWNoZW5iZXJnIFdpbnRlcnRodXIgLSBadWcgVW5pdGVkIgcIgPPE06oyKgg1MTgzNDk2NzKBAQhZEg9IbGF2bsOpIHN0w6F2a3kabAoMMTlkMTc3OTI1NTA1EgZaw6FwYXMyUAiB2+tUEgZaw6FwYXMYrqwFIhMKCTUwMTEwMDA5MxIBMR2PwvVAIhMKCTUwMTEwMDA5NBIBWB0fhetAIhMKCTUwMTEwMDA5NRIBMh1I4Zo/WAJgAjoGeHg3NDU0UAFg1QYi9wEKEwoCeDYSCcWgdsOpZHNrbxoCNjUS3wEK3AEKBHh4NDYSEVN1cGVybGlnYW4sIMW+ZW55GgJ4Niq8AQjUtFcSFFJvbm5ieSAtIFRhYnkgRkMgSUJLIgcIwLuEs6kyKgg1MTc4ODE5OTKBAQhZEg9IbGF2bsOpIHN0w6F2a3kabAoMMTlkMTc4MTQxNDYzEgZaw6FwYXMyUAiX8vhUEgZaw6FwYXMYjr0IIhMKCTUwMTc5OTMyMRIBMR2PwtU/IhMKCTUwMTc5OTMyMBIBWB0AALBAIhMKCTUwMTc5OTMxORIBMh0AAFBAWAJgAjoEeHg0NlABYNUGEhYInf//////////ARIHWsOhcGFzeRgBGAQ=',
Type: 'GetWebStandardEventsResponse'
}
我需要的值隐藏在 ReturnValue 字段中。我可以解码 Base64 字符串,但如果没有架构,我无法解析生成的 Protobuf 数据。
这是我尝试过的 JavaScript 代码:
const axios = require('axios');
const start = async()=>{
const response = await axios.post(
'https://tipkurz.etipos.sk/WebServices/Api/SportsBettingService.svc/GetWebStandardEvents',
{
'LanguageID': 17,
'Token': '4c6a71e287a5499a54e7c284a5d9bd4d',
'CategoryID': '65',
'Top': 50
}
)
const base64String = response.data.ReturnValue;
const decodedString = atob(base64String); // Decode Base64
console.log(decodedString); // Output the decoded string
}
start()
我能够使用 cyberchef
解码消息尽管成功解码了 Base64 字符串,但在不知道架构的情况下,我无法解析生成的 Protobuf 数据。任何有关如何实现这一目标的帮助将不胜感激!
以下是解码响应的方法:
npm install protobufjs
)。https://tipkurz.etipos.sk/zapasy
。apiContract.js
:
apiContract.js
。webpack:///modules/eTipCommon/api/proto/apiContract.js
apiContract.js
并将其放在与此脚本相同的文件夹中:const root = require('./apiContract.js');
const axios = require('axios');
function decodeResponse(base64String) {
const buffer = Buffer.from(base64String, 'base64');
return root.GetWebStandardEventsResponse.decode(buffer);
}
async function start() {
const response = await axios.post(
'https://tipkurz.etipos.sk/WebServices/Api/SportsBettingService.svc/GetWebStandardEvents',
{
'LanguageID': 17,
'Token': '427d2c7c9eb0eaed4eff336beb21aec0',
'CategoryID': 'x130',
'Top': 50
}
);
const base64String = response.data.ReturnValue;
const decodedObject = decodeResponse(base64String);
console.log(JSON.stringify(decodedObject));
}
start()