无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
相关产品推荐
相关产品推荐

