虎牙网页Cookie来源驱动合并与WSS传输门禁

This commit is contained in:
yml2213
2026-09-01 19:17:32 +08:00
parent 8e3c0e69bc
commit 48c37bb8d7
16 changed files with 840 additions and 57 deletions
+34 -11
View File
@@ -72,18 +72,41 @@ class HuyaBatchRunnerCore:
return bucket
def _activity_client(self, uid: int, cookie: str):
"""活动任务优先使用最新活动 WSS,建连失败才回退 HTTP"""
from core.huya.http_client import HuyaHttpClient
"""创建活动 WSS 会话;网页 Cookie 不完整时直接阻断任务"""
missing = self._web_wss_cookie_missing(cookie)
if missing:
detail = ", ".join(missing)
self._push_log("error", f"[{uid}] Cookie 缺少网页设备态({detail}),已停止活动 HTTP 回退")
raise RuntimeError(f"COOKIE_INCOMPLETE: 缺少网页设备态({detail})")
session = self._open_wss_session(uid, cookie, "activity")
self._push_log("info", f"[{uid}] 活动链路使用 WSS 会话")
return session
try:
session = self._open_wss_session(uid, cookie, "activity")
self._push_log("info", f"[{uid}] 活动链路使用 WSS 会话")
return session
except Exception as exc: # noqa: BLE001 - fallback is part of transport policy
self._push_log(
"warning", f"[{uid}] 活动 WSS 不可用,回退 HTTP: {type(exc).__name__}"
)
return HuyaHttpClient(logger=lambda msg: self._push_log("info", f"[{uid}] {msg}"))
@staticmethod
def _web_wss_cookie_missing(cookie: str) -> tuple[str, ...]:
"""返回 WSS 前置字段中缺失的名称,不输出任何 Cookie 值。"""
required = (
"udb_cred", "udb_biztoken", "udb_uid", "yyuid", "sdid",
"guid", "udb_guiddata", "udb_deviceid", "game_did",
"_qimei_uuid42", "udb_anobiztoken", "__yamid_new",
)
return tuple(key for key in required if not cookie_value(cookie, key))
@classmethod
def _has_web_wss_cookie(cls, cookie: str) -> bool:
"""9.1 活动 WSS 需要网页设备态,不接受只有 App 认证字段的 Cookie。"""
return not cls._web_wss_cookie_missing(cookie)
def _shop_client(self, uid: int, cookie: str):
"""创建商城 WSS 会话;网页 Cookie 不完整时直接阻断任务。"""
missing = self._web_wss_cookie_missing(cookie)
if missing:
detail = ", ".join(missing)
self._push_log("error", f"[{uid}] Cookie 缺少网页设备态({detail}),已停止商城 HTTP 回退")
raise RuntimeError(f"COOKIE_INCOMPLETE: 缺少网页设备态({detail})")
session = self._open_wss_session(uid, cookie, "shop")
self._push_log("info", f"[{uid}] 商城链路使用 WSS 会话")
return session
def _close_wss_sessions(self):
bucket = self._session_bucket()