解决JSON.stringify 丢undefined 的问题 ```js JSON.stringify(obj, (key, value) => { if (value === undefined) { return null } return value }) ``` ## proto 逆向过程 hotconi 采用 wss和rpc方式通信,经过采样发现,使用`protobufjs`可以解开 wss通信后,使用proto对象镜像接收数据。 proto对象已经被编译混淆,无法还原,但是可以通过返回值猜测结构和排序。 以`market.v2.trade.area.tickers` 为例 ### 在网页上抓包接 返回值结构 ```json { "code": 200, "msg": "SUCCESS", "status": "ok", "ts": 1732365915001, "ch": "market.v2.trade.area.tickers", "klinelist": null, "tradedepthvo": null, "tradedetaillist": null, "tradeareapair": { "listList": [ { "tradeid": 1900573, "cny": "0.000499", "buy": "0.00006590000000000000", "lever": "0", "sell": "0.00006899000000000000", "last": "0.00006899000000000000", "volume": "4612936154.8542", "change": "0.96", "high": "0.00007299000000000000", "low": "0.00006451000000000000", "isopen": "1", "open": "0", "amount": "307750.69", "isfiatconvert": true } ] }, "mainpair": null, "recommendpair": null, "uppair": null, "amtpair": null, "starpair": null, "tradetickervo": null, "entrustvo": null, "userassetbalance": null, "markettickerlist": null, "marketmonit": null, "margincrossassetvo": null, "marginisolatedassetvo": null, "newlistingpair": null, "chgdistributions": null, "marketzones": null, "klineorders": null, "notificationpush": null, "tradehotlisting": null, "ctcgoingordernum": null, "multichange": null, "heatmap": null, "downpair": null, "heatvol": null, "currencyrate": null } ``` ### 按照 proto格式 逆向编写文件 ```protobuf syntax = "proto3"; package market.v2.trade; // 替换为你的包名 // 定义最外层的消息类型 message Response { int32 code = 1; //数字代表 字段的编号顺序。 string msg = 2; string status = 3; int64 ts = 4; string ch = 5; TradeAreaPair tradeareapair = 25; } // 定义tradeareapair中的消息类型 message TradeAreaPair { repeated TradeArea listList = 1; // 由于JSON中的listList实际上是一个列表,我们使用repeated关键字 } // 定义tradeid_list中的消息类型 message TradeArea { int32 tradeid = 1; string cny = 2; string buy = 3; int32 lever = 4; string sell = 5; string last = 6; string volume = 7; string change = 8; string high = 9; string low = 10; string isopen = 11; int32 open = 12; string amount = 13; bool isfiatconvert = 14; } ``` ***【重点】*** 如果网页抓包的某项有值,但是接收到的没有值,需要调整每一个字段的编号。 上面是一个包的方式,其他所有接口都类似抓取,然后 规范的添加到 [market.v2.trade.proto](market.v2.trade.proto)