type: 收敛测试 schemas 与协议层类型
This commit is contained in:
@@ -5,6 +5,7 @@ from __future__ import annotations
|
||||
import uuid
|
||||
from datetime import datetime, timezone
|
||||
|
||||
from sqlalchemy import select
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from core.douyu.activity_client import DouyuActivityClient
|
||||
@@ -13,7 +14,8 @@ from core.douyu.cookie_utils import cookie_value
|
||||
from ..models import Account, DouyuConfig, DouyuTask, LoginTask
|
||||
|
||||
|
||||
SUPPORTED_DOUYU_TASK_TYPES = { "get_bind_qr": "获取绑定二维码",
|
||||
SUPPORTED_DOUYU_TASK_TYPES = {
|
||||
"get_bind_qr": "获取绑定二维码",
|
||||
"confirm_bind": "确认绑定",
|
||||
"create_elite_qr": "开通精英宝典30",
|
||||
"prepare_esports_bind": "绑定电竞手册角色",
|
||||
@@ -53,26 +55,55 @@ SUPPORTED_DOUYU_TASK_TYPES = { "get_bind_qr": "获取绑定二维码",
|
||||
DOUYU_HANDBOOK_SCOPES = {"elite", "esports", "peace"}
|
||||
DOUYU_HANDBOOK_TASK_TYPES = {
|
||||
"elite": {
|
||||
"get_bind_qr", "confirm_bind", "create_elite_qr", "create_gold_qr", "donate_elite_gift",
|
||||
"query_points", "lock_goods", "pay_locked_order", "exchange_goods", "query_game_name", "query_change_bind_time",
|
||||
"query_limited_goods", "query_gold_balance", "refresh_goods", "query_exchange_records",
|
||||
"get_bind_qr",
|
||||
"confirm_bind",
|
||||
"create_elite_qr",
|
||||
"create_gold_qr",
|
||||
"donate_elite_gift",
|
||||
"query_points",
|
||||
"lock_goods",
|
||||
"pay_locked_order",
|
||||
"exchange_goods",
|
||||
"query_game_name",
|
||||
"query_change_bind_time",
|
||||
"query_limited_goods",
|
||||
"query_gold_balance",
|
||||
"refresh_goods",
|
||||
"query_exchange_records",
|
||||
"prefetch_csrf_token",
|
||||
},
|
||||
"esports": {
|
||||
"prepare_esports_bind", "get_esports_bind_qr", "query_esports_game_name", "confirm_esports_bind",
|
||||
"create_esports_qr", "query_esports_points", "query_gold_balance", "query_change_bind_time",
|
||||
"query_limited_goods", "refresh_esports_goods", "exchange_esports_goods", "create_gold_qr",
|
||||
"donate_esports_chicken_gift", "donate_esports_firework_gift",
|
||||
"prepare_esports_bind",
|
||||
"get_esports_bind_qr",
|
||||
"query_esports_game_name",
|
||||
"confirm_esports_bind",
|
||||
"create_esports_qr",
|
||||
"query_esports_points",
|
||||
"query_gold_balance",
|
||||
"query_change_bind_time",
|
||||
"query_limited_goods",
|
||||
"refresh_esports_goods",
|
||||
"exchange_esports_goods",
|
||||
"create_gold_qr",
|
||||
"donate_esports_chicken_gift",
|
||||
"donate_esports_firework_gift",
|
||||
},
|
||||
"peace": {
|
||||
"get_xpd_bind_qr", "query_xpd_bind_info", "confirm_xpd_bind", "query_xpd_role",
|
||||
"refresh_xpd_goods", "query_xpd_balance", "query_xpd_fragments",
|
||||
"query_xpd_purchase_records", "exchange_xpd_goods",
|
||||
"get_xpd_bind_qr",
|
||||
"query_xpd_bind_info",
|
||||
"confirm_xpd_bind",
|
||||
"query_xpd_role",
|
||||
"refresh_xpd_goods",
|
||||
"query_xpd_balance",
|
||||
"query_xpd_fragments",
|
||||
"query_xpd_purchase_records",
|
||||
"exchange_xpd_goods",
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
DOUYU_CONFIG_DEFAULTS = { "manual_id": "G4KA4Qnz4LDp7",
|
||||
DOUYU_CONFIG_DEFAULTS = {
|
||||
"manual_id": "G4KA4Qnz4LDp7",
|
||||
"rid": "9263298",
|
||||
"bind_act_alias": "20260120QYOOB",
|
||||
"confirm_act_alias": "20260120QYOOB",
|
||||
@@ -117,12 +148,18 @@ def apply_douyu_config_defaults(config: DouyuConfig) -> bool:
|
||||
"""补齐斗鱼配置默认值,返回是否发生变更。"""
|
||||
changed = False
|
||||
for field in DOUYU_CONFIG_FIELDS:
|
||||
if field == "bind_act_alias" and str(getattr(config, field, "") or "").strip() == "20250213NQCYX":
|
||||
if (
|
||||
field == "bind_act_alias"
|
||||
and str(getattr(config, field, "") or "").strip() == "20250213NQCYX"
|
||||
):
|
||||
setattr(config, field, DOUYU_CONFIG_DEFAULTS[field])
|
||||
changed = True
|
||||
continue
|
||||
normalized = douyu_config_value(field, getattr(config, field, None))
|
||||
if field == "gold_recharge_channel" and normalized not in {"wechat_qr", "supplier_api"}:
|
||||
if field == "gold_recharge_channel" and normalized not in {
|
||||
"wechat_qr",
|
||||
"supplier_api",
|
||||
}:
|
||||
normalized = DOUYU_CONFIG_DEFAULTS[field]
|
||||
if getattr(config, field, None) != normalized:
|
||||
setattr(config, field, normalized)
|
||||
@@ -178,7 +215,11 @@ def visible_douyu_task_accounts(db: Session, account_ids: list[int]) -> list[Acc
|
||||
"""只保留存在成功 Cookie 的斗鱼账号。"""
|
||||
if not account_ids:
|
||||
return []
|
||||
cookie_ids = cookie_account_ids_query(db).subquery()
|
||||
cookie_ids = select(LoginTask.account_id).where(
|
||||
LoginTask.status == "success",
|
||||
LoginTask.cookie != "",
|
||||
LoginTask.cookie.isnot(None),
|
||||
)
|
||||
return (
|
||||
db.query(Account)
|
||||
.filter(Account.id.in_(account_ids), Account.id.in_(cookie_ids))
|
||||
@@ -217,23 +258,28 @@ def create_douyu_planned_tasks(
|
||||
raise ValueError("该任务不属于当前工作台")
|
||||
|
||||
accounts = visible_douyu_task_accounts(db, account_ids)
|
||||
if task_type in {"refresh_goods", "refresh_esports_goods", "refresh_xpd_goods"} and accounts:
|
||||
if (
|
||||
task_type in {"refresh_goods", "refresh_esports_goods", "refresh_xpd_goods"}
|
||||
and accounts
|
||||
):
|
||||
# 商品快照是全局数据,一个可用 CK 足够;没有 CK 时前端无法选账号创建任务。
|
||||
accounts = accounts[:1]
|
||||
|
||||
batch_id = uuid.uuid4().hex[:12]
|
||||
payload = payload or {}
|
||||
for account in accounts:
|
||||
db.add(DouyuTask(
|
||||
batch_id=batch_id,
|
||||
account_id=account.id,
|
||||
task_type=task_type,
|
||||
handbook_scope=handbook_scope,
|
||||
status="planned",
|
||||
message="任务已创建,等待执行",
|
||||
result={"payload": payload} if payload else None,
|
||||
created_by=created_by,
|
||||
))
|
||||
db.add(
|
||||
DouyuTask(
|
||||
batch_id=batch_id,
|
||||
account_id=account.id,
|
||||
task_type=task_type,
|
||||
handbook_scope=handbook_scope,
|
||||
status="planned",
|
||||
message="任务已创建,等待执行",
|
||||
result={"payload": payload} if payload else None,
|
||||
created_by=created_by,
|
||||
)
|
||||
)
|
||||
db.commit()
|
||||
return batch_id, len(accounts)
|
||||
|
||||
@@ -272,7 +318,17 @@ def slim_douyu_goods(goods: object) -> object:
|
||||
return {
|
||||
key: value
|
||||
for key, value in goods.items()
|
||||
if key in {"commodityId", "commodity_id", "commodityName", "name", "webPic", "pic", "score", "status"}
|
||||
if key
|
||||
in {
|
||||
"commodityId",
|
||||
"commodity_id",
|
||||
"commodityName",
|
||||
"name",
|
||||
"webPic",
|
||||
"pic",
|
||||
"score",
|
||||
"status",
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -284,11 +340,13 @@ def slim_douyu_limited_goods(goods: object) -> list[dict[str, object]]:
|
||||
for item in goods[:5]:
|
||||
if not isinstance(item, dict):
|
||||
continue
|
||||
result.append({
|
||||
key: value
|
||||
for key, value in item.items()
|
||||
if key in {"commodityId", "commodity_id", "commodityName", "name"}
|
||||
})
|
||||
result.append(
|
||||
{
|
||||
key: value
|
||||
for key, value in item.items()
|
||||
if key in {"commodityId", "commodity_id", "commodityName", "name"}
|
||||
}
|
||||
)
|
||||
return result
|
||||
|
||||
|
||||
@@ -305,7 +363,9 @@ def strip_douyu_raw_snapshots(value: object) -> object:
|
||||
return value
|
||||
|
||||
|
||||
def sanitize_douyu_task_result(result: dict | None, task_type: str, *, include_detail: bool = False) -> dict | None:
|
||||
def sanitize_douyu_task_result(
|
||||
result: dict | None, task_type: str, *, include_detail: bool = False
|
||||
) -> dict | None:
|
||||
"""列表/实时推送接口剥离原始快照与大数组;详情接口保留完整 result。"""
|
||||
if not isinstance(result, dict):
|
||||
return result
|
||||
@@ -346,7 +406,12 @@ def sanitize_douyu_task_result(result: dict | None, task_type: str, *, include_d
|
||||
if "limited_goods" in data:
|
||||
data["limited_goods"] = slim_douyu_limited_goods(data.get("limited_goods"))
|
||||
|
||||
if task_type not in {"get_bind_qr", "prepare_esports_bind", "get_esports_bind_qr", "get_xpd_bind_qr"}:
|
||||
if task_type not in {
|
||||
"get_bind_qr",
|
||||
"prepare_esports_bind",
|
||||
"get_esports_bind_qr",
|
||||
"get_xpd_bind_qr",
|
||||
}:
|
||||
data.pop("url", None)
|
||||
if task_type not in {"create_elite_qr", "create_esports_qr", "create_gold_qr"}:
|
||||
data.pop("pay_url", None)
|
||||
|
||||
Reference in New Issue
Block a user