如何在没有模式的情况下在 JavaScript 中解码 Base64 编码的 Protobuf 数据?

问题描述 投票:0回答:1

我正在尝试从投注网站 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 数据。任何有关如何实现这一目标的帮助将不胜感激!

javascript web-scraping base64 decoding protobuf.js
1个回答
0
投票

以下是解码响应的方法:

  1. 安装 protobuf.js (
    npm install protobufjs
    )。
  2. 转到
    https://tipkurz.etipos.sk/zapasy
  3. 找到
    apiContract.js
    • Devtools (F12),按 Ctrl + P(打开文件)> 输入
      apiContract.js
    • 或者在来源>
      webpack:///modules/eTipCommon/api/proto/apiContract.js
    • 下找到它
  4. 下载/保存
    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()
© www.soinside.com 2019 - 2024. All rights reserved.