Files
live-hub-py/tools/full_web_cookie.py
T

74 lines
3.3 KiB
Python

#!/usr/bin/env python3
"""一键: 账号密码 -> 完整网页Cookie全套。
用法: python tools/full_web_cookie.py <账号> <密码>
产出: 打印全部cookie并写 evidence/web_cookies_full.txt
"""
import sys, json, re, hashlib
ACCT, PWD = sys.argv[1], sys.argv[2]
sys.argv = [sys.argv[0]]
import sys,json,time,base64
from urllib.parse import quote
sys.path.insert(0,'scripts'); sys.path.insert(0,'tools')
from probe_forge_cert_bind import load_capture, parse_p1, build_p1, forge_cert
from probe_huya_qr_bind import QrRole, web_behavior
from core.huya.device_fingerprint import get_huya_sdid
qurl,P1_old=load_capture()
fields=parse_p1(P1_old)
import time,base64
from urllib.parse import quote
# 登录取cred: 触发safe_auth时自动解udbrtt滑块并重发(app_login_flow闭环)
import app_login_flow as _flow
try:
cred = _flow.login_cred(ACCT, PWD)
except _flow.QrAuthRequiredError as e:
print('❌', e)
sys.exit(2)
except Exception as e:
print(f'❌ 登录未返回cred(密码错误/账号异常/风控过验失败): {e}')
sys.exit(1)
print('新鲜cred:',len(cred),cred[:8].hex())
P1n=build_p1(b"5008",fields["fingerprint"],cred,rnd=fields["rnd"])
cert=base64.b64encode(forge_cert(P1n,key_idx=fields and 0x20)).decode()
raw=base64.b64decode(qurl)
i=raw.find(base64.b64encode(forge_cert(build_p1(b"5008",fields["fingerprint"],b"\x0a"*114,rnd=fields["rnd"]),key_idx=0x20)))
# 直接替换原证书段: 找原cert b64 span——用原P1重建
old_b64=None
from probe_forge_cert_bind import find_cert_span as _fcs; j=_fcs(raw)
if True:
# 退路: 用find_cert_span
from probe_forge_cert_bind import find_cert_span
s0,s1,_=find_cert_span(raw); raw=raw[:s0]+cert.encode()+raw[s1:]
else:
raw=raw[:j]+cert.encode()+raw[j+len(old_b64):]
wup=base64.b64encode(raw).decode()
sdid=get_huya_sdid(allow_fallback=False).sdid
pc=QrRole(pc=True,sdid=sdid); ph=QrRole(pc=False,sdid=sdid)
beh,page=web_behavior()
resp=pc.call("/qrLgn/getQrId","70001",{"behavior":beh,"type":"","domainList":"","page":page})
qrid=resp["data"]["qrId"]
cp=f"https://aq.huya.com/r/confirm.html?k={qrid}&id=5002"
ph.call("/qrLgn/scanQrPicNotify","70005",{"qrId":qrid,"wupData":wup,"behavior":quote("[]",safe=""),"page":quote(cp,safe="")})
r2=ph.call("/qrLgn/bindQrLoginUser","70007",{"qrId":qrid,"wupData":wup,"behavior":quote("[]",safe=""),"page":quote(cp,safe="")})
print("bind rc",r2.get("returnCode"))
for i in range(10):
rt=pc.call("/qrLgn/tryQrLogin","70003",{"qrId":qrid,"remember":"1","domainList":"","behavior":beh,"page":page})
dt=rt.get("data") or {}
if dt.get("stage")==2:
print(json.dumps(dt,ensure_ascii=False,indent=1)[:1800]); break
time.sleep(2)
# 追加: cookie verify 兑换
sess = getattr(pc,'session',None) or getattr(pc,'s',None) or getattr(pc,'_sess',None)
r=sess.post("https://udblgn.huya.com/web/cookie/verify",json={"appId":5002},timeout=15)
print('verify HTTP',r.status_code)
for h in r.headers.get('Set-Cookie','').split('\n') or [r.headers.get('Set-Cookie','')]:
if h: print('SET:',h[:110])
print('cookie jar:')
jar=[]
for c in sess.cookies:
print(' ',c.name,'=',c.value[:50])
jar.append(f'{c.name}={c.value}')
out=__import__('pathlib').Path(__file__).resolve().parent.parent/'evidence/web_cookies_full.txt'
out.write_text(f'# account: {ACCT}\n' + '\n'.join(jar) + '\n')
print('已写', out)