"""虎牙传输选择:网页设备态齐全走 WSS,缺设备态回退 HTTP cdnws。 背景(2026-10-15 实测,外部 CK 导入后):只带登录态、缺 sdid/udb_deviceid/ udb_guiddata/udb_anobiztoken 的 Cookie 在 WSS 上会被服务端静默丢弃业务请求 (wsLaunch / 业务 RPC 无响应),同一条 Cookie 走 HTTP cdnws 通道可正常查询。 """ from core.huya.http_client import HuyaHttpClient from web.backend.services.huya_runner_core import HuyaBatchRunnerCore LOGIN_ONLY_COOKIE = ( "udb_cred=cred; udb_biztoken=biz; udb_uid=1199659425268; yyuid=1199659425268" ) COMPLETE_COOKIE = ( "udb_cred=cred; udb_biztoken=biz; udb_uid=1199659425268; yyuid=1199659425268; " "sdid=sdid; udb_deviceid=w_1234567890123456789; udb_guiddata=guiddata; " "udb_anobiztoken=anobiz" ) def _runner() -> HuyaBatchRunnerCore: # 这两个方法只用 db 无关的状态,直接构造即可 return HuyaBatchRunnerCore( db=None, batch_id="test-batch", task_type="query_game_name" ) def test_minimal_app_cookie_reports_only_missing_web_guid(): cookie = ( "udb_cred=cred; udb_biztoken=biz; udb_uid=1199659425268; " "yyuid=1199659425268; sdid=sdid" ) assert HuyaBatchRunnerCore._web_wss_cookie_missing(cookie) == ( "udb_deviceid", "udb_guiddata", "udb_anobiztoken", ) assert not HuyaBatchRunnerCore._has_web_wss_cookie(cookie) def test_complete_web_cookie_enables_wss_without_logging_values(): cookie = ( "udb_cred=cred; udb_biztoken=biz; udb_uid=1199659425268; " "yyuid=1199659425268; sdid=sdid; guid=0123456789abcdef0123456789abcdef; " "udb_guiddata=guiddata; udb_deviceid=w_1234567890123456789; game_did=game; " "_qimei_uuid42=qimei; udb_anobiztoken=anobiz; __yamid_new=yamid" ) assert HuyaBatchRunnerCore._web_wss_cookie_missing(cookie) == () assert HuyaBatchRunnerCore._has_web_wss_cookie(cookie) def test_script_only_fields_do_not_block_wss(): """guid/_qimei_uuid42/__yamid_new/game_did 无服务端签发时不再阻断 WSS。""" cookie = ( "udb_cred=cred; udb_biztoken=biz; udb_uid=1199659425268; " "yyuid=1199659425268; sdid=sdid; " "udb_deviceid=w_1234567890123456789; udb_guiddata=guiddata; " "udb_anobiztoken=anobiz" ) assert HuyaBatchRunnerCore._web_wss_cookie_missing(cookie) == () assert HuyaBatchRunnerCore._has_web_wss_cookie(cookie) def test_login_only_cookie_falls_back_to_http_channel(): """缺网页设备态不再抛 COOKIE_INCOMPLETE,改用 HTTP cdnws 客户端。""" runner = _runner() activity = runner._activity_client(1199659425268, LOGIN_ONLY_COOKIE) shop = runner._shop_client(1199659425268, LOGIN_ONLY_COOKIE) assert isinstance(activity, HuyaHttpClient) assert isinstance(shop, HuyaHttpClient) # HTTP 客户端具备任务侧需要的同名方法(含新增的积分中心 RPC) for method in ( "check_user_bind_game_account", "get_act_task_detail", "query_user_score", "get_goods_info", "get_supplier_info", "accept_hy_protocol", "calc_order_promotion", "create_order", "pay_order_submit", ): assert callable(getattr(activity, method)), method def test_complete_cookie_keeps_using_wss(monkeypatch): opened: list[str] = [] def fake_open(self, uid: int, cookie: str, kind: str): opened.append(kind) return f"wss-{kind}" monkeypatch.setattr(HuyaBatchRunnerCore, "_open_wss_session", fake_open) runner = _runner() assert runner._activity_client(1199659425268, COMPLETE_COOKIE) == "wss-activity" assert runner._shop_client(1199659425268, COMPLETE_COOKIE) == "wss-shop" assert opened == ["activity", "shop"]