update
This commit is contained in:
172
s2a_service.py
172
s2a_service.py
@@ -507,6 +507,178 @@ def s2a_get_accounts(platform: str = "openai") -> List[Dict[str, Any]]:
|
||||
return []
|
||||
|
||||
|
||||
def s2a_get_error_accounts(
|
||||
platform: str = "",
|
||||
page_size: int = 100,
|
||||
timezone: str = "Asia/Shanghai"
|
||||
) -> Tuple[List[Dict[str, Any]], int]:
|
||||
"""获取所有错误状态的账号(支持分页获取全部)
|
||||
|
||||
Args:
|
||||
platform: 平台筛选 (默认为空,获取所有平台)
|
||||
page_size: 每页数量
|
||||
timezone: 时区
|
||||
|
||||
Returns:
|
||||
tuple: (账号列表, 总数)
|
||||
"""
|
||||
if not S2A_API_BASE or (not S2A_ADMIN_KEY and not S2A_ADMIN_TOKEN):
|
||||
return [], 0
|
||||
|
||||
headers = build_s2a_headers()
|
||||
all_accounts = []
|
||||
total_count = 0
|
||||
page = 1
|
||||
|
||||
try:
|
||||
while True:
|
||||
params = {
|
||||
"page": page,
|
||||
"page_size": page_size,
|
||||
"platform": platform,
|
||||
"type": "",
|
||||
"status": "error",
|
||||
"search": "",
|
||||
"timezone": timezone
|
||||
}
|
||||
|
||||
response = http_session.get(
|
||||
f"{S2A_API_BASE}/admin/accounts",
|
||||
headers=headers,
|
||||
params=params,
|
||||
timeout=REQUEST_TIMEOUT
|
||||
)
|
||||
|
||||
if response.status_code != 200:
|
||||
log.warning(f"S2A 获取错误账号失败: HTTP {response.status_code}")
|
||||
break
|
||||
|
||||
result = response.json()
|
||||
if result.get("code") != 0:
|
||||
log.warning(f"S2A 获取错误账号失败: {result.get('message', 'Unknown error')}")
|
||||
break
|
||||
|
||||
data = result.get("data", {})
|
||||
items = data.get("items", [])
|
||||
total_count = data.get("total", 0)
|
||||
total_pages = data.get("pages", 1)
|
||||
|
||||
all_accounts.extend(items)
|
||||
|
||||
# 如果已获取所有页面,退出循环
|
||||
if page >= total_pages or not items:
|
||||
break
|
||||
|
||||
page += 1
|
||||
|
||||
return all_accounts, total_count
|
||||
|
||||
except Exception as e:
|
||||
log.warning(f"S2A 获取错误账号异常: {e}")
|
||||
return [], 0
|
||||
|
||||
|
||||
def s2a_delete_account(account_id: int) -> Tuple[bool, str]:
|
||||
"""删除单个账号
|
||||
|
||||
Args:
|
||||
account_id: 账号 ID
|
||||
|
||||
Returns:
|
||||
tuple: (是否成功, 消息)
|
||||
"""
|
||||
if not S2A_API_BASE or (not S2A_ADMIN_KEY and not S2A_ADMIN_TOKEN):
|
||||
return False, "S2A not configured"
|
||||
|
||||
headers = build_s2a_headers()
|
||||
|
||||
try:
|
||||
response = http_session.delete(
|
||||
f"{S2A_API_BASE}/admin/accounts/{account_id}",
|
||||
headers=headers,
|
||||
timeout=REQUEST_TIMEOUT
|
||||
)
|
||||
|
||||
if response.status_code == 200:
|
||||
result = response.json()
|
||||
if result.get("code") == 0:
|
||||
return True, "Deleted"
|
||||
else:
|
||||
return False, result.get("message", "Unknown error")
|
||||
else:
|
||||
return False, f"HTTP {response.status_code}"
|
||||
|
||||
except Exception as e:
|
||||
return False, str(e)
|
||||
|
||||
|
||||
def s2a_batch_delete_error_accounts(
|
||||
progress_callback: Optional[callable] = None
|
||||
) -> Dict[str, Any]:
|
||||
"""批量删除所有错误状态的账号
|
||||
|
||||
Args:
|
||||
progress_callback: 进度回调函数 (current, total, account_name, success)
|
||||
|
||||
Returns:
|
||||
dict: {"success": int, "failed": int, "total": int, "details": [...]}
|
||||
"""
|
||||
results = {
|
||||
"success": 0,
|
||||
"failed": 0,
|
||||
"total": 0,
|
||||
"details": []
|
||||
}
|
||||
|
||||
# 获取所有错误账号
|
||||
error_accounts, total = s2a_get_error_accounts()
|
||||
results["total"] = total
|
||||
|
||||
if not error_accounts:
|
||||
return results
|
||||
|
||||
log.info(f"开始批量删除 {len(error_accounts)} 个错误账号...")
|
||||
|
||||
for i, account in enumerate(error_accounts):
|
||||
account_id = account.get("id")
|
||||
account_name = account.get("name", "")
|
||||
error_message = account.get("error_message", "")
|
||||
|
||||
if not account_id:
|
||||
results["failed"] += 1
|
||||
results["details"].append({
|
||||
"name": account_name,
|
||||
"status": "failed",
|
||||
"message": "Missing account ID"
|
||||
})
|
||||
continue
|
||||
|
||||
success, message = s2a_delete_account(account_id)
|
||||
|
||||
if success:
|
||||
results["success"] += 1
|
||||
results["details"].append({
|
||||
"id": account_id,
|
||||
"name": account_name,
|
||||
"error": error_message[:50] if error_message else "",
|
||||
"status": "deleted"
|
||||
})
|
||||
else:
|
||||
results["failed"] += 1
|
||||
results["details"].append({
|
||||
"id": account_id,
|
||||
"name": account_name,
|
||||
"status": "failed",
|
||||
"message": message
|
||||
})
|
||||
|
||||
if progress_callback:
|
||||
progress_callback(i + 1, len(error_accounts), account_name, success)
|
||||
|
||||
log.success(f"批量删除完成: 成功 {results['success']}, 失败 {results['failed']}")
|
||||
return results
|
||||
|
||||
|
||||
def s2a_check_account_exists(email: str, platform: str = "openai") -> bool:
|
||||
"""检查账号是否已存在"""
|
||||
accounts = s2a_get_accounts(platform)
|
||||
|
||||
Reference in New Issue
Block a user