执行 Ruff 安全自动修复

This commit is contained in:
yml2213
2026-08-31 10:28:14 +08:00
parent 2a1d27f953
commit b58c6b4357
145 changed files with 940 additions and 993 deletions
+2 -2
View File
@@ -10,7 +10,8 @@ from sqlalchemy.orm import Session
from ..database import get_db
from ..deps import get_current_user
from ..models import ProxyConfig as ProxyConfigModel, User
from ..models import ProxyConfig as ProxyConfigModel
from ..models import User
from ..permissions import user_has_permission
from ..schemas import AccountCheckBatchOut, AccountCheckBatchRequest
from ..services.account_check_service import (
@@ -18,7 +19,6 @@ from ..services.account_check_service import (
parse_account_check_lines,
)
router = APIRouter(prefix="/api/account-check", tags=["账号检测"])
+6 -6
View File
@@ -5,25 +5,25 @@ from sqlalchemy import func, or_, select
from sqlalchemy.orm import Session, defer, joinedload
from ..database import get_db
from ..deps import get_current_user, require_permission
from ..models import (
User,
Account,
AuditLog,
LoginTask,
DouyuTask,
DouyuWorkbenchAccount,
LoginTask,
User,
)
from ..permissions import user_has_permission
from ..schemas import (
AccountAssign,
AccountBulkSelection,
AccountBulkTag,
AccountImport,
AccountAssign,
AccountTag,
AccountOut,
AccountTag,
BatchAssign,
)
from ..deps import get_current_user, require_permission
from ..permissions import user_has_permission
from ..services.account_service import (
cookie_account_ids_query,
parse_and_build_accounts,
-1
View File
@@ -12,7 +12,6 @@ from ..database import get_db
from ..deps import get_current_user
from ..models import Account, AuditLog, DouyuTask, User
router = APIRouter(prefix="/api/audit-logs", tags=["审计日志"])
+5 -5
View File
@@ -1,16 +1,16 @@
"""认证路由"""
import os
from datetime import datetime
from fastapi import APIRouter, Depends, HTTPException, Response
from sqlalchemy.orm import Session
from ..database import get_db
from ..models import User, AuditLog
from ..security import verify_password, create_access_token, ACCESS_TOKEN_EXPIRE_HOURS
from ..permissions import get_user_permissions, ROLE_LABELS
from ..schemas import LoginRequest, TokenResponse
from ..deps import get_current_user
from ..models import AuditLog, User
from ..permissions import ROLE_LABELS, get_user_permissions
from ..schemas import LoginRequest, TokenResponse
from ..security import ACCESS_TOKEN_EXPIRE_HOURS, create_access_token, verify_password
router = APIRouter(prefix="/api/auth", tags=["认证"])
+13 -11
View File
@@ -1,22 +1,24 @@
"""Cookie 管理路由"""
import csv
import io
import threading
from concurrent.futures import ThreadPoolExecutor, as_completed
from datetime import datetime, timezone
from datetime import UTC, datetime
from fastapi import APIRouter, Depends, HTTPException, Query
from fastapi.responses import StreamingResponse
from sqlalchemy import case, func, or_
from sqlalchemy.orm import Session, defer, joinedload
import io
import csv
from ..database import get_db, SessionLocal
from ..models import User, LoginTask, Account, AuditLog, ProxyConfig as ProxyConfigModel
from ..database import SessionLocal, get_db
from ..deps import get_current_user, require_permission
from ..permissions import user_has_permission, get_user_permissions
from ..models import Account, AuditLog, LoginTask, User
from ..models import ProxyConfig as ProxyConfigModel
from ..permissions import get_user_permissions, user_has_permission
from ..schemas import CookieReloginRequest
from ..services.login_service import BatchRegistry, LoginBatchRunner, get_relogin_limits
from ..services.cookie_check_service import check_douyu_cookie
from ..services.login_service import BatchRegistry, LoginBatchRunner, get_relogin_limits
def _fmt_dt(dt) -> str | None:
@@ -24,7 +26,7 @@ def _fmt_dt(dt) -> str | None:
if dt is None:
return None
if dt.tzinfo is None:
dt = dt.replace(tzinfo=timezone.utc)
dt = dt.replace(tzinfo=UTC)
return dt.isoformat()
@@ -491,7 +493,7 @@ def _check_cookies(ids: str, db: Session, current: User, *, detailed: bool) -> d
"fish_ball": None,
"nickname": None,
"level": None,
"checked_at": datetime.now(timezone.utc).isoformat(),
"checked_at": datetime.now(UTC).isoformat(),
}
)
results.sort(key=lambda item: item["id"])
@@ -509,7 +511,7 @@ def _check_cookies(ids: str, db: Session, current: User, *, detailed: bool) -> d
"level": item.get("level"),
"message": item.get("message", ""),
}
task.ck_checked_at = datetime.now(timezone.utc)
task.ck_checked_at = datetime.now(UTC)
db.add(
AuditLog(
user_id=current.id,
@@ -571,7 +573,7 @@ def _start_relogin_tasks(
if not acc.password or not acc.email:
task.status = "relogin_failed"
task.message = "重新登录失败: 账号缺少密码或邮箱,旧 Cookie 已保留"
task.finished_at = datetime.now(timezone.utc)
task.finished_at = datetime.now(UTC)
skipped.append(task.id)
continue
if task.status in {"relogin_pending", "relogin_running"}:
-1
View File
@@ -17,7 +17,6 @@ from ..models import (
)
from ..permissions import user_has_permission
router = APIRouter(prefix="/api/dashboard", tags=["首页概览"])
+15 -16
View File
@@ -4,7 +4,7 @@ from __future__ import annotations
import asyncio
import threading
from datetime import datetime, timezone
from datetime import UTC, datetime
from typing import Any, cast
from fastapi import (
@@ -18,7 +18,13 @@ from fastapi import (
)
from loguru import logger
from sqlalchemy import func, or_, select
from sqlalchemy.orm import Session, joinedload, load_only
from sqlalchemy.orm import Session, joinedload
from core.douyu import (
FishFinRechargeClient,
FishFinRechargeConfig,
FishFinRechargeConfigError,
)
from ..database import SessionLocal, get_db
from ..deps import authenticate_websocket, get_current_user, require_permission
@@ -45,26 +51,19 @@ from ..schemas import (
DouyuWorkbenchAccountsUpdate,
DouyuXpdGoodsOut,
)
from ..services.douyu_runner import DouyuBatchRunner, douyu_batch_registry
from ..services.audit_service import record_audit
from ..services.douyu_runner import DouyuBatchRunner, douyu_batch_registry
from ..services.douyu_service import (
DOUYU_CONFIG_FIELDS,
DOUYU_HANDBOOK_TASK_TYPES,
SUPPORTED_DOUYU_TASK_TYPES,
apply_douyu_config_defaults,
cleanup_orphan_douyu_tasks,
cookie_account_ids_query,
create_douyu_planned_tasks,
douyu_config_value,
douyu_task_payload,
ensure_douyu_config,
)
from core.douyu import (
FishFinRechargeClient,
FishFinRechargeConfig,
FishFinRechargeConfigError,
)
router = APIRouter(prefix="/api/douyu", tags=["斗鱼活动"])
@@ -132,10 +131,10 @@ async def supplier_recharge_callback(request: Request, db: Session = Depends(get
if status == 2:
task.status = "success"
task.message = "供应商直充成功(异步通知)"
task.finished_at = datetime.now(timezone.utc)
task.finished_at = datetime.now(UTC)
if task.account:
task.account.bind_status = "gold_recharged"
task.account.updated_at = datetime.now(timezone.utc)
task.account.updated_at = datetime.now(UTC)
elif status in {3, 4}:
reason = str(
_supplier_response_value(payload, "fail_reason", "message", "msg")
@@ -143,7 +142,7 @@ async def supplier_recharge_callback(request: Request, db: Session = Depends(get
)
task.status = "failed"
task.message = reason[:512]
task.finished_at = datetime.now(timezone.utc)
task.finished_at = datetime.now(UTC)
else:
task.status = "running"
task.message = (
@@ -466,7 +465,7 @@ def update_workbench_accounts(
if workbench is None:
db.add(DouyuWorkbench(user_id=current.id, handbook_scope=req.handbook_scope))
else:
workbench.updated_at = datetime.now(timezone.utc)
workbench.updated_at = datetime.now(UTC)
db.query(DouyuWorkbenchAccount).filter(
DouyuWorkbenchAccount.user_id == current.id,
DouyuWorkbenchAccount.handbook_scope == req.handbook_scope,
@@ -525,7 +524,7 @@ def update_config(
setattr(config, field, value.strip() if isinstance(value, str) else value)
changed_fields.append(field)
apply_douyu_config_defaults(config)
config.updated_at = datetime.now(timezone.utc)
config.updated_at = datetime.now(UTC)
recharge_fields = [field for field in changed_fields if field.startswith("gold_")]
if recharge_fields:
record_audit(
@@ -853,7 +852,7 @@ async def ws_douyu_logs(websocket: WebSocket, batch_id: str):
if msg.get("level") == "result":
await asyncio.sleep(0.1)
break
except asyncio.TimeoutError:
except TimeoutError:
await websocket.send_json({"level": "heartbeat", "message": ""})
except WebSocketDisconnect:
pass
+23 -25
View File
@@ -3,14 +3,11 @@
import asyncio
import csv
import io
import json
import shutil
import threading
from datetime import datetime, timezone
from datetime import UTC, datetime
from typing import cast
from pathlib import Path
from fastapi import (
APIRouter,
Depends,
@@ -37,6 +34,8 @@ from core.huya.cookie_utils import normalize_huya_cookie
from core.huya.device_fingerprint import account_state_dir as _fp_state_dir
from core.huya.device_profile import (
_load_db as _load_profile_db,
)
from core.huya.device_profile import (
_save_db as _save_profile_db,
)
from core.sms_provider import parse_sms_lines
@@ -62,6 +61,7 @@ from ..schemas import (
AccountTag,
BatchAssign,
HuyaAccountOut,
HuyaAppPasswordLoginRequest,
HuyaAutoRegisterBatchOut,
HuyaAutoRegisterRequest,
HuyaAutoRegisterRetryRequest,
@@ -72,7 +72,6 @@ from ..schemas import (
HuyaGoodsOut,
HuyaPasswordAccountImport,
HuyaPasswordLoginRequest,
HuyaAppPasswordLoginRequest,
HuyaPasswordLoginSelectedRequest,
HuyaRechargeGoodsOut,
HuyaRegisterSuccessLogOut,
@@ -81,6 +80,13 @@ from ..schemas import (
HuyaTaskBatchRequest,
HuyaTaskOut,
)
from ..services.audit_service import record_audit
from ..services.huya_register_runner import (
export_success_logs_text,
huya_register_registry,
list_success_logs,
)
from ..services.huya_runner import HuyaBatchRunner, huya_batch_registry
from ..services.huya_service import (
HUYA_CONFIG_FIELDS,
SUPPORTED_TASK_TYPES,
@@ -94,14 +100,6 @@ from ..services.huya_service import (
save_huya_login_cookie_to_account,
upsert_huya_cookie,
)
from ..services.huya_runner import HuyaBatchRunner, huya_batch_registry
from ..services.audit_service import record_audit
from ..services.huya_register_runner import (
export_success_logs_text,
huya_register_registry,
list_success_logs,
)
router = APIRouter(prefix="/api/huya", tags=["虎牙"])
@@ -760,7 +758,7 @@ def sms_login_account(
phone = (req.phone or "").strip()
if phone:
account.game_phone = phone
account.updated_at = datetime.now(timezone.utc)
account.updated_at = datetime.now(UTC)
db.commit()
db.refresh(account)
except ValueError as exc:
@@ -1011,7 +1009,7 @@ def password_login_selected_accounts(
)
if not result.success or not result.cookie:
account.status = "login_failed"
account.updated_at = datetime.now(timezone.utc)
account.updated_at = datetime.now(UTC)
db.commit()
failed_count += 1
results.append(
@@ -1051,7 +1049,7 @@ def password_login_selected_accounts(
)
except HuyaCredentialError as exc:
account.status = "login_failed"
account.updated_at = datetime.now(timezone.utc)
account.updated_at = datetime.now(UTC)
db.commit()
failed_count += 1
results.append(
@@ -1065,7 +1063,7 @@ def password_login_selected_accounts(
)
except (HuyaLoginError, ValueError) as exc:
account.status = "login_failed"
account.updated_at = datetime.now(timezone.utc)
account.updated_at = datetime.now(UTC)
db.commit()
failed_count += 1
results.append(
@@ -1079,7 +1077,7 @@ def password_login_selected_accounts(
)
except Exception as exc:
account.status = "login_failed"
account.updated_at = datetime.now(timezone.utc)
account.updated_at = datetime.now(UTC)
db.commit()
failed_count += 1
results.append(
@@ -1163,7 +1161,7 @@ def app_password_login_selected_accounts(
)
if not result.success or not result.cookie:
account.status = "login_failed"
account.updated_at = datetime.now(timezone.utc)
account.updated_at = datetime.now(UTC)
db.commit()
failed_count += 1
results.append(
@@ -1201,7 +1199,7 @@ def app_password_login_selected_accounts(
)
except HuyaAppQrAuthRequiredError as exc:
account.status = "login_failed"
account.updated_at = datetime.now(timezone.utc)
account.updated_at = datetime.now(UTC)
db.commit()
failed_count += 1
results.append(
@@ -1215,7 +1213,7 @@ def app_password_login_selected_accounts(
)
except HuyaCredentialError as exc:
account.status = "login_failed"
account.updated_at = datetime.now(timezone.utc)
account.updated_at = datetime.now(UTC)
db.commit()
failed_count += 1
results.append(
@@ -1229,7 +1227,7 @@ def app_password_login_selected_accounts(
)
except (HuyaAppLoginError, HuyaLoginError, ValueError) as exc:
account.status = "login_failed"
account.updated_at = datetime.now(timezone.utc)
account.updated_at = datetime.now(UTC)
db.commit()
failed_count += 1
results.append(
@@ -1243,7 +1241,7 @@ def app_password_login_selected_accounts(
)
except Exception as exc:
account.status = "login_failed"
account.updated_at = datetime.now(timezone.utc)
account.updated_at = datetime.now(UTC)
db.commit()
failed_count += 1
results.append(
@@ -1729,7 +1727,7 @@ def update_config(
setattr(config, field, value.strip())
changed_fields.append(field)
apply_huya_config_defaults(config)
config.updated_at = datetime.now(timezone.utc)
config.updated_at = datetime.now(UTC)
if changed_fields:
record_audit(
db,
@@ -1995,7 +1993,7 @@ async def ws_huya_logs(websocket: WebSocket, batch_id: str):
if msg.get("level") == "result":
await asyncio.sleep(0.1)
break
except asyncio.TimeoutError:
except TimeoutError:
await websocket.send_json({"level": "heartbeat", "message": ""})
except WebSocketDisconnect:
pass
+7 -6
View File
@@ -2,16 +2,17 @@
import asyncio
import threading
from datetime import datetime
from fastapi import APIRouter, Depends, HTTPException, WebSocket, WebSocketDisconnect
from sqlalchemy import func
from sqlalchemy.orm import Session, defer, load_only
from ..database import get_db, SessionLocal
from ..models import User, Account, LoginTask, ProxyConfig as ProxyConfigModel
from ..database import SessionLocal, get_db
from ..deps import authenticate_websocket, get_current_user, require_permission
from ..models import Account, LoginTask, User
from ..models import ProxyConfig as ProxyConfigModel
from ..permissions import get_user_permissions, user_has_permission
from ..schemas import LoginBatchRequest, LoginTaskOut
from ..deps import get_current_user, require_permission, authenticate_websocket
from ..permissions import user_has_permission, get_user_permissions
from ..services.login_service import LoginBatchRunner, batch_registry
router = APIRouter(prefix="/api/login", tags=["登录任务"])
@@ -259,7 +260,7 @@ async def ws_login_logs(websocket: WebSocket, batch_id: str):
if msg.get("level") == "result":
await asyncio.sleep(0.1)
break
except asyncio.TimeoutError:
except TimeoutError:
await websocket.send_json({"level": "heartbeat", "message": ""})
except WebSocketDisconnect:
pass
+10 -8
View File
@@ -2,20 +2,22 @@
import asyncio
import threading
from fastapi import APIRouter, Depends, WebSocket, WebSocketDisconnect
from sqlalchemy.orm import Session
from ..database import get_db
from ..models import User
from ..schemas import ProxyConfigOut, ProxyConfigUpdate, PlatformInfo, PlatformFieldDef
from ..deps import require_permission, authenticate_websocket
from ..services.proxy_service import proxy_service
from core.douyu.proxy_platforms import (
get_platform_names,
get_platform_labels,
get_credential_fields,
get_platform_labels,
get_platform_names,
)
from ..database import get_db
from ..deps import authenticate_websocket, require_permission
from ..models import User
from ..schemas import PlatformFieldDef, PlatformInfo, ProxyConfigOut, ProxyConfigUpdate
from ..services.proxy_service import proxy_service
router = APIRouter(prefix="/api/proxy", tags=["代理与白名单"])
@@ -97,7 +99,7 @@ async def ws_test_logs(websocket: WebSocket, test_id: str):
if msg.get("level") == "result":
await asyncio.sleep(0.1)
break
except asyncio.TimeoutError:
except TimeoutError:
await websocket.send_json({"level": "heartbeat", "message": ""})
except WebSocketDisconnect:
pass
+6 -6
View File
@@ -1,6 +1,6 @@
"""用户管理路由(超管)"""
from datetime import datetime, timezone
from datetime import UTC, datetime
from uuid import uuid4
from fastapi import APIRouter, Depends, HTTPException
@@ -8,11 +8,11 @@ from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import Session
from ..database import get_db
from ..models import Account, AuditLog, HuyaAccount, User
from ..security import hash_password
from ..permissions import PERMISSIONS, get_user_permissions
from ..schemas import UserCreate, UserRename, UserUpdate, UserInfo
from ..deps import require_permission
from ..models import Account, AuditLog, HuyaAccount, User
from ..permissions import PERMISSIONS, get_user_permissions
from ..schemas import UserCreate, UserInfo, UserRename, UserUpdate
from ..security import hash_password
router = APIRouter(prefix="/api/users", tags=["用户管理"])
@@ -221,7 +221,7 @@ def delete_user(
)
)
user.is_active = False
user.deleted_at = datetime.now(timezone.utc)
user.deleted_at = datetime.now(UTC)
user.deleted_username = deleted_username
# 释放用户名供新用户使用,同时不改变历史任务通过 user.id 保存的归属。
user.username = f"deleted-{user.id}-{uuid4().hex[:12]}"
+1 -2
View File
@@ -12,10 +12,9 @@ from ..deps import get_current_user, require_permission
from ..models import User, YybRechargeTask
from ..permissions import user_has_permission
from ..schemas import YybLoginRequest, YybSelectionRequest, YybTaskCreateRequest
from ..services.audit_service import record_audit
from ..services.yyb_service import _utcnow, public_task, sync_task
from ..services.yyb_worker_client import YybWorkerClient, YybWorkerError
from ..services.audit_service import record_audit
router = APIRouter(prefix="/api/yyb", tags=["应用宝充值"])