优化登录重试与配置清理

This commit is contained in:
yml2213
2026-06-24 10:20:33 +08:00
parent 72248eb3cc
commit 0d03b2c242
19 changed files with 136 additions and 273 deletions
+16 -14
View File
@@ -24,21 +24,25 @@ def _fmt_dt(dt) -> str | None:
router = APIRouter(prefix="/api/cookies", tags=["Cookie管理"])
def _visible_cookie_tasks_query(db: Session, current: User):
"""返回当前用户可见的成功 Cookie 任务查询。"""
query = db.query(LoginTask).filter(LoginTask.status == "success")
# 无全量登录任务权限时,只能操作分配给自己的账号 Cookie。
if not user_has_permission(current, "login:view_all"):
query = query.join(Account, LoginTask.account_id == Account.id).filter(
Account.assigned_to == current.id
)
return query
@router.get("")
def list_cookies(
db: Session = Depends(get_db),
current: User = Depends(get_current_user),
):
"""查看登录成功的 Cookie 列表。"""
query = db.query(LoginTask).filter(LoginTask.status == "success")
# 客服只能看自己账号的
if not user_has_permission(current, "login:view_all"):
query = query.join(Account, LoginTask.account_id == Account.id).filter(
Account.assigned_to == current.id
)
tasks = query.order_by(LoginTask.finished_at.desc()).all()
tasks = _visible_cookie_tasks_query(db, current).order_by(LoginTask.finished_at.desc()).all()
# 批量查账号,避免 N+1 查询
account_ids = [t.account_id for t in tasks]
@@ -81,9 +85,7 @@ def export_cookies(
csv: 账号, Cookie, 时间
custom: 账号----密码----ck
"""
tasks = db.query(LoginTask).filter(
LoginTask.status == "success"
).order_by(LoginTask.finished_at.desc()).all()
tasks = _visible_cookie_tasks_query(db, current).order_by(LoginTask.finished_at.desc()).all()
# 批量查账号,避免 N+1
account_ids = [t.account_id for t in tasks]
@@ -136,7 +138,7 @@ def delete_cookies_batch(
ids = [int(x) for x in task_ids.split(",") if x.strip().isdigit()]
if not ids:
raise HTTPException(status_code=400, detail="无效的ID")
tasks = db.query(LoginTask).filter(LoginTask.id.in_(ids)).all()
tasks = _visible_cookie_tasks_query(db, current).filter(LoginTask.id.in_(ids)).all()
for t in tasks:
t.cookie = ""
t.status = "failed"
@@ -152,7 +154,7 @@ def delete_cookie(
current: User = Depends(require_permission("cookie:export")),
):
"""删除一条 Cookie 记录。"""
task = db.query(LoginTask).filter(LoginTask.id == task_id).first()
task = _visible_cookie_tasks_query(db, current).filter(LoginTask.id == task_id).first()
if not task:
raise HTTPException(status_code=404, detail="记录不存在")
task.cookie = ""
-1
View File
@@ -54,7 +54,6 @@ async def create_batch(
account_ids=valid_ids,
created_by=current.id,
creator_permissions=get_user_permissions(current),
max_geetest_retries=req.max_geetest_retries,
max_proxy_retries=req.max_proxy_retries,
max_login_retries=req.max_login_retries,
max_total_time=req.max_total_time,
+2 -3
View File
@@ -124,10 +124,9 @@ class AccountOut(BaseModel):
# ---- 登录任务 ----
class LoginBatchRequest(BaseModel):
account_ids: list[int]
max_geetest_retries: int = 5
max_proxy_retries: int = 0 # 代理切换次数,0=无限切换直到成功
max_login_retries: int = 3 # 登录整体重试次数(换代理从头重跑)
max_total_time: float = 300 # 单账号登录总时长上限(秒),超时则放弃
max_login_retries: int = 0 # 登录整体重试次数0=无限重试直到成功
max_total_time: float = 0 # 单账号登录总时长上限0=不限制
concurrency: int = 3 # 并发数,1-10
+2 -5
View File
@@ -28,10 +28,9 @@ class LoginBatchRunner:
account_ids: list[int],
created_by: int,
creator_permissions: list[str],
max_geetest_retries: int = 5,
max_proxy_retries: int = 0,
max_login_retries: int = 3,
max_total_time: float = 300,
max_login_retries: int = 0,
max_total_time: float = 0,
proxy_config: Optional[ProxyConfigModel] = None,
log_queue: Optional[asyncio.Queue] = None,
loop: Optional[asyncio.AbstractEventLoop] = None,
@@ -41,7 +40,6 @@ class LoginBatchRunner:
self.account_ids = account_ids
self.created_by = created_by
self.creator_permissions = creator_permissions
self.max_geetest_retries = max_geetest_retries
self.max_proxy_retries = max_proxy_retries
self.max_login_retries = max_login_retries
self.max_total_time = max_total_time
@@ -200,7 +198,6 @@ class LoginBatchRunner:
loginer = DouyuLogin(
account,
proxy=proxy_dict,
max_geetest_retries=self.max_geetest_retries,
max_proxy_retries=self.max_proxy_retries,
max_login_retries=self.max_login_retries,
max_total_time=self.max_total_time,