接入匿名设备态协议补齐Cookie字段并放宽保存

This commit is contained in:
yml2213
2026-09-01 19:29:56 +08:00
parent 8447ca82ed
commit 727c32a5f5
6 changed files with 113 additions and 23 deletions
+32 -9
View File
@@ -475,6 +475,30 @@ class HuyaAppPasswordLogin:
present = {key for key, value in cookie_pairs(cookie) if value}
return tuple(key for key in WEB_DEVICE_COOKIE_KEYS if key not in present)
@staticmethod
def _supplement_anonymous_device(
device_info: Mapping[str, object],
*,
proxies: Mapping[str, str] | None = None,
) -> dict:
"""用匿名设备态协议尽力补齐 4 个字段(udb_deviceid/guiddata/biztoken/anouid)。
只 ``setdefault``,不覆盖 hydevice 或显式传入的真实值;获取失败只
告警,不阻断登录(字段不全仍保存,风控风险由调用方承担)。
"""
from .anon_device import AnonymousDeviceError, fetch_anonymous_device_state
merged = dict(device_info)
try:
anon = fetch_anonymous_device_state(proxies=proxies)
except AnonymousDeviceError as exc:
logger.warning("[huya-app] 匿名设备态获取失败(不阻断登录): {}", exc)
return merged
for key, value in anon.items():
merged.setdefault(key, value)
logger.info("[huya-app] 匿名设备态协议补齐字段: {}", ", ".join(sorted(anon)))
return merged
@staticmethod
def _merge_web_cookie(
session: requests.Session,
@@ -667,6 +691,11 @@ class HuyaAppPasswordLogin:
"udb_anobiztoken", "udb_deviceid",
}:
merge_device_info.setdefault(key, value)
# 匿名设备态协议补齐(middle + anonymousLogin 签发 4 字段),
# 只 setdefault 不覆盖真实值;失败不阻断。
merge_device_info = self._supplement_anonymous_device(
merge_device_info, proxies=self.proxies
)
logger.info("[huya-app] cred 已获取,开始二维码绑定流程")
pc = QrRole(pc=True, sdid=sdid, proxies=self.proxies)
ph = QrRole(
@@ -793,15 +822,9 @@ class HuyaAppPasswordLogin:
missing_web = self._missing_web_device_cookie(cookie_str)
if missing_web:
missing_text = ", ".join(missing_web)
logger.error(
f"[huya-app] 账号 {acct} 登录凭据有效,但网页设备态不完整,缺少: {missing_text}"
)
return HuyaLoginResult(
success=False,
message=f"COOKIE_INCOMPLETE: 缺少网页设备态({missing_text}),请在真实虎牙网页/WebView完成一次访问后重试",
code="COOKIE_INCOMPLETE",
sdid=sdid,
context=pc.context,
logger.warning(
f"[huya-app] 账号 {acct} 登录凭据有效,但网页设备态不完整,"
f"缺少: {missing_text}(字段不全仍保存,风控风险自担)"
)
if "udb_cred" not in cookie_str or "yyuid" not in cookie_str:
return HuyaLoginResult(