补齐网页Cookie缺失字段并接入会话自动预取guid
- 新增 core/huya/web_cookie_fields.py:4 核心设备字段(guid 取自 wsLaunch 会话、 _qimei_uuid42/__yamid_new/game_did 随机对齐格式)+ qimei 皮肤 + 22 个统计/会话字段 - elite_session 活动通道初始化时若缺网页字段,先 wsLaunch 预取服务端认可 guid, 补齐 cookie 后重建会话;业务 RPC 统一走补齐后的 cookie - 实测:账号 id=58(原始 16 字段登录态)checkUserBindGameAccount status=200 (和平精英已绑定/收麦季)、getUserScore status=200(积分 4880) - 附补齐方案与浏览器实测来源记录 docs/HUYA_CHAT_缺失字段补齐方案.md
This commit is contained in:
@@ -12,6 +12,7 @@ from collections.abc import Callable
|
||||
from typing import Literal
|
||||
|
||||
from .http_client import HuyaHttpClient, generate_http_baseinfo
|
||||
from .web_cookie_fields import missing_web_cookie_fields
|
||||
from .wss_client import ACTIVITY_WS_HOST, SHOP_BASEINFO, SHOP_WS_HOST, HuyaWssClient
|
||||
|
||||
|
||||
@@ -28,6 +29,7 @@ class HuyaEliteWssSession:
|
||||
):
|
||||
self.uid = int(uid or 0)
|
||||
self.cookie = cookie or ""
|
||||
self._original_cookie = self.cookie
|
||||
self.guid = HuyaHttpClient._resolve_cookie_guid(self.cookie)
|
||||
self.kind = kind
|
||||
self.logger = logger or (lambda _message: None)
|
||||
@@ -49,6 +51,39 @@ class HuyaEliteWssSession:
|
||||
|
||||
self.client = HuyaWssClient(baseinfo=baseinfo, logger=self.logger)
|
||||
try:
|
||||
if kind == "activity" and missing_web_cookie_fields(self.cookie):
|
||||
# 网页设备态缺核心字段(guid/_qimei_uuid42/__yamid_new/game_did 等):
|
||||
# 先跑一次 wsLaunch 拿到服务端认可的会话 guid,写回 cookie 补齐后再建会话。
|
||||
# 否则 getConfig / 业务 RPC 无响应(2026-09-01 实测)。
|
||||
probe = HuyaWssClient(baseinfo=baseinfo, logger=self.logger)
|
||||
try:
|
||||
self.loop.run_until_complete(
|
||||
probe.connect(host=connect_host, origin=origin, cookie=self.cookie)
|
||||
)
|
||||
self.loop.run_until_complete(
|
||||
probe.call_ws_launch_activity(self.uid, self.guid)
|
||||
)
|
||||
launch_guid = probe._launch_guid or ""
|
||||
self.logger(
|
||||
f"[WSS] 预取会话 guid={launch_guid or '(空)'},补齐网页 Cookie 字段"
|
||||
)
|
||||
finally:
|
||||
if probe.ws is not None:
|
||||
try:
|
||||
self.loop.run_until_complete(probe.disconnect())
|
||||
except Exception: # noqa: BLE001 清理探针连接失败不影响主流程
|
||||
self.logger("[WSS] 预取探针清理失败")
|
||||
from .web_cookie_fields import fill_web_cookie_fields
|
||||
|
||||
self.cookie = fill_web_cookie_fields(
|
||||
self.cookie, launch_guid, self.uid
|
||||
)
|
||||
self.guid = HuyaHttpClient._resolve_cookie_guid(self.cookie)
|
||||
baseinfo = urllib.parse.unquote(
|
||||
generate_http_baseinfo(self.uid, self.guid, "")
|
||||
)
|
||||
self.client = HuyaWssClient(baseinfo=baseinfo, logger=self.logger)
|
||||
|
||||
self.loop.run_until_complete(
|
||||
self.client.connect(host=connect_host, origin=origin, cookie=self.cookie)
|
||||
)
|
||||
@@ -68,6 +103,17 @@ class HuyaEliteWssSession:
|
||||
raise RuntimeError("虎牙 WSS 会话已关闭")
|
||||
return self.loop.run_until_complete(coroutine)
|
||||
|
||||
def _resolve_cookie(self, cookie: str) -> str:
|
||||
"""业务 RPC 统一使用补齐后的网页 Cookie。
|
||||
|
||||
任务侧往往传原始登录态 Cookie(缺网页设备字段);初始化阶段已经
|
||||
wsLaunch 取回会话 guid 并补齐字段(见 __init__),这里把缺字段的
|
||||
输入替换为补齐后的 self.cookie。
|
||||
"""
|
||||
if not cookie or cookie == self._original_cookie or missing_web_cookie_fields(cookie):
|
||||
return self.cookie
|
||||
return cookie
|
||||
|
||||
def close(self):
|
||||
if self._closed:
|
||||
return
|
||||
@@ -89,39 +135,56 @@ class HuyaEliteWssSession:
|
||||
return self._run(self.client.get_act_info(act_id))
|
||||
|
||||
def get_act_task_detail(self, uid: int, cookie: str, act_id: int):
|
||||
cookie = self._resolve_cookie(cookie)
|
||||
return self._run(self.client.get_act_task_detail(uid, cookie, act_id))
|
||||
|
||||
def get_act_user_task_detail(self, uid: int, cookie: str, act_id: int):
|
||||
cookie = self._resolve_cookie(cookie)
|
||||
return self._run(self.client.get_act_user_task_detail(uid, cookie, act_id))
|
||||
|
||||
def get_user_score(self, uid: int, cookie: str, sid: int):
|
||||
cookie = self._resolve_cookie(cookie)
|
||||
return self._run(self.client.get_user_score(uid, cookie, sid))
|
||||
|
||||
def query_user_score(self, uid: int, cookie: str, sid: int):
|
||||
return self.get_user_score(uid, cookie, sid)
|
||||
|
||||
def get_act_prize_list(self, uid: int, cookie: str, sid: int):
|
||||
cookie = self._resolve_cookie(cookie)
|
||||
return self._run(self.client.get_act_prize_list(uid, cookie, sid))
|
||||
|
||||
def get_act_prize_detail(self, uid: int, cookie: str, sid: int, pid: int):
|
||||
cookie = self._resolve_cookie(cookie)
|
||||
return self._run(self.client.get_act_prize_detail(uid, cookie, sid, pid))
|
||||
|
||||
def score_exchange_prize(self, uid: int, cookie: str, sid: int, pid: int):
|
||||
cookie = self._resolve_cookie(cookie)
|
||||
return self._run(self.client.score_exchange_prize(uid, cookie, sid, pid))
|
||||
|
||||
def get_user_prize_records(self, uid: int, cookie: str, sid: int):
|
||||
cookie = self._resolve_cookie(cookie)
|
||||
return self._run(self.client.get_user_prize_records(uid, cookie, sid))
|
||||
|
||||
def _resolve_kwargs(self, kwargs: dict) -> dict:
|
||||
if kwargs.get("cookie") is not None:
|
||||
kwargs = dict(kwargs)
|
||||
kwargs["cookie"] = self._resolve_cookie(kwargs["cookie"])
|
||||
return kwargs
|
||||
|
||||
def check_user_bind_game_account(self, **kwargs):
|
||||
kwargs = self._resolve_kwargs(kwargs)
|
||||
return self._run(self.client.check_user_bind_game_account(**kwargs))
|
||||
|
||||
def confirm_bind_act_account(self, **kwargs):
|
||||
kwargs = self._resolve_kwargs(kwargs)
|
||||
return self._run(self.client.confirm_bind_act_account(**kwargs))
|
||||
|
||||
def get_live_link_param(self, **kwargs):
|
||||
kwargs = self._resolve_kwargs(kwargs)
|
||||
return self._run(self.client.get_live_link_param(**kwargs))
|
||||
|
||||
def get_user_profile_batch(self, **kwargs):
|
||||
kwargs = self._resolve_kwargs(kwargs)
|
||||
return self._run(self.client.get_user_profile_batch(**kwargs))
|
||||
|
||||
def build_bind_urls(self, *args, **kwargs):
|
||||
|
||||
Reference in New Issue
Block a user