forked from carrydela/autoClaude
feat: Implement proxy pool management and integrate it into the bot.
This commit is contained in:
83
bot.py
83
bot.py
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user