feat(huya): safe_auth滑块自动过验闭环 - 新账号密码登录也全自动
This commit is contained in:
+18
-22
@@ -14,28 +14,18 @@ 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 hashlib,requests as _rq
|
||||
from huya_wup_encoder import build_password_login_wup
|
||||
_raw=(__import__('pathlib').Path(__file__).resolve().parent.parent/'evidence/wup_passwordlogin_taf.bin').read_bytes()
|
||||
_mj=json.loads(re.search(rb'(\{"associationId.*?\})',_raw).group(1))
|
||||
_ua=re.search(rb'(\{"curl".*?"user_action":\[.*?\]\})',_raw).group().decode()
|
||||
_sd=re.search(rb'PQwemAN9[A-Za-z0-9+/=]+',_raw).group().decode()
|
||||
_dev={"app_version":"13.4.22","sdk_version":"1.0.80138","vendor":"xiaomi","model":"M2102J2SC","os":"android","ip":"127.0.0.1","fingerprint":"02df398797432eadefcc12767119ad5e80999389","screen":"M2102J2SC,30,11","width":"1080","height":"2120","device_id":"7c5387e0539c023c31c4ff0e807e7256117385ee"}
|
||||
_pkt=build_password_login_wup(ACCT[3:] if ACCT.startswith("hy_") else ACCT, hashlib.sha1(PWD.encode()).hexdigest(),_sd,"ed0db8334cadd236c00cadf7e11ab5a5",_mj["session"],_mj["traceId"],_ua,_dev)
|
||||
_r=_rq.post("https://wup.huya.com",data=_pkt,headers={"Content-Type":"application/multipart-formdata; charset=UTF-8","User-Agent":"Dalvik/2.1.0"},timeout=15)
|
||||
_b=_r.content; _s=_b.find(b'\x0a\x0a',0x40); _e=_b.find(b'_wup_header'); _d=_b[_s:_e-6]
|
||||
_m=re.search(rb'\x3d\x00\x00.',_d)
|
||||
if not _m:
|
||||
_u=re.search(rb'https://aq\.huya\.com[^\x00\x20]{20,}',_d)
|
||||
if _u:
|
||||
print('❌ 该账号触发了安全验证(safe_auth), 无法直接取cred')
|
||||
print(' 解决: 先用该账号在手机虎牙App上正常登录一次(建立设备信任),')
|
||||
print(' 之后本脚本即可全自动。验证页:', _u.group()[:100].decode())
|
||||
else:
|
||||
print('❌ 登录未返回cred(密码错误或账号异常), 响应',len(_b),'B')
|
||||
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)
|
||||
_l=_m.group()[3]
|
||||
cred=_d[_m.start()+4:_m.start()+4+_ln]
|
||||
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()
|
||||
@@ -74,4 +64,10 @@ 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:')
|
||||
for c in sess.cookies: print(' ',c.name,'=',c.value[:50])
|
||||
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)
|
||||
|
||||
Reference in New Issue
Block a user