feat(huya): 缺网页设备态的 CK 回退 HTTP cdnws 通道
问题:外部 CK(只带登录态)导入工作台后,任何任务都被「Cookie 缺少网页设备态 (sdid/udb_deviceid/udb_guiddata/udb_anobiztoken)」直接拦下,查询角色/开通都用不了。 实测结论(2026-10-15,同一张外部 CK): - 这些字段是 WSS 通道的门禁,不是业务必需 —— 同一条 CK 走 HTTP cdnws 可以正常查询 角色、商品,并走完整条开通链路(商品/小店/渠道/协议/返利/试算/同意/购买权限) - A/B 对照(同一账号只抽掉 sdid):含 sdid 服务端回包,去掉即完全不回包,说明 sdid 是 WSS 的硬门槛,而 HTTP 通道不需要 - 因此改为按能力选通道:设备态齐全走 WSS(行为不变),缺设备态回退 HTTP 并记日志 - http_client:补齐积分中心链路(get_supplier_info / accept_hy_protocol / calc_order_promotion / play_mall_get_my_promotion / play_mall_query_allocation / get_user_profile / get_follow_wechat_status);下单与支付参数对齐 2026-10-13 抓包 (appInfo.scene=7、订单 src/orderScene=4、orderType=6、jifencenter 标记、空点击序列、 m-shop.huya.com/points.html 回调),并去掉 orderType 1→10 的重试循环(有重复下单风险) - huya_runner_core:_activity_client/_shop_client 不再抛 COOKIE_INCOMPLETE,改为 返回 HTTP cdnws 客户端(方法签名与 WSS 会话保持一致,任务侧无感) 验证:tests/test_huya_http_shop_flow.py(下单/支付参数与回调域名)、 tests/test_huya_runner_transport.py(通道选择:缺设备态走 HTTP、齐全仍走 WSS); 真机 HTTP 开通链路 8 步全通(末步服务端返回业务提示「已超过该商品的购买上限」, 说明通道可用而非被丢弃)。反向验证:关掉回退即复现原报错。全量 pytest 717 passed。
This commit is contained in:
@@ -94,19 +94,30 @@ class HuyaBatchRunnerCore:
|
||||
return bucket
|
||||
|
||||
def _activity_client(self, uid: int, cookie: str):
|
||||
"""创建活动 WSS 会话;网页 Cookie 不完整时直接阻断任务。"""
|
||||
"""活动通道客户端:网页设备态齐全走 WSS,否则回退 HTTP cdnws。
|
||||
|
||||
2026-10-15 实测(外部 CK 导入后):只带登录态、缺 sdid/udb_deviceid/
|
||||
udb_guiddata/udb_anobiztoken 的 Cookie 在 WSS 上会被服务端静默丢弃业务请求
|
||||
(wsLaunch 或业务 RPC 无响应);同一条 Cookie 走 HTTP cdnws 通道可以正常
|
||||
查询角色与商品。因此这里不再直接失败,而是按能力选通道。
|
||||
"""
|
||||
missing = self._web_wss_cookie_missing(cookie)
|
||||
if missing:
|
||||
detail = ", ".join(missing)
|
||||
self._push_log(
|
||||
"error",
|
||||
f"[{uid}] Cookie 缺少网页设备态({detail}),已停止活动 HTTP 回退",
|
||||
"info",
|
||||
f"[{uid}] Cookie 缺少网页设备态({', '.join(missing)}),改用 HTTP cdnws 通道",
|
||||
)
|
||||
raise RuntimeError(f"COOKIE_INCOMPLETE: 缺少网页设备态({detail})")
|
||||
return self._http_client()
|
||||
session = self._open_wss_session(uid, cookie, "activity")
|
||||
self._push_log("info", f"[{uid}] 活动链路使用 WSS 会话")
|
||||
return session
|
||||
|
||||
def _http_client(self):
|
||||
"""HTTP cdnws 通道客户端(无需网页设备态,方法签名与 WSS 会话保持一致)。"""
|
||||
from core.huya.http_client import HuyaHttpClient
|
||||
|
||||
return HuyaHttpClient(logger=lambda message: self._push_log("info", message))
|
||||
|
||||
@staticmethod
|
||||
def _web_wss_cookie_missing(cookie: str) -> tuple[str, ...]:
|
||||
"""返回 WSS 前置字段中缺失的名称,不输出任何 Cookie 值。
|
||||
@@ -134,15 +145,14 @@ class HuyaBatchRunnerCore:
|
||||
return not cls._web_wss_cookie_missing(cookie)
|
||||
|
||||
def _shop_client(self, uid: int, cookie: str):
|
||||
"""创建商城 WSS 会话;网页 Cookie 不完整时直接阻断任务。"""
|
||||
"""商城通道客户端:网页设备态齐全走 WSS,否则回退 HTTP cdnws(原因同活动通道)。"""
|
||||
missing = self._web_wss_cookie_missing(cookie)
|
||||
if missing:
|
||||
detail = ", ".join(missing)
|
||||
self._push_log(
|
||||
"error",
|
||||
f"[{uid}] Cookie 缺少网页设备态({detail}),已停止商城 HTTP 回退",
|
||||
"info",
|
||||
f"[{uid}] Cookie 缺少网页设备态({', '.join(missing)}),改用 HTTP cdnws 通道",
|
||||
)
|
||||
raise RuntimeError(f"COOKIE_INCOMPLETE: 缺少网页设备态({detail})")
|
||||
return self._http_client()
|
||||
session = self._open_wss_session(uid, cookie, "shop")
|
||||
self._push_log("info", f"[{uid}] 商城链路使用 WSS 会话")
|
||||
return session
|
||||
|
||||
Reference in New Issue
Block a user