From bf6dee18507c350106a2d33ff3ab521cdabd1fd2 Mon Sep 17 00:00:00 2001 From: yml2213 Date: Sat, 29 Aug 2026 16:27:35 +0800 Subject: [PATCH] =?UTF-8?q?fix(huya):=20=F0=9F=94=92=20=E4=B8=80=E5=8F=B7?= =?UTF-8?q?=E4=B8=80=E8=AE=BE=E5=A4=87=E7=BC=BA=E5=8F=A3=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=20=E2=80=94=20hydevice=20=E6=8C=87=E7=BA=B9=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E6=8C=89=E8=B4=A6=E5=8F=B7=E9=9A=94=E7=A6=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 日志证据: 两账号 sdid 前缀相同 (0UnHUgv0_qmfD4KAKlwzh...) — get_huya_sdid 默认用全局临时目录, 所有账号共享同一份 hydevice 设备采集状态 → 服务端可 跨账号关联设备, 违背一号一环境。 - device_fingerprint: 新增 account_state_dir(account) → data/huya_fp_states/<账号>/ (持久化, 同账号多次登录=同一台'设备') - app_login 扫码绑定四步流 + login.prepare_device: 传入账号级 state_dir --- core/huya/app_login.py | 7 +++++-- core/huya/device_fingerprint.py | 15 ++++++++++++++- core/huya/login.py | 6 ++++-- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/core/huya/app_login.py b/core/huya/app_login.py index 0c7277c..d68fed5 100644 --- a/core/huya/app_login.py +++ b/core/huya/app_login.py @@ -36,7 +36,7 @@ from loguru import logger from .cert_forge import build_p1, decrypt_cert, forge_cert, parse_p1 from .cookie_utils import normalize_huya_cookie -from .device_fingerprint import get_huya_sdid +from .device_fingerprint import account_state_dir, get_huya_sdid from .device_profile import get_profile from .dfp_register import DfpRegistrationError, register_device from .envelope_forge import Envelope @@ -445,7 +445,10 @@ class HuyaAppPasswordLogin: # 4) 模拟扫码绑定四步流获取 biztoken try: - sdid_obj = get_huya_sdid(allow_fallback=True) + # 一号一设备: sdid 状态按账号隔离 (默认全局目录会让所有账号共享 + # 同一份 hydevice 设备状态, 服务端可跨账号关联 — 见 R40 缺口修复) + sdid_obj = get_huya_sdid(allow_fallback=True, + state_dir=account_state_dir(self.username)) sdid = sdid_obj.sdid if sdid_obj else "" pc = QrRole(pc=True, sdid=sdid, proxies=self.proxies) ph = QrRole(pc=False, sdid=sdid, proxies=self.proxies) diff --git a/core/huya/device_fingerprint.py b/core/huya/device_fingerprint.py index f3ce002..e68fc2e 100644 --- a/core/huya/device_fingerprint.py +++ b/core/huya/device_fingerprint.py @@ -20,6 +20,17 @@ FINGERPRINT_DIR = Path(__file__).parent / "fingerprint" RUNNER_JS = FINGERPRINT_DIR / "runner.js" SDID_PREFIX = "__SDID__" +# 每账号独立的 hydevice localStorage 状态目录 (一号一设备的关键): +# 默认全局临时目录会让所有账号共用同一份设备采集状态 → sdid/40hex hdid 同源, +# 服务端可跨账号关联设备。按账号分目录后, node 链路为每个账号维护独立"设备"。 +FP_STATE_ROOT = Path(__file__).resolve().parents[2] / "data" / "huya_fp_states" + + +def account_state_dir(account: str) -> Path: + """账号专属指纹状态目录 (持久化, 保证同一账号多次登录是同一台'设备')。""" + safe = "".join(c if c.isalnum() or c in "-_." else "_" for c in (account or "anon"))[:64] + return FP_STATE_ROOT / safe + DEFAULT_TIMEOUT = (8, 40) @@ -103,7 +114,9 @@ def get_huya_sdid( Args: app_id: 虎牙应用 id,App 场景 5008。 - state_dir: localStorage 持久化目录(保持设备一致性),None 用临时目录。 + state_dir: localStorage 持久化目录(保持设备一致性)。None 用全局临时目录 + (仅单设备场景可用); 多账号请传 account_state_dir(account) 实现 + 一号一设备 — 同账号多次登录复用同一份设备状态。 allow_fallback: node 失败时是否降级为旧版无指纹方式。 Returns: HuyaSdidResult(sdid, source, message),source 为 fingerprint/fallback/none。 diff --git a/core/huya/login.py b/core/huya/login.py index e8541ff..ebdbeb6 100644 --- a/core/huya/login.py +++ b/core/huya/login.py @@ -226,10 +226,12 @@ class HuyaPasswordLogin: def prepare_device(self) -> str: """获取虎牙风控 sdid(优先 hydevice 高信任指纹,失败降级旧版)。""" - from .device_fingerprint import get_huya_sdid + from .device_fingerprint import account_state_dir, get_huya_sdid try: - result = get_huya_sdid(app_id="5008", timeout=self.timeout) + # 一号一设备: 每账号独立 hydevice 状态, sdid/40hex hdid 不跨账号同源 + result = get_huya_sdid(app_id="5008", timeout=self.timeout, + state_dir=account_state_dir(self.username)) if result.sdid: self.sdid = result.sdid self.sdid_source = result.source