type: 收窄测试与响应模型类型
This commit is contained in:
+41
-18
@@ -41,6 +41,11 @@ def _ensure_tz(dt: Optional[datetime]) -> Optional[datetime]:
|
||||
return dt
|
||||
|
||||
|
||||
def _isoformat(dt: Optional[datetime]) -> str | None:
|
||||
normalized = _ensure_tz(dt)
|
||||
return normalized.isoformat() if normalized is not None else None
|
||||
|
||||
|
||||
# ---- 认证 ----
|
||||
class LoginRequest(BaseModel):
|
||||
username: str
|
||||
@@ -75,7 +80,7 @@ class UserInfo(BaseModel):
|
||||
"role": self.role,
|
||||
"is_active": self.is_active,
|
||||
"remark": self.remark,
|
||||
"created_at": _ensure_tz(self.created_at).isoformat() if self.created_at else None,
|
||||
"created_at": _isoformat(self.created_at),
|
||||
"permissions": self.permissions,
|
||||
"custom_permissions": self.custom_permissions,
|
||||
}
|
||||
@@ -108,6 +113,7 @@ class AccountImport(BaseModel):
|
||||
tag 为本次导入的统一标签兜底:某行未单独写标签时使用该值,
|
||||
行内第5列标签优先。
|
||||
"""
|
||||
|
||||
text: str
|
||||
tag: str = ""
|
||||
|
||||
@@ -123,6 +129,7 @@ class BatchAssign(BaseModel):
|
||||
|
||||
class AccountBulkSelection(BaseModel):
|
||||
"""批量操作选择范围:显式 ID 或当前筛选条件下全部账号。"""
|
||||
|
||||
account_ids: list[int] = Field(default_factory=list)
|
||||
all_matching: bool = False
|
||||
search: str = ""
|
||||
@@ -167,7 +174,7 @@ class AccountOut(BaseModel):
|
||||
"assigned_to": self.assigned_to,
|
||||
"assigned_username": self.assigned_username,
|
||||
"remark": self.remark,
|
||||
"created_at": _ensure_tz(self.created_at).isoformat() if self.created_at else None,
|
||||
"created_at": _isoformat(self.created_at),
|
||||
}
|
||||
|
||||
|
||||
@@ -178,7 +185,9 @@ class LoginBatchRequest(BaseModel):
|
||||
max_total_time: float = 300 # 单账号登录总时长上限(秒),0=不限制
|
||||
concurrency: int = 3 # 并发数,1-10
|
||||
api_strategy: str = "wgapi" # 接口策略: wgapi(新版)或 iframe(旧版备选)
|
||||
mode: str = Field("login", pattern="^(login|check)$") # login=登录取CK,check=账号状态检测
|
||||
mode: str = Field(
|
||||
"login", pattern="^(login|check)$"
|
||||
) # login=登录取CK,check=账号状态检测
|
||||
|
||||
|
||||
class CookieReloginRequest(BaseModel):
|
||||
@@ -210,8 +219,8 @@ class LoginTaskOut(BaseModel):
|
||||
"cookie": self.cookie,
|
||||
"message": self.message,
|
||||
"created_by": self.created_by,
|
||||
"created_at": _ensure_tz(self.created_at).isoformat() if self.created_at else None,
|
||||
"finished_at": _ensure_tz(self.finished_at).isoformat() if self.finished_at else None,
|
||||
"created_at": _isoformat(self.created_at),
|
||||
"finished_at": _isoformat(self.finished_at),
|
||||
}
|
||||
|
||||
|
||||
@@ -256,12 +265,14 @@ class AccountCheckBatchOut(BaseModel):
|
||||
# ---- 虎牙 ----
|
||||
class HuyaCookieImport(BaseModel):
|
||||
"""批量导入虎牙 Cookie。支持纯 CK 或 账号----密码----CK。"""
|
||||
|
||||
text: str
|
||||
tag: str = ""
|
||||
|
||||
|
||||
class HuyaPasswordLoginRequest(BaseModel):
|
||||
"""虎牙账号 Web 密码登录并保存 Cookie(旧版)。"""
|
||||
|
||||
username: str = Field(..., min_length=1, max_length=128)
|
||||
password: str = Field(..., min_length=1, max_length=128)
|
||||
tag: str = ""
|
||||
@@ -270,6 +281,7 @@ class HuyaPasswordLoginRequest(BaseModel):
|
||||
|
||||
class HuyaAppPasswordLoginRequest(BaseModel):
|
||||
"""虎牙账号 App 协议密码登录并保存 Cookie(推荐)。"""
|
||||
|
||||
username: str = Field(..., min_length=1, max_length=128)
|
||||
password: str = Field(..., min_length=1, max_length=128)
|
||||
tag: str = ""
|
||||
@@ -278,12 +290,14 @@ class HuyaAppPasswordLoginRequest(BaseModel):
|
||||
|
||||
class HuyaSmsCodeRequest(BaseModel):
|
||||
"""发送虎牙短信验证码。"""
|
||||
|
||||
phone: str = Field(..., min_length=5, max_length=32)
|
||||
cookie: str = ""
|
||||
|
||||
|
||||
class HuyaSmsLoginRequest(BaseModel):
|
||||
"""提交虎牙短信验证码并保存 Cookie。"""
|
||||
|
||||
authcode: str = Field(..., min_length=4, max_length=8)
|
||||
state: str = Field(..., min_length=1)
|
||||
phone: str = ""
|
||||
@@ -292,6 +306,7 @@ class HuyaSmsLoginRequest(BaseModel):
|
||||
|
||||
class HuyaAutoRegisterRequest(BaseModel):
|
||||
"""虎牙自动注册批次。每行格式:手机号----短信查询URL。"""
|
||||
|
||||
text: str = Field(..., min_length=1)
|
||||
tag: str = ""
|
||||
concurrency: int = Field(1, ge=1, le=5)
|
||||
@@ -310,6 +325,7 @@ class HuyaAutoRegisterRetryRequest(BaseModel):
|
||||
- retry_failed: 只重试 error
|
||||
- all_unfinished: 失败+未完成都跑
|
||||
"""
|
||||
|
||||
mode: str = Field("continue", max_length=32)
|
||||
concurrency: Optional[int] = Field(None, ge=1, le=5)
|
||||
wait_seconds: Optional[float] = Field(None, ge=15, le=600)
|
||||
@@ -382,12 +398,14 @@ class HuyaRegisterSuccessLogOut(BaseModel):
|
||||
|
||||
class HuyaPasswordAccountImport(BaseModel):
|
||||
"""导入虎牙账号密码,稍后再选择登录。"""
|
||||
|
||||
text: str = Field(..., min_length=1)
|
||||
tag: str = ""
|
||||
|
||||
|
||||
class HuyaPasswordLoginSelectedRequest(BaseModel):
|
||||
"""选择已导入的虎牙账号执行密码登录。"""
|
||||
|
||||
account_ids: list[int] = Field(default_factory=list)
|
||||
all_matching: bool = False
|
||||
search: str = ""
|
||||
@@ -399,6 +417,7 @@ class HuyaPasswordLoginSelectedRequest(BaseModel):
|
||||
|
||||
class HuyaDeviceBindingsBatchDeleteRequest(BaseModel):
|
||||
"""批量解绑设备:删除账号画像与 hydevice 指纹状态。"""
|
||||
|
||||
accounts: list[str] = Field(..., min_length=1)
|
||||
|
||||
|
||||
@@ -447,8 +466,8 @@ class HuyaAccountOut(BaseModel):
|
||||
"game_phone": self.game_phone,
|
||||
"assigned_to": self.assigned_to,
|
||||
"assigned_username": self.assigned_username,
|
||||
"created_at": _ensure_tz(self.created_at).isoformat() if self.created_at else None,
|
||||
"updated_at": _ensure_tz(self.updated_at).isoformat() if self.updated_at else None,
|
||||
"created_at": _isoformat(self.created_at),
|
||||
"updated_at": _isoformat(self.updated_at),
|
||||
}
|
||||
|
||||
|
||||
@@ -468,7 +487,7 @@ class HuyaConfigOut(BaseModel):
|
||||
"outer_act_id": self.outer_act_id,
|
||||
"bind_act_id": self.bind_act_id,
|
||||
"pay_channel": self.pay_channel,
|
||||
"updated_at": _ensure_tz(self.updated_at).isoformat() if self.updated_at else None,
|
||||
"updated_at": _isoformat(self.updated_at),
|
||||
}
|
||||
|
||||
|
||||
@@ -516,8 +535,8 @@ class HuyaTaskOut(BaseModel):
|
||||
"message": self.message,
|
||||
"result": self.result,
|
||||
"created_by": self.created_by,
|
||||
"created_at": _ensure_tz(self.created_at).isoformat() if self.created_at else None,
|
||||
"finished_at": _ensure_tz(self.finished_at).isoformat() if self.finished_at else None,
|
||||
"created_at": _isoformat(self.created_at),
|
||||
"finished_at": _isoformat(self.finished_at),
|
||||
}
|
||||
|
||||
|
||||
@@ -541,7 +560,7 @@ class HuyaGoodsOut(BaseModel):
|
||||
"price": self.price,
|
||||
"remain_text": self.remain_text,
|
||||
"raw": self.raw,
|
||||
"updated_at": _ensure_tz(self.updated_at).isoformat() if self.updated_at else None,
|
||||
"updated_at": _isoformat(self.updated_at),
|
||||
}
|
||||
|
||||
|
||||
@@ -577,7 +596,7 @@ class HuyaRechargeGoodsOut(BaseModel):
|
||||
"task_id": self.task_id,
|
||||
"task_name": self.task_name,
|
||||
"raw": self.raw,
|
||||
"updated_at": _ensure_tz(self.updated_at).isoformat() if self.updated_at else None,
|
||||
"updated_at": _isoformat(self.updated_at),
|
||||
}
|
||||
|
||||
|
||||
@@ -634,7 +653,7 @@ class DouyuConfigOut(BaseModel):
|
||||
"gold_api_account_template_name": self.gold_api_account_template_name,
|
||||
"gift_id": self.gift_id,
|
||||
"skin_id": self.skin_id,
|
||||
"updated_at": _ensure_tz(self.updated_at).isoformat() if self.updated_at else None,
|
||||
"updated_at": _isoformat(self.updated_at),
|
||||
}
|
||||
|
||||
|
||||
@@ -657,7 +676,9 @@ class DouyuConfigUpdate(BaseModel):
|
||||
xpd_act_id: Optional[str] = None
|
||||
xpd_rid: Optional[str] = None
|
||||
gold_pay_type: Optional[int] = Field(None, ge=1, le=9)
|
||||
gold_recharge_channel: Optional[str] = Field(None, pattern="^(wechat_qr|supplier_api)$")
|
||||
gold_recharge_channel: Optional[str] = Field(
|
||||
None, pattern="^(wechat_qr|supplier_api)$"
|
||||
)
|
||||
gold_api_product_id: Optional[str] = Field(None, max_length=128)
|
||||
gold_api_account_template_name: Optional[str] = Field(None, max_length=64)
|
||||
gift_id: Optional[str] = None
|
||||
@@ -710,8 +731,8 @@ class DouyuTaskOut(BaseModel):
|
||||
"message": self.message,
|
||||
"result": self.result,
|
||||
"created_by": self.created_by,
|
||||
"created_at": _ensure_tz(self.created_at).isoformat() if self.created_at else None,
|
||||
"finished_at": _ensure_tz(self.finished_at).isoformat() if self.finished_at else None,
|
||||
"created_at": _isoformat(self.created_at),
|
||||
"finished_at": _isoformat(self.finished_at),
|
||||
}
|
||||
|
||||
|
||||
@@ -735,7 +756,7 @@ class DouyuGoodsOut(BaseModel):
|
||||
"score": self.score,
|
||||
"status": self.status,
|
||||
"raw": self.raw,
|
||||
"updated_at": _ensure_tz(self.updated_at).isoformat() if self.updated_at else None,
|
||||
"updated_at": _isoformat(self.updated_at),
|
||||
}
|
||||
|
||||
|
||||
@@ -794,7 +815,7 @@ class DouyuXpdGoodsOut(BaseModel):
|
||||
"category": self.category,
|
||||
"goods_left": self.goods_left,
|
||||
"raw": self.raw,
|
||||
"updated_at": _ensure_tz(self.updated_at).isoformat() if self.updated_at else None,
|
||||
"updated_at": _isoformat(self.updated_at),
|
||||
}
|
||||
|
||||
|
||||
@@ -828,6 +849,7 @@ class ProxyConfigUpdate(BaseModel):
|
||||
# ---- 代理平台元信息 ----
|
||||
class PlatformFieldDef(BaseModel):
|
||||
"""平台凭据字段定义。"""
|
||||
|
||||
key: str
|
||||
label: str
|
||||
placeholder: str = ""
|
||||
@@ -835,6 +857,7 @@ class PlatformFieldDef(BaseModel):
|
||||
|
||||
class PlatformInfo(BaseModel):
|
||||
"""平台元信息。"""
|
||||
|
||||
name: str
|
||||
label: str
|
||||
credential_fields: list[PlatformFieldDef]
|
||||
|
||||
Reference in New Issue
Block a user