# 虎牙纯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-ECB;P1=[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。