136 lines
8.4 KiB
Markdown
136 lines
8.4 KiB
Markdown
# 虎牙网页 Cookie 缺失字段补齐方案(2026-09-01 晚)
|
||
|
||
> 目标:账号 19507362959(DB id=58,yyuid=1199664135026)跑通精英宝典 WSS
|
||
> query_game_name(checkUserBindGameAccount)/ query_points(getUserScore)。
|
||
> 当前账号 cookie 仅 16 字段(登录凭据),对比 9.1 抓包 42 字段缺 26 个。
|
||
> 本文档按"浏览器实测来源 → 生成方案"逐字段确定,重点分析 4 个核心设备字段。
|
||
|
||
## 一、背景结论(已有证据)
|
||
|
||
- 9.1 抓包(2026-09-01 09:36)42 字段 cookie:`guid/game_did/_qimei_uuid42/udb_*` 等全部齐全,
|
||
上午所有业务接口成功;当天 21:40 用同一 cookie 逐字节重放,**带 cookie 的业务接口全部返回
|
||
905/259**,不带 cookie 的 getActInfo/getActTaskDetail 仍成功 → 905 是 **udb 登录态过期**,
|
||
不是请求帧格式问题(重放原字节即可复现)。
|
||
- 浏览器实测(真实 Chrome CDP,`evidence/browser_cookie_harvest/report.md`):
|
||
7 个必填网页设备字段全部由**页面脚本写 document.cookie** 或**服务端匿名接口下发**产生:
|
||
| 字段 | 产生机制 | 协议可否复刻 |
|
||
| --- | --- | --- |
|
||
| `udb_deviceid` | middle/anonymousLogin Set-Cookie(10 年) | ✅ 已接入 anon_device |
|
||
| `udb_anobiztoken` | anonymousLogin 响应 biztoken | ✅ 已接入 anon_device |
|
||
| `udb_anouid` | anonymousLogin 响应 uid | ✅ 已接入 anon_device |
|
||
| `udb_guiddata` | middle URL 第三段 hex32(客户端自选) | ✅ 已接入 anon_device |
|
||
| `guid` | `HyUDBWebSDK-Exchange-2.4.js` 写 document.cookie | ❓ 脚本语义待复刻 |
|
||
| `_qimei_uuid42` | QIMEI SDK 脚本写 document.cookie | ❓ 脚本语义待复刻 |
|
||
| `__yamid_new` | 门户业务脚本写 document.cookie | ❓ 脚本语义待复刻 |
|
||
| `game_did` | 门户业务脚本写 document.cookie | ❓ 脚本语义待复刻 |
|
||
|
||
## 二、账号 58 现状(16 字段)
|
||
|
||
`udb_passport, username, udb_cred, udb_uid, yyuid, udb_biztoken, udb_version,
|
||
udb_origin, udb_status, sdid, hdid, udb_anouid, udb_anobiztoken, udb_deviceid,
|
||
udb_appid, udb_guiddata` —— 4 个匿名设备字段已有(anon_device 协议),
|
||
**缺 `guid/game_did/_qimei_uuid42/__yamid_new` 4 个核心 + 22 个统计字段**。
|
||
|
||
## 三、缺失字段补齐方案(逐字段)
|
||
|
||
### 3.1 四个核心设备字段(本轮重点分析)
|
||
|
||
| 字段 | 9.1 值形态 | 浏览器首次出现 | 补齐方案 |
|
||
| --- | --- | --- | --- |
|
||
| `guid` | 32 hex,`0a7d…` 前缀 | udbres.huya.com SDK 脚本 | 待 SDK 逆向;**格式** 32hex |
|
||
| `game_did` | 35 位字母数字 | liveapi.ip/getIpLocation 后门户脚本 | 待门户脚本逆向;格式 alnum |
|
||
| `_qimei_uuid42` | 42 hex,`1a901…` 前缀 | QIMEI SDK 脚本 | 待 SDK 逆向;格式 42hex |
|
||
| `__yamid_new` | 32 hex 大写 | 门户脚本 | 待门户脚本逆向;格式 32hex 大写 |
|
||
|
||
浏览器 round1 同一字段多次出现均**值稳定**(跨 profile 稳定):`_qimei_fingerprint`
|
||
恒为 `2822a43b5a3bd016fc844218c35c8a74`,`_qimei_uuid42` 前缀恒为 `1a901…`,
|
||
`guid` 前缀恒为 `0a7dfaa2…` → 存在固定前缀/哈希结构,**随机值可能被风控识别**,
|
||
需还原生成算法。
|
||
|
||
### 3.2 统计/会话字段(随机即可,服务端仅记录)
|
||
|
||
| 字段 | 生成规则 | 9.1 样例 |
|
||
| --- | --- | --- |
|
||
| `SoundValue` | 固定 `0.50` | `0.50` |
|
||
| `alphaValue` | 固定 `0.80` | `0.80` |
|
||
| `isInLiveRoom` | 固定 `true` | `true` |
|
||
| `__yasmid` / `__yamid_tt1` | 17 位随机小数,两者同值 | `0.24859634691671784` |
|
||
| `udb_passdata` | 固定 `3` | `3` |
|
||
| `_rep_cnt` / `rep_cnt` | 随机 0-9 | `5` / `7` |
|
||
| `udb_accdata` | 固定 `undefined` | `undefined` |
|
||
| `h_unt` | 当前时间戳(秒) | `1788226396` |
|
||
| `__yaoldyyuid` | = yyuid | `1199666914671` |
|
||
| `_yasids` | `__rootsid%3D`+32hex 大写 | `__rootsid%3DCBCC34C4…` |
|
||
| `Hm_lvt_5170…` | 当前时间戳 | `1788226384` |
|
||
| `Hm_lpvt_5170…` | 当前时间戳 | `1788226571` |
|
||
| `HMACCOUNT` | 16 hex 随机(百度统计下发) | `1B08C0532E777923` |
|
||
| `huya_flash_rep_cnt` | 随机整数 | `136` |
|
||
| `huyasp_rep_cnt` | 随机整数 | `9` |
|
||
| `huya_hd_rep_cnt` | 随机整数 | `22` |
|
||
| `huya_web_rep_cnt` | 随机整数 | `507` |
|
||
|
||
### 3.3 已有字段(保持真实值)
|
||
|
||
`udb_cred/biztoken/uid/yyuid/passport/version/origin/status/appid/username`(登录凭据)、
|
||
`sdid/hdid`(设备指纹)、`udb_deviceid/udb_guiddata/udb_anobiztoken/udb_anouid`(anon_device)、
|
||
`huya_ua`(normalize 注入)。
|
||
|
||
## 五、实现与端到端验证(2026-09-01 晚)
|
||
|
||
实现(commit `5dc7365`):
|
||
|
||
- 新增 `core/huya/web_cookie_fields.py`:`fill_web_cookie_fields(cookie, guid, uid)`
|
||
补齐 4 核心(guid 用 wsLaunch 会话值,`_qimei_uuid42`/`__yamid_new`/`game_did`
|
||
随机对齐格式)+ qimei 皮肤 + 22 个统计/会话字段;`missing_web_cookie_fields` 返回缺失集合。
|
||
- `core/huya/elite_session.py`:活动通道初始化时若缺网页字段,先 wsLaunch 预取
|
||
服务端认可的会话 guid → 补齐 cookie → 重建会话;业务 RPC 统一走补齐后的
|
||
cookie(`_resolve_cookie`)。
|
||
|
||
端到端结果(账号 id=58,yyyyuid=1199664135026,原始 16 字段登录态):
|
||
|
||
| 任务 | 结果 |
|
||
| --- | --- |
|
||
| `query_game_name`(b_act_id=9271) | **success**,角色=收麦季(手Q/苹果iOS),game_name=和平精英,已绑定(QQ 昵称"羊"),change_bind_day=7 |
|
||
| `query_points`(sid=2203) | **success**,msg=请求成功,gainScore=4880 / usedScore=4880 / available=0 |
|
||
|
||
修复前同类任务全部报"接口无响应"(getConfig 超时);修复后 Web API
|
||
(`POST /api/huya/tasks/batch`,账号 58)两条任务均 success 落库。
|
||
|
||
复现命令:
|
||
|
||
```bash
|
||
cd /Users/yml/codes/live-hub-py
|
||
.venv/bin/python /tmp/huya_test_session.py # 原始 DB cookie → 自动补齐 → 查角色/积分
|
||
./dev.sh # 界面 http://localhost:5174 → 精英宝典
|
||
```
|
||
|
||
## 六、风险与验证要求
|
||
|
||
## 七、各通道 Cookie 依赖矩阵(2026-09-01 晚实测)
|
||
|
||
不同通道对网页设备态字段的依赖不同,补齐策略按通道区别:
|
||
|
||
| 通道 | 代表接口 | Cookie 使用方式 | 原始 16 字段能否工作 |
|
||
| --- | --- | --- | --- |
|
||
| 活动 WSS(`mobileui`/`webActUI`) | getConfig / getUserScore / checkUserBindGameAccount / scoreExchangePrize | AUTH 帧 + 业务 tReq 均带完整 cookie,wsLaunch 会话 guid 需回写 | ❌ 缺 4 核心字段时 getConfig 超时;**需补齐**(已接入 elite_session) |
|
||
| 商城 WSS(`shopMiddleUI`,m-shop.yaoguo.com) | getGoodsInfoV5 / createOrderV5 / payOrderSubmit | 业务 tReq `UserId.sCookie` 带完整 cookie,`sGuid` 置空(HAR 实证) | ✅ 实测原始 cookie 正常响应(403 只是业务参数校验) |
|
||
| HTTP RPC(cdnws.api.huya.com POST) | query_user_score / get_act_prize_list / build_bind_urls / get_livelink_mini_qrcode | baseinfo + 业务 tReq 带完整 cookie,`_resolve_cookie_guid` 自动用 guid→udb_guiddata→sha256 派生 | ✅ 实测原始 cookie 直接返回 status=200(积分 4880) |
|
||
|
||
要点:
|
||
|
||
1. **活动 WSS 是唯一强校验网页设备态的通道**:AUTH/getConfig 前置就失败(无响应),
|
||
补齐字段后成功(commit `5dc7365`)。
|
||
2. **商城 WSS 不校验**:`UserId.sGuid=""` 且 cookie 原样发送,服务端接受原始登录态
|
||
(实测 getGoodsInfoV5 返回业务 403 而非连接/解析错误)。
|
||
3. **HTTP RPC 自带 guid 派生**:缺 `guid` 时依次用 `udb_guiddata[:32]`、`yyuid|udb_uid|
|
||
udb_passport|username|udb_biztoken` 的 sha256 派生,业务请求体可带原始 cookie
|
||
直接成功 —— 这是「活动接口当前主要依赖核心认证字段」的佐证(与
|
||
`HUYA_COOKIE合并审计与来源矩阵.md` 结论一致)。
|
||
4. 因此**没有其他必须补齐的 cookie 字段**:活动 WSS 之外,商城 WSS 与 HTTP RPC 用
|
||
原始登录态即可跑通。剩余未实测的链路(商城下单/支付等)依赖的仍是同一份
|
||
原始 cookie + `udb_cred/biztoken` 登录态,不涉及网页设备字段的新增要求。
|
||
|
||
1. `guid/_qimei_uuid42/__yamid_new/game_did` 的**真实性/关联性**服务端是否校验未知;
|
||
必须用生成值跑通线上活动 WSS 全链路才能定论,不能只过长度测试。
|
||
2. 统计字段随机值不影响接口语义,但**顺序**建议与 9.1 cookie 保持一致以便对照。
|
||
3. 补齐后仍需**新鲜的 udb 登录态**(905 = 过期),登录链路见 `app_login.py`。 |