纯Python活动页TAF服务端验证登录态: webActUI WS通道 + 金样本对拍

- tools/huya_activity_verify.py: 认证帧+getActUserTaskDetail两帧即验证
  (200请求成功+6任务项=已登录; 无cookie对照905=未登录)
- 信封格式定论: L2=len(value), L1=L2+14, 身份一致性要求, actId尾字段=11 62 2f
- HTTP cdnws端点被volc-dcdn封锁非浏览器TLS, WS wsapi可纯Python直连
- evidence: 金样本(逐字节)+ 浏览器当前会话帧 + 验证结果
This commit is contained in:
yml2213
2026-08-26 02:35:42 +08:00
parent 97e6d14139
commit 8efd3b8d02
10 changed files with 449 additions and 0 deletions
+52
View File
@@ -406,3 +406,55 @@ X2(换uid+换cred+复用旧nonce)→40020 的真正原因:
- tools/nonce_forge.py: 本地nonce生成器(XXTEA+MD5, 自检对设备实采)
- scripts/probe_nonce_bind.py: 本地nonce bind验证脚本(同/跨账号)
- evidence/nonce_k1.json: k1设备常量证据
---
## 附录: 网页 cookie 登录态的服务端验证 (活动页 webActUI TAF, 2026-08-26 深夜新增)
### 目标
纯 Python 直连活动页 TAF 接口, 确认"注入/复刻的网页 cookie"在服务端是**已登录**状态,
而不只是浏览器页面自说自话(document.cookie/localStorage 可伪造)。
### 两条通道与结论
| 通道 | 结果 |
|---|---|
| HTTP POST `cdnws.api.huya.com/?baseinfo=<b64>&timestamp=<ms>` | ❌ **volc-dcdn CDN 封锁非浏览器 TLS**: requests/curl/curl_cffi(chrome131等) 全部超时或 502, 仅真实浏览器可过 |
| WebSocket `wss://wsapi.huya.com/?baseinfo=<b64>` | ✅ **纯 Python(websocket-client) 可直连**, 本验证走此通道 |
### webActUI TAF 信封格式 (逐字节逆向, 与仓库 _Writer JCE 编码一致)
```
[4B len] 10 03 2c 3c 40 <reqid> 56 08 <service> 66 <len> <func> 7d
00 01 <L1 2B> 08 00 01 06 04 tReq 1d 00 01 <L2 2B> <value>
8c 98 0c a8 0c [2c 36 <len> <trace> 4c 5c 66 00]
value = JCE: 0a 0a t0 uid(INT64大端) t1"" t2"" t3 UA t4 cookie(STR4) t5 ZERO t6"" 0b <func尾> 0b
L2 = len(value); L1 = L2 + 14 (两样本一致)
baseinfo(URL参数,b64) = JCE: t0 uid t1"" t2 UA t3 "HUYA&ZH&2052" t4..t7 空 t8 cookie(STR4) t9 trace t10 空MAP
认证帧(WS, 裸JCE无信封) = t0 uid t1 UA t2 cookie(STR4) t3"" t4 1 t5 "HUYA&ZH&2052" t2..t6 空尾
WS帧包装 = 00 03 1d 00 01 [2B len][4B len] + 信封(去4B前缀), len = inner - (12+svc+func)
```
- getActUserTaskDetail 的 func 尾 = `11 62 2f` = JCE **t1/INT16 标签+actId**(0x622F=25135, 活动"精英宝典福利季Q3"的 actId, 与 getActInfo 响应一致)。
- HTTP 响应体 = **base64(TAF信封)**; WS 响应 = 包装头 + 信封。
### 三个致命坑 (全部实测定位)
1. **身份一致性**: baseinfo / 认证帧 / task 帧的 uid+cookie 必须**全部同一账号**,
否则服务端回 `wup request biz execption:-1`(tars iErrorCode 5000, status 255)。
早先失败原因 = 预热帧是旧账号捕获, task 帧是新账号 → 身份冲突。
2. **actId 尾字段**: `11 62 2f` 是 3 字节(标签1字节+INT16值2字节), 只发 `62 2f` 会被服务端解析失败(-1)。
3. **最小序列**: 只需【认证帧 + getActUserTaskDetail 两帧】; launch/getConfig/等非必需。
无 cookie 对照 → 905(未登录), 带 cookie → 200 请求成功 + 6 任务项(服务端确认)。
### 验证结果 (2026-08-26 02:31, 新账号 hy_300026595 / uid 1199666913640)
```
[self_check] 通过: baseinfo/body/auth 与捕获金样本逐字节一致
[A] 带 cookie: 249B status=200 msg=请求成功 任务项=6 => ✅ 服务端确认已登录
[B] 无 cookie: 96B status=905 => ❌ 未登录 (对照成立)
```
结论: 纯Python产出的网页 cookie 在活动服务端确认为**已登录**, 无需浏览器。
### 资产
- tools/huya_activity_verify.py: 纯Python WS 验证工具 (自检金样本 + A/B 对照)
- evidence/activity_taf_golden.json: baseinfo/body/auth 金样本(逐字节)
- evidence/ws_warmup_frames.json: 8.26 浏览器预热帧(旧会话, 参考)
- evidence/ws_current_session_frames.json: 浏览器当前会话帧(新账号, 证明格式)
- evidence/activity_verify_result.txt: 最终验证输出
- /tmp/cdp_now*.py: CDP 抓当前浏览器帧的脚本(浏览器 200 对照)