fix(huya): 抽出通用绑定角色查询,修复外部单协作读到旧角色
This commit is contained in:
@@ -30,8 +30,10 @@ from loguru import logger
|
||||
from sqlalchemy import func, or_, tuple_
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from core.huya.http_client import query_bind_game_account
|
||||
|
||||
from ..huya_defaults import (
|
||||
HUYA_DEFAULT_BIND_ACT_ID,
|
||||
HUYA_DEFAULT_BIND_GID,
|
||||
HUYA_DEFAULT_OUTER_ACT_ID,
|
||||
HUYA_DEFAULT_SID,
|
||||
)
|
||||
@@ -1412,9 +1414,12 @@ def set_images(
|
||||
# CK 探针(S5,只读验证)
|
||||
# --------------------------------------------------------------------------
|
||||
|
||||
# 探针参数与 web/backend/huya_defaults.py 的默认活动一致(2026-10-16 真机实测)。
|
||||
PROBE_BIND_ACT_ID = int(HUYA_DEFAULT_BIND_ACT_ID)
|
||||
# 探针参数与 web/backend/huya_defaults.py 的默认活动一致(2026-11-09 真机实测)。
|
||||
# 新版活动页绑定走 gid=3203、bActId=0;最终角色由通用查询的第二路
|
||||
# (gid + outerActId=空)返回,这里只给出外层活动参数。
|
||||
PROBE_GID = int(HUYA_DEFAULT_BIND_GID)
|
||||
PROBE_OUTER_ACT_ID = HUYA_DEFAULT_OUTER_ACT_ID
|
||||
PROBE_SCENE = "undefined" # 与 runner 绑定协议保持一致
|
||||
PROBE_TIMEOUT_SECONDS = 15.0
|
||||
|
||||
# 探针独占的绑定快照列(每次验证**覆盖写入**,人工不编辑):
|
||||
@@ -1572,12 +1577,15 @@ def probe_ck(order: HuyaExternalOrder, *, client: Any | None = None) -> CkProbeR
|
||||
|
||||
try:
|
||||
probe_client = client or _build_probe_client()
|
||||
resp = probe_client.check_user_bind_game_account(
|
||||
resp, _detail = query_bind_game_account(
|
||||
probe_client,
|
||||
uid=uid,
|
||||
cookie=cookie,
|
||||
b_act_id=PROBE_BIND_ACT_ID,
|
||||
is_use_outer_act_id=1,
|
||||
b_act_id=0,
|
||||
gid=PROBE_GID,
|
||||
outer_act_id=PROBE_OUTER_ACT_ID,
|
||||
is_use_outer_act_id=0,
|
||||
scene=PROBE_SCENE,
|
||||
timeout=PROBE_TIMEOUT_SECONDS,
|
||||
)
|
||||
except Exception as exc: # noqa: BLE001 探针异常=验证不通过,不能让接口 500
|
||||
|
||||
@@ -8,6 +8,8 @@ from typing import TYPE_CHECKING, Any
|
||||
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from core.huya.http_client import query_bind_game_account
|
||||
|
||||
from ..huya_defaults import HUYA_DEFAULT_OUTER_ACT_ID
|
||||
from ..models import HuyaAccount, HuyaTask
|
||||
from .huya_runner_core import HUYA_RECHARGE_SOURCE_ID, HuyaBatchRunnerCore
|
||||
@@ -48,10 +50,6 @@ class BindMixin:
|
||||
account_data = bind_status.accountData
|
||||
return account_data.gameRole.roleName or ""
|
||||
|
||||
@staticmethod
|
||||
def _has_bind_role(bind_status) -> bool:
|
||||
return bool(bind_status and BindMixin._role_name(bind_status))
|
||||
|
||||
@staticmethod
|
||||
def _bind_role_result(bind_status) -> dict:
|
||||
account_data = bind_status.accountData
|
||||
@@ -149,56 +147,18 @@ class BindMixin:
|
||||
is_use_outer_act_id: int = 1,
|
||||
scene: str = "",
|
||||
):
|
||||
"""按活动页逻辑解析绑定状态,优先返回含角色的状态。"""
|
||||
probe_kwargs: dict[str, Any] = {
|
||||
"uid": uid,
|
||||
"cookie": cookie,
|
||||
"b_act_id": b_act_id_int,
|
||||
"gid": gid,
|
||||
"outer_act_id": outer_act_id,
|
||||
"is_use_outer_act_id": is_use_outer_act_id,
|
||||
"scene": scene,
|
||||
}
|
||||
if timeout is not None:
|
||||
probe_kwargs["timeout"] = timeout
|
||||
outer_status = client.check_user_bind_game_account(**probe_kwargs)
|
||||
if outer_status is None:
|
||||
return None, {}
|
||||
|
||||
query_result = {
|
||||
"bind_status_source": "outer",
|
||||
"outer_bind_status": outer_status.to_dict(),
|
||||
}
|
||||
if outer_status.status != 200:
|
||||
return outer_status, query_result
|
||||
|
||||
chosen_status = outer_status
|
||||
account_data = outer_status.accountData
|
||||
# 官方页面会同时查两路:gid + outerActId,以及 gid + outerActId=空。
|
||||
# 角色名通常由第二路返回;第二路必须保留 gid,不能传成 gid=0。
|
||||
should_check_inner = not self._has_bind_role(outer_status) and bool(
|
||||
account_data.isNeedActCheck
|
||||
or not account_data.isBindAcount
|
||||
or not account_data.isBindRole
|
||||
"""按活动页逻辑解析绑定状态(统一委托 core.huya.http_client 的通用查询)。"""
|
||||
return query_bind_game_account(
|
||||
client,
|
||||
uid=uid,
|
||||
cookie=cookie,
|
||||
b_act_id=b_act_id_int,
|
||||
gid=gid,
|
||||
outer_act_id=outer_act_id,
|
||||
is_use_outer_act_id=is_use_outer_act_id,
|
||||
scene=scene,
|
||||
timeout=timeout,
|
||||
)
|
||||
if should_check_inner:
|
||||
inner_status = client.check_user_bind_game_account(
|
||||
uid=uid,
|
||||
cookie=cookie,
|
||||
b_act_id=b_act_id_int,
|
||||
is_use_outer_act_id=0,
|
||||
gid=gid,
|
||||
outer_act_id="",
|
||||
scene=scene,
|
||||
)
|
||||
if inner_status is not None:
|
||||
query_result["inner_bind_status"] = inner_status.to_dict()
|
||||
if inner_status.status == 200 and self._has_bind_role(inner_status):
|
||||
chosen_status = inner_status
|
||||
query_result["bind_status_source"] = "inner"
|
||||
|
||||
query_result["bind_status"] = chosen_status.to_dict()
|
||||
return chosen_status, query_result
|
||||
|
||||
def _probe_bind_status(
|
||||
self,
|
||||
|
||||
Reference in New Issue
Block a user