- Python:requests(获取直播间 room_id 与 cookie)、websocket-client(WSS长连接收包/回包)、gzip(解压)、protobuf(消息反序列化)、loguru(日志输出)
- JS逆向与签名:execjs 调用本地 JS 生成 signature(X-Bogus);crypto-js(MD5 生成 X-MS-STUB)
- 协议解析:Protobuf(douyin.proto + 生成 douyin_pb2.py)
- WebSocket实时数据采集
- Protobuf协议解析
- Python网络编程/长连接
- JS逆向 / 参数签名(X-Bogus)
- 数据解压(gzip)
- 反爬/鉴权参数构造
- 业务背景:抖音直播间互动信息(弹幕)通过 WebSocket 推送且采用 Protobuf + gzip 压缩,同时连接参数包含签名(signature/X-Bogus)。常规抓包仅能拿到二进制数据,无法直接解析为可用文本。
- 核心功能:
- 自动进入直播间,提取 room_id,并获取必要 cookie(ttwid)
- 计算 WebSocket 连接所需 signature(X-Bogus),构造完整 WSS URL
- 建立 WSS 长连接,实时接收二进制推送包
- PushFrame → gzip解压 → Response/Message → 按 method 过滤弹幕消息 WebcastChatMessage
- 输出格式化弹幕内容(昵称 + 文本),并在 need_ack 场景下回传 ACK 保持连接稳定
- Step 1:HTTP 获取直播间基础信息
- 请求直播间页面,正则提取 roomId ,并从响应拿到 ttwid cookie
- Step 2:签名逆向与复用
- 组装参数串 o → MD5 得到 X-MS-STUB → 调用本地 JS 的 window.loader 生成 X-Bogus ,作为 websocket query 的 signature
- Step 3:WebSocket 通讯与协议解析
- 连接 wss://webcast100-ws-web-lq.douyin.com/webcast/im/push/v2/ (compress=gzip 等参数)
- 收到二进制帧后用 Protobuf 解析外层 PushFrame,再对 payload gzip 解压并解析内层 Response
- 遍历 messages,识别 WebcastChatMessage ,解析 ChatMessage 得到 user.nickName 与 content ,实时输出
- need_ack=True 时回 ACK 帧,提升稳定性