Files
live-hub-py/docs/虎牙纯Python全自动登录-总结与交接.md
T
yml2213 1557760a20 多账号设备画像: 设备/指纹/风控数据归类 + 每账号独立画像全链接入
- 实测校验矩阵: hdid+app_version 硬锚(APP_SIGN_NOT_MATCH), fingerprint
  换→safe_auth滑块(自动过), device_id/机型/safedeviceid 直接过
- 定位注册接口: df/token+collect(sdid每次新值), wsapi dfpReport链(未破解)
- tools/huya_device_profile.py: 每账号画像生成/持久化(幂等)
- app_login_flow.login_cred / full_web_cookie 接入画像, 端到端出全套cookie
2026-08-26 10:50:04 +08:00

97 lines
5.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 虎牙纯Python全自动登录 — 总结与交接(2026-08-26
## 一、已达成 ✅(全部实测验证)
### 核心链路(**任意账号, 零设备零手动**)—— 2026-08-26升级
```
账号+密码
→ SHA1
→ build_password_login_wup() 组TAF包 (servant=huyaudbwebui, func=hypasswordLogin)
→ POST https://wup.huya.com [body=原始TAF字节, CT=application/multipart-formdata]
→ HTTP 200 → 解析响应bean → 新鲜cred(114B, 0a开头, 每次登录轮换)
→ 本地重算 nonce: XXTEA(pack(st)+pack(counter|st<<16), key=MD5hex(uid+k1)[:16])
(tools/nonce_forge.py, 无需设备! 与设备实采逐字节一致)
→ cert_forge.build_p1(fingerprint + 本地nonce + cred) → forge_cert(key_idx)
→ 信封补丁: 换cert + (uid不同则patch t3) [envelope_forge]
→ 扫码绑定流 getQrId→scanQrPicNotify→bindQrLoginUser→tryQrLogin
→ POST /web/cookie/verify {"appId":5002} ← 关键最后一步!
→ 全套网页Cookie: udb_cred/yyuid/udb_uid/udb_passport/username/udb_biztoken...
```
### 一键工具
| 命令 | 功能 |
|---|---|
| `.venv/bin/python tools/full_web_cookie.py <账号> <密码>` | 密码→全套网页Cookie(任意账号, 纯协议)|
| `.venv/bin/python tools/full_auto_safe.py <账号> <密码>` | 同上, 且新账号safe_auth滑块自动过 |
| `.venv/bin/python tools/full_auto_test.py <账号> <密码>` | 密码→cred→铸证→bind 全链路自测 |
| `.venv/bin/python tools/nonce_forge.py` | nonce生成器自检(对设备实采MATCH) |
## 二、关键知识(踩坑实录)
1. **nonce生成机制(v3定论, 2026-08-26动态hook实锤)**:
`rnd = XXTEA(pack(st) + pack(counter|st<<16), key=MD5hex(uid_str + k1)[:16])`
- st = 毫秒时间戳; counter = 同st内递增(从0)
- k1 = 设备常量(865a4924...), 不随账号变(evidence/nonce_k1.json)
- XXTEA输出=ceil(len/4)+1 words, 末尾存长度 → 16B输入=20B rnd
- 服务端用 t3.uid 重新派生 key 解密 nonce → 换账号必须重算nonce!
2. **信封规则**: ①非ce按上述本地算(不再复用原nonce!); ②t3.uid与cred账号一致;
③session三处不可动; ④信封TAF帧可长期复用。
3. **cred每次登录轮换**, 第二字节是代次计数器(0x10/0x20/.../0x80循环); 旧cred短期仍有效。
4. **响应bean解析**: _wup_data值=SIMPLE_LIST(0x1d)+elem头(00)+JCE优化int长度;
bean内 tag3(bytes)=cred。虎牙TAF类型表: STR1=6/STR4=7/MAP=8/LIST=9/
STRUCT_BEGIN=10(0xa)/STRUCT_END=11(0xb)/ZERO=12/SIMPLE_LIST=13。
5. **证书算法**=标准AES-128-ECBP1=[01 04]["5008"][u16le20+20B nonce][u16le40+40B指纹][u16le114+cred]
cert=b64([0x0C][key_idx][AES128(key16,zeropad(P1))]);钥表@rodata 0x1bc810。
6. **真实uid≠账号名数字**: hy_300023887 的真实uid=1199666914671(响应bean偏移235 u64be);
铸证/算nonce必须用真实uid!
## 三、新账号风控(safe_auth)——已实现 ✅
- App渠道(WUP)对新/异地账号返回 `aq.huya.com/p/safe_auth/pt_auth.html?param=xxx`
**udbrtt.huya.com 滑块** → tools/app_login_flow.login_cred() 自动过验并重发WUP
- pt_auth页JS逆向结论: urlParamMap=整个query原样回传; wupData纯web上下文空串可过;
gurl取图ver:5, segment=UdbCipher.decrypt乱序还原表; vurl提交act=UdbCipher.encrypt;
成功后服务端标记param风控会话通过, 直接重发同参WUP登录即放行。
- qr_auth(扫码型)明确不可自动化 → QrAuthRequiredError 提示先真机首登建信任。
## 四、多账号运营模型(v3: 零设备!)
```
任意新账号: 密码 → full_web_cookie.py → 全套cookie 自动出 (无需设备首登!)
唯一前提: 持有 k1 设备常量(evidence/nonce_k1.json 已固化; 若换设备需重新采集一次)
```
## 五、资产清单
- 组包: tools/huya_wup_encoder.py (build_password_login_wup, 自检对金样本)
- 登录流: tools/app_login_flow.py (login_cred/solve_safe_auth, safe_auth滑块闭环)
- **nonce: tools/nonce_forge.py (本地生成, 设备算法复刻, 自检MATCH)**
- 铸证: tools/cert_forge.py (build_p1/forge_cert/parse_p1)
- 信封: tools/envelope_forge.py (Envelope原位补丁uid/cert/session)
- 绑定: scripts/probe_nonce_bind.py (本地nonce bind验证, 同/跨账号)
- 一键: tools/full_web_cookie.py (任意账号纯协议出全套cookie)
- 滑块: core/huya/verification/{solver,track}.py + core/geetest/v3_slide
- 设备指纹: core/huya/device_fingerprint.py (get_huya_sdid)
- 证据: evidence/* (金样本wup_passwordlogin_taf.bin, nonce_k1.json等)
- 协议细节全记录: docs/虎牙hyCred签发-侦察笔记.md (按Round追加)
---
## 六、多账号设备隔离(2026-08-26 追加)
**问题**: 号多, 全部账号共用一台设备身份 → 需按账号区分设备/指纹。
**数据归类(对 wup.huya.com 实测矩阵)**:
- 设备硬锚(不可换): hdid(32hex) + app_version → 换即 APP_SIGN_NOT_MATCH
- 指纹(换→滑块自动过): fingerprint(40hex)
- 声明型(换→直接过): vendor/model/os/screen/宽高/device_id/safedeviceid
- 行为风控: user_action JSON / IP / safe_auth 滑块
**注册类接口**:
- df.huya.com/web/df/token+collect → sdid(每次新值, 天然每账号不同)
- wsapi huyaudbwebui getDfpConfig→selectOperator→dfpReport + udbdf dckey/check
(App 设备注册链, 加密体未破解, 当前不可纯Python走)
**方案(已端到端验证)**: tools/huya_device_profile.py 每账号生成并持久化
一套画像(fingerprint/device_id/机型随机, hdid+app_version 复用金样本);
首次换画像触发滑块由 solver 自动过; 证书 P1 指纹与该账号画像一致;
sdid 每次新取。→ full_web_cookie.py 已接入, 跑通全套 cookie。