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

如何解码Selenium采集获取的WebSocket通信消息

Selenium采集WebSocket Base64编码消息解码方案

你遇到的是Socket.IO框架的二进制消息拆分机制:451-开头的消息是Socket.IO控制帧,标记后续帧为实际二进制负载,Puppeteer默认做了帧拼接解码,Selenium的性能日志仅返回原始独立帧,因此需要自行关联解码。


步骤1:消息帧规则说明

你捕获的消息固定成对出现:

  • 控制帧:以451-["updateStream",{"_placeholder":true,"num":0}]格式呈现,标记下一条消息为对应事件的二进制负载
  • 负载帧:以等号结尾的Base64编码字符串,存储实际业务数据

步骤2:编写解码函数

引入Python内置Base64库实现解码,同时关联成对的控制帧和负载帧:

import base64
import json

# 全局变量存储上一条控制帧的事件信息
last_control_event = None

def parse_ws_payload(payload: str):
    global last_control_event
    # 处理Socket.IO控制帧
    if payload.startswith("451-"):
        control_content = json.loads(payload[4:])
        # 识别二进制占位符标记,存储事件名
        if len(control_content) >= 2 and "_placeholder" in control_content[1]:
            last_control_event = control_content[0]
        return None
    # 处理Base64负载帧
    if last_control_event and payload.endswith("="):
        # Base64解码转UTF-8字符串再解析JSON
        decoded_bytes = base64.b64decode(payload)
        decoded_data = json.loads(decoded_bytes.decode("utf-8"))
        # 重置控制帧标记
        temp_event = last_control_event
        last_control_event = None
        # 返回结构化解析结果
        return {
            "event": temp_event,
            "data": decoded_data
        }
    # 普通消息直接返回
    return {"event": "common", "data": payload}

步骤3:集成到原有Selenium代码

修改原WebSocketLog函数调用解码逻辑即可:

def WebSocketLog():
    for wsData in driver.get_log('performance'):
        wsJson = json.loads(wsData['message'])
        msg_method = wsJson["message"]["method"]
        if msg_method == "Network.webSocketFrameReceived":
            raw_payload = wsJson["message"]["params"]["response"]["payloadData"]
            parsed_result = parse_ws_payload(raw_payload)
            if parsed_result:
                print(f"Rx解析结果:{json.dumps(parsed_result, ensure_ascii=False)}")
        elif msg_method == "Network.webSocketFrameSent":
            raw_payload = wsJson["message"]["params"]["response"]["payloadData"]
            print(f"Tx原始内容:{raw_payload}")

解码效果示例

你给出的样例Base64字符串W1siQVVEQ0hGIiwxNjMzNTI1MDg2LjM2NiwwLjY3Mjc4XV0=解码后结果为:

[["AUDCHF", 1633525086.366, 0.67278]]

分别对应交易对名称、数据时间戳、报价数值。

内容的提问来源于stack exchange,提问作者saeed shiroo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 07:39:01