You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无Schema时,如何用JavaScript解码etipos.sk API的Base64 Protobuf数据?

解决etipos.sk API返回的Protobuf数据解析问题

1. 从CyberChef逆向生成Protobuf Schema

既然你已经能用CyberChef解码数据,直接利用它的解析结果逆向生成合法的.proto schema:

  • 把Base64解码后的二进制数据导入CyberChef,使用「Parse Protobuf」工具,它会自动推断字段的类型、编号和嵌套结构
  • 将CyberChef展示的字段结构整理成标准的Protobuf语法,比如:
syntax = "proto3";

message BettingRoot {
  repeated EventItem events = 1;
  int32 total_count = 2;
}

message EventItem {
  string event_id = 1;
  string event_title = 2;
  MarketItem main_market = 3;
}

message MarketItem {
  string market_type = 1;
  repeated SelectionItem selections = 2;
}

message SelectionItem {
  string selection_name = 1;
  double odds_value = 2;
}

注意:字段编号和类型必须和CyberChef推断的完全一致,否则解析会失败

2. 用JavaScript库编译Schema并解析数据

推荐使用protobufjs库,这是前端最常用的Protobuf处理工具:

  • 先安装依赖:
npm install protobufjs
  • 编写解析代码:
const protobuf = require("protobufjs");

// 填入你从CyberChef逆向得到的schema
const protoSchema = `
syntax = "proto3";
message BettingRoot {
  repeated EventItem events = 1;
  int32 total_count = 2;
}

message EventItem {
  string event_id = 1;
  string event_title = 2;
  MarketItem main_market = 3;
}

message MarketItem {
  string market_type = 1;
  repeated SelectionItem selections = 2;
}

message SelectionItem {
  string selection_name = 1;
  double odds_value = 2;
}
`;

async function parseEtiposData(decodedBinary) {
  // 编译schema
  const root = await protobuf.parse(protoSchema).root;
  const BettingRoot = root.lookupType("BettingRoot");
  
  // 解码二进制数据
  const decodedMessage = BettingRoot.decode(decodedBinary);
  
  // 转换为普通JavaScript对象
  return BettingRoot.toObject(decodedMessage, {
    defaults: true,
    arrays: true,
    objects: true
  });
}

// 使用示例:decodedBinary是你Base64解码后的Uint8Array
// parseEtiposData(decodedBinary).then(result => console.log(result));

3. 无Schema自动解析的快速方案

如果不想手动整理schema,可以用protobuf-inspector库尝试自动推断结构:

  • 安装依赖:
npm install protobuf-inspector
  • 快速解析代码:
const ProtobufInspector = require('protobuf-inspector');

// decodedBinary是Base64解码后的Uint8Array
const inspectionResult = ProtobufInspector.inspect(decodedBinary);
// 输出结构化的JSON格式数据
console.log(inspectionResult.asJSON());

这种方式的缺点是推断的字段名可能不够直观,需要你自己对应实际业务含义

注意事项

  • 爬取博彩网站数据前,请确认符合目标网站的robots.txt规则以及当地相关法律法规
  • 如果API返回的Protobuf结构有变动,需要重新逆向更新schema
  • 字段编号是Protobuf解析的核心,必须和实际数据完全匹配,否则会丢失字段或解析报错

内容的提问来源于stack exchange,提问作者aghagaga rfvya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 11:33:17