feat: Implement proxy pool management and integrate it into the bot.

This commit is contained in:
2026-02-14 02:52:07 +08:00
parent 768963666a
commit a23b7e8d27
2 changed files with 95 additions and 31 deletions

83
bot.py
View File

@@ -660,35 +660,80 @@ async def cmd_verify(update: Update, context: ContextTypes.DEFAULT_TYPE):
from curl_cffi import requests as cffi_requests
from config import get_proxy
results = []
for i, acc in enumerate(accounts, 1):
sk = acc.get("session_key", "")
email = acc.get("email", "?")
if not sk:
results.append({"email": email, "ok": False, "reason": "SK 为空"})
continue
_VERIFY_URL = "https://claude.ai/api/organizations"
_MAX_RETRIES = 2 # 代理重试次数
def _do_verify_request(sk: str, proxies: dict, timeout: int = 15):
"""发送验证请求,返回 (status_code, error_str)"""
try:
resp = cffi_requests.get(
"https://claude.ai/api/organizations",
_VERIFY_URL,
headers={
"Cookie": f"sessionKey={sk}",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
},
impersonate="chrome124",
proxies=get_proxy(),
timeout=15,
proxies=proxies,
timeout=timeout,
)
if resp.status_code == 200:
results.append({"email": email, "ok": True, "reason": "有效"})
elif resp.status_code == 401:
results.append({"email": email, "ok": False, "reason": "已过期"})
elif resp.status_code == 403:
results.append({"email": email, "ok": False, "reason": "被封禁"})
else:
results.append({"email": email, "ok": False, "reason": f"HTTP {resp.status_code}"})
return resp.status_code, None
except Exception as e:
results.append({"email": email, "ok": False, "reason": str(e)[:50]})
return None, str(e)[:80]
results = []
total = len(accounts)
for i, acc in enumerate(accounts, 1):
sk = acc.get("session_key", "")
email = acc.get("email", "?")
# 更新进度
bar = _progress_bar(i - 1, total)
await _edit_or_send(
status_msg,
f"🔍 验证中... {bar}\n"
f"{email}",
)
if not sk:
results.append({"email": email, "ok": False, "reason": "SK 为空"})
continue
status_code = None
last_error = None
used_direct = False
# 阶段 1通过代理尝试最多 _MAX_RETRIES 次)
proxy = get_proxy()
if proxy:
for attempt in range(_MAX_RETRIES):
status_code, err = _do_verify_request(sk, proxy)
if status_code is not None:
break
last_error = err
logger.warning(f"验证重试 {attempt + 1}/{_MAX_RETRIES} ({email}): {err}")
time.sleep(1)
# 阶段 2代理全部失败 → 直连回退
if status_code is None:
logger.info(f"代理失败,直连回退验证: {email}")
status_code, err = _do_verify_request(sk, {}, timeout=20)
if status_code is None:
last_error = err
else:
used_direct = True
# 解析结果
if status_code is None:
results.append({"email": email, "ok": False, "reason": f"网络错误: {last_error}"})
elif status_code == 200:
suffix = " (直连)" if used_direct else ""
results.append({"email": email, "ok": True, "reason": f"有效{suffix}"})
elif status_code == 401:
results.append({"email": email, "ok": False, "reason": "已过期"})
elif status_code == 403:
results.append({"email": email, "ok": False, "reason": "被封禁"})
else:
results.append({"email": email, "ok": False, "reason": f"HTTP {status_code}"})
valid = sum(1 for r in results if r["ok"])
invalid = len(results) - valid