This commit is contained in:
2026-01-18 06:04:06 +08:00
parent f919e71de1
commit 94145f7dd0
2 changed files with 161 additions and 123 deletions

242
run.py
View File

@@ -364,139 +364,139 @@ def process_accounts(accounts: list, team_name: str, team_index: int = 0,
if is_team_owner_otp:
# 旧格式 Team Owner: 使用 OTP 登录授权
log.info("Team Owner 账号 (旧格式),使用一次性验证码登录...", icon="auth")
progress_update(step="OTP Login...")
auth_success, codex_data = login_and_authorize_with_otp(email)
register_success = auth_success
elif need_crs_only:
# 已授权但未入库: 跳过授权,直接尝试入库
log.info(f"已授权账号 (状态: {account_status}),跳过授权,直接入库...", icon="auth")
progress_update(step="Adding to CRS...")
register_success = True
codex_data = None # CPA/S2A 模式不需要 codex_data
# CRS 模式下,由于没有 codex_data无法入库需要重新授权
if AUTH_PROVIDER not in ("cpa", "s2a"):
log.warning("CRS 模式下已授权账号缺少 codex_data需要重新授权")
auth_success, codex_data = authorize_only(email, password)
progress_update(step="OTP Login...")
auth_success, codex_data = login_and_authorize_with_otp(email)
register_success = auth_success
elif need_auth_only:
# 已注册账号 (包括新格式 Owner): 使用密码登录授权
log.info(f"注册账号 (状态: {account_status}, 角色: {account_role}),使用密码登录授权...", icon="auth")
progress_update(step="Authorizing...")
auth_success, codex_data = authorize_only(email, password)
register_success = True
else:
# 新账号: 注册 + Codex 授权
progress_update(step="Registering...")
register_success, codex_data = register_and_authorize(email, password)
# 检查是否是域名黑名单错误
if register_success == "domain_blacklisted":
domain = get_domain_from_email(email)
log.error(f"域名 {domain} 不被支持,加入黑名单")
add_domain_to_blacklist(domain)
# 从 tracker 中移除
remove_account_from_tracker(_tracker, team_name, email)
save_team_tracker(_tracker)
# 尝试创建新邮箱替代
log.info("尝试创建新邮箱替代...")
new_email, new_password = unified_create_email()
if new_email and not is_email_blacklisted(new_email):
# 邀请新邮箱
if invite_single_to_team(new_email, _get_team_by_name(team_name)):
add_account_with_password(_tracker, team_name, new_email, new_password, "invited")
save_team_tracker(_tracker)
log.success(f"已创建新邮箱: {new_email},将在下次运行时处理")
else:
log.error("新邮箱邀请失败")
else:
log.error("无法创建有效的新邮箱")
continue # 跳过当前账号,继续下一个
if register_success and register_success != "domain_blacklisted":
update_account_status(_tracker, team_name, email, "registered")
save_team_tracker(_tracker)
# CPA 模式: codex_data 为 None授权成功后直接标记完成
# CRS 模式: 需要 codex_data手动添加到 CRS
if AUTH_PROVIDER == "s2a":
# S2A 模式: 授权成功后验证账号是否入库
from s2a_service import s2a_verify_account_in_pool
update_account_status(_tracker, team_name, email, "authorized")
save_team_tracker(_tracker)
# 验证账号是否成功入库
log.step("正在验证 S2A 账号入库状态...")
progress_update(step="验证入库...")
verified, account_data = s2a_verify_account_in_pool(email)
if verified:
account_id = account_data.get("id", "")
account_name = account_data.get("name", "")
result["status"] = "success"
result["crs_id"] = f"S2A-{account_id}"
update_account_status(_tracker, team_name, email, "completed")
save_team_tracker(_tracker)
log.success(f"✅ S2A 账号入库成功 (ID: {account_id}, 名称: {account_name})")
else:
log.warning("⚠️ S2A 授权成功但入库验证失败")
result["status"] = "partial"
update_account_status(_tracker, team_name, email, "partial")
save_team_tracker(_tracker)
elif AUTH_PROVIDER == "cpa":
# CPA 模式: 授权成功即完成 (后台自动处理账号)
update_account_status(_tracker, team_name, email, "authorized")
save_team_tracker(_tracker)
result["status"] = "success"
result["crs_id"] = "CPA-AUTO"
update_account_status(_tracker, team_name, email, "completed")
save_team_tracker(_tracker)
log.success(f"✅ CPA 账号处理完成: {email}")
elif need_crs_only:
# 已授权但未入库: 跳过授权,直接尝试入库
log.info(f"授权账号 (状态: {account_status}),跳过授权,直接入库...", icon="auth")
progress_update(step="Adding to CRS...")
register_success = True
codex_data = None # CPA/S2A 模式不需要 codex_data
# CRS 模式下,由于没有 codex_data无法入库需要重新授权
if AUTH_PROVIDER not in ("cpa", "s2a"):
log.warning("CRS 模式下已授权账号缺少 codex_data需要重新授权")
auth_success, codex_data = authorize_only(email, password)
register_success = auth_success
elif need_auth_only:
# 已注册账号 (包括新格式 Owner): 使用密码登录授权
log.info(f"已注册账号 (状态: {account_status}, 角色: {account_role}),使用密码登录授权...", icon="auth")
progress_update(step="Authorizing...")
auth_success, codex_data = authorize_only(email, password)
register_success = True
else:
# CRS 模式: 原有逻辑
if codex_data:
# 新账号: 注册 + Codex 授权
progress_update(step="Registering...")
register_success, codex_data = register_and_authorize(email, password)
# 检查是否是域名黑名单错误
if register_success == "domain_blacklisted":
domain = get_domain_from_email(email)
log.error(f"域名 {domain} 不被支持,加入黑名单")
add_domain_to_blacklist(domain)
# 从 tracker 中移除
remove_account_from_tracker(_tracker, team_name, email)
save_team_tracker(_tracker)
# 尝试创建新邮箱替代
log.info("尝试创建新邮箱替代...")
new_email, new_password = unified_create_email()
if new_email and not is_email_blacklisted(new_email):
# 邀请新邮箱
if invite_single_to_team(new_email, _get_team_by_name(team_name)):
add_account_with_password(_tracker, team_name, new_email, new_password, "invited")
save_team_tracker(_tracker)
log.success(f"已创建新邮箱: {new_email},将在下次运行时处理")
else:
log.error("新邮箱邀请失败")
else:
log.error("无法创建有效的新邮箱")
continue # 跳过当前账号,继续下一个
if register_success and register_success != "domain_blacklisted":
update_account_status(_tracker, team_name, email, "registered")
save_team_tracker(_tracker)
# CPA 模式: codex_data 为 None授权成功后直接标记完成
# CRS 模式: 需要 codex_data手动添加到 CRS
if AUTH_PROVIDER == "s2a":
# S2A 模式: 授权成功后验证账号是否入库
from s2a_service import s2a_verify_account_in_pool
update_account_status(_tracker, team_name, email, "authorized")
save_team_tracker(_tracker)
# 添加到 CRS
log.step("添加到 CRS...")
crs_result = crs_add_account(email, codex_data)
if crs_result:
crs_id = crs_result.get("id", "")
# 验证账号是否成功入库
log.step("正在验证 S2A 账号入库状态...")
progress_update(step="验证入库...")
verified, account_data = s2a_verify_account_in_pool(email)
if verified:
account_id = account_data.get("id", "")
account_name = account_data.get("name", "")
result["status"] = "success"
result["crs_id"] = crs_id
result["crs_id"] = f"S2A-{account_id}"
update_account_status(_tracker, team_name, email, "completed")
save_team_tracker(_tracker)
log.success(f"账号处理完成: {email}")
log.success(f"✅ S2A 账号入库成功 (ID: {account_id}, 名称: {account_name})")
else:
log.warning("CRS 入库失败,但注册和授权成功")
log.warning("⚠️ S2A 授权成功但入库验证失败")
result["status"] = "partial"
update_account_status(_tracker, team_name, email, "partial")
save_team_tracker(_tracker)
else:
log.warning("Codex 授权失败")
result["status"] = "auth_failed"
update_account_status(_tracker, team_name, email, "auth_failed")
elif AUTH_PROVIDER == "cpa":
# CPA 模式: 授权成功即完成 (后台自动处理账号)
update_account_status(_tracker, team_name, email, "authorized")
save_team_tracker(_tracker)
elif register_success != "domain_blacklisted":
if is_team_owner_otp:
log.error(f"OTP 登录授权失败: {email}")
else:
log.error(f"注册/授权失败: {email}")
update_account_status(_tracker, team_name, email, "register_failed")
save_team_tracker(_tracker)
result["status"] = "success"
result["crs_id"] = "CPA-AUTO"
update_account_status(_tracker, team_name, email, "completed")
save_team_tracker(_tracker)
log.success(f"✅ CPA 账号处理完成: {email}")
else:
# CRS 模式: 原有逻辑
if codex_data:
update_account_status(_tracker, team_name, email, "authorized")
save_team_tracker(_tracker)
# 添加到 CRS
log.step("添加到 CRS...")
crs_result = crs_add_account(email, codex_data)
if crs_result:
crs_id = crs_result.get("id", "")
result["status"] = "success"
result["crs_id"] = crs_id
update_account_status(_tracker, team_name, email, "completed")
save_team_tracker(_tracker)
log.success(f"账号处理完成: {email}")
else:
log.warning("CRS 入库失败,但注册和授权成功")
result["status"] = "partial"
update_account_status(_tracker, team_name, email, "partial")
save_team_tracker(_tracker)
else:
log.warning("Codex 授权失败")
result["status"] = "auth_failed"
update_account_status(_tracker, team_name, email, "auth_failed")
save_team_tracker(_tracker)
elif register_success != "domain_blacklisted":
if is_team_owner_otp:
log.error(f"OTP 登录授权失败: {email}")
else:
log.error(f"注册/授权失败: {email}")
update_account_status(_tracker, team_name, email, "register_failed")
save_team_tracker(_tracker)
except ShutdownRequested:
# 用户请求停止,保存当前状态并退出