update
This commit is contained in:
130
telegram_bot.py
130
telegram_bot.py
@@ -44,7 +44,7 @@ from config import (
|
||||
S2A_GROUP_IDS,
|
||||
S2A_ADMIN_KEY,
|
||||
)
|
||||
from utils import load_team_tracker
|
||||
from utils import load_team_tracker, get_all_incomplete_accounts
|
||||
from bot_notifier import BotNotifier, set_notifier, progress_finish
|
||||
from s2a_service import s2a_get_dashboard_stats, format_dashboard_stats
|
||||
from email_service import gptmail_service, unified_create_email
|
||||
@@ -98,6 +98,7 @@ class ProvisionerBot:
|
||||
("fingerprint", self.cmd_fingerprint),
|
||||
("run", self.cmd_run),
|
||||
("run_all", self.cmd_run_all),
|
||||
("resume", self.cmd_resume),
|
||||
("stop", self.cmd_stop),
|
||||
("logs", self.cmd_logs),
|
||||
("logs_live", self.cmd_logs_live),
|
||||
@@ -173,6 +174,7 @@ class ProvisionerBot:
|
||||
BotCommand("config", "查看系统配置"),
|
||||
BotCommand("run", "处理指定 Team"),
|
||||
BotCommand("run_all", "处理所有 Team"),
|
||||
BotCommand("resume", "继续处理未完成账号"),
|
||||
BotCommand("stop", "停止当前任务"),
|
||||
BotCommand("logs", "查看最近日志"),
|
||||
BotCommand("dashboard", "查看 S2A 仪表盘"),
|
||||
@@ -209,6 +211,7 @@ class ProvisionerBot:
|
||||
<b>🚀 任务控制:</b>
|
||||
/run <n> - 开始处理第 n 个 Team
|
||||
/run_all - 开始处理所有 Team
|
||||
/resume - 继续处理未完成账号
|
||||
/stop - 停止当前任务
|
||||
|
||||
<b>⚙️ 配置管理:</b>
|
||||
@@ -729,6 +732,53 @@ class ProvisionerBot:
|
||||
|
||||
self.current_task = asyncio.ensure_future(self._wrap_task(self.current_task, "全部"))
|
||||
|
||||
@admin_only
|
||||
async def cmd_resume(self, update: Update, context: ContextTypes.DEFAULT_TYPE):
|
||||
"""继续处理未完成的账号"""
|
||||
if self.current_task and not self.current_task.done():
|
||||
await update.message.reply_text(
|
||||
f"⚠️ 任务正在运行: {self.current_team}\n使用 /stop 停止"
|
||||
)
|
||||
return
|
||||
|
||||
# 检查是否有未完成的账号
|
||||
tracker = load_team_tracker()
|
||||
all_incomplete = get_all_incomplete_accounts(tracker)
|
||||
|
||||
if not all_incomplete:
|
||||
await update.message.reply_text("✅ 没有待处理的账号,所有任务已完成")
|
||||
return
|
||||
|
||||
# 统计未完成账号
|
||||
total_incomplete = sum(len(accs) for accs in all_incomplete.values())
|
||||
teams_count = len(all_incomplete)
|
||||
|
||||
# 构建消息
|
||||
lines = [
|
||||
f"<b>⏳ 发现 {total_incomplete} 个未完成账号</b>",
|
||||
f"涉及 {teams_count} 个 Team:",
|
||||
""
|
||||
]
|
||||
|
||||
for team_name, accounts in all_incomplete.items():
|
||||
lines.append(f" • <b>{team_name}</b>: {len(accounts)} 个")
|
||||
|
||||
lines.append("")
|
||||
lines.append("🚀 开始继续处理...")
|
||||
|
||||
await update.message.reply_text("\n".join(lines), parse_mode="HTML")
|
||||
|
||||
# 启动任务 (run_all_teams 会自动处理未完成的账号)
|
||||
self.current_team = "继续处理"
|
||||
|
||||
loop = asyncio.get_event_loop()
|
||||
self.current_task = loop.run_in_executor(
|
||||
self.executor,
|
||||
self._run_all_teams_task
|
||||
)
|
||||
|
||||
self.current_task = asyncio.ensure_future(self._wrap_task(self.current_task, "继续处理"))
|
||||
|
||||
async def _wrap_task(self, task, team_name: str):
|
||||
"""包装任务以处理完成通知"""
|
||||
try:
|
||||
@@ -736,8 +786,10 @@ class ProvisionerBot:
|
||||
# 收集成功和失败的账号
|
||||
success_accounts = [r.get("email") for r in (result or []) if r.get("status") == "success"]
|
||||
failed_accounts = [r.get("email") for r in (result or []) if r.get("status") != "success"]
|
||||
log.info(f"任务完成: {team_name}, 成功: {len(success_accounts)}, 失败: {len(failed_accounts)}")
|
||||
await self.notifier.notify_task_completed(team_name, success_accounts, failed_accounts)
|
||||
except Exception as e:
|
||||
log.error(f"任务异常: {team_name}, 错误: {e}")
|
||||
await self.notifier.notify_error(f"任务失败: {team_name}", str(e))
|
||||
finally:
|
||||
self.current_team = None
|
||||
@@ -748,11 +800,31 @@ class ProvisionerBot:
|
||||
"""执行单个 Team 任务 (在线程池中运行)"""
|
||||
# 延迟导入避免循环依赖
|
||||
from run import run_single_team
|
||||
from team_service import preload_all_account_ids
|
||||
from utils import load_team_tracker, save_team_tracker, add_team_owners_to_tracker
|
||||
from config import DEFAULT_PASSWORD
|
||||
|
||||
# 预加载 account_id
|
||||
preload_all_account_ids()
|
||||
_tracker = load_team_tracker()
|
||||
add_team_owners_to_tracker(_tracker, DEFAULT_PASSWORD)
|
||||
save_team_tracker(_tracker)
|
||||
|
||||
return run_single_team(team_idx)
|
||||
|
||||
def _run_all_teams_task(self):
|
||||
"""执行所有 Team 任务 (在线程池中运行)"""
|
||||
from run import run_all_teams
|
||||
from team_service import preload_all_account_ids
|
||||
from utils import load_team_tracker, save_team_tracker, add_team_owners_to_tracker
|
||||
from config import DEFAULT_PASSWORD
|
||||
|
||||
# 预加载 account_id
|
||||
preload_all_account_ids()
|
||||
_tracker = load_team_tracker()
|
||||
add_team_owners_to_tracker(_tracker, DEFAULT_PASSWORD)
|
||||
save_team_tracker(_tracker)
|
||||
|
||||
return run_all_teams()
|
||||
|
||||
@admin_only
|
||||
@@ -770,8 +842,10 @@ class ProvisionerBot:
|
||||
try:
|
||||
import run
|
||||
run._shutdown_requested = True
|
||||
# 获取当前运行结果
|
||||
current_results = run._current_results.copy() if run._current_results else []
|
||||
except Exception:
|
||||
pass
|
||||
current_results = []
|
||||
|
||||
# 2. 取消 asyncio 任务
|
||||
if self.current_task and not self.current_task.done():
|
||||
@@ -797,13 +871,51 @@ class ProvisionerBot:
|
||||
# 清理进度跟踪
|
||||
progress_finish()
|
||||
|
||||
await update.message.reply_text(
|
||||
f"<b>✅ 任务已强制停止</b>\n\n"
|
||||
f"已停止: {task_name}\n"
|
||||
f"已清理浏览器进程\n\n"
|
||||
f"使用 /status 查看状态",
|
||||
parse_mode="HTML"
|
||||
)
|
||||
# 6. 生成停止报告
|
||||
report_lines = [
|
||||
f"<b>🛑 任务已停止</b>",
|
||||
f"任务: {task_name}",
|
||||
"",
|
||||
]
|
||||
|
||||
# 本次运行结果
|
||||
if current_results:
|
||||
success_count = sum(1 for r in current_results if r.get("status") == "success")
|
||||
failed_count = len(current_results) - success_count
|
||||
report_lines.append(f"<b>📊 本次运行结果:</b>")
|
||||
report_lines.append(f" 成功: {success_count}")
|
||||
report_lines.append(f" 失败: {failed_count}")
|
||||
report_lines.append("")
|
||||
|
||||
# 获取未完成账号信息
|
||||
tracker = load_team_tracker()
|
||||
all_incomplete = get_all_incomplete_accounts(tracker)
|
||||
|
||||
if all_incomplete:
|
||||
total_incomplete = sum(len(accs) for accs in all_incomplete.values())
|
||||
report_lines.append(f"<b>⏳ 待继续处理: {total_incomplete} 个账号</b>")
|
||||
|
||||
# 显示每个 Team 的未完成账号 (最多显示 3 个 Team)
|
||||
shown_teams = 0
|
||||
for team_name, accounts in all_incomplete.items():
|
||||
if shown_teams >= 3:
|
||||
remaining = len(all_incomplete) - 3
|
||||
report_lines.append(f" ... 还有 {remaining} 个 Team")
|
||||
break
|
||||
|
||||
report_lines.append(f" <b>{team_name}</b>: {len(accounts)} 个")
|
||||
# 显示第一个待处理账号
|
||||
if accounts:
|
||||
first_acc = accounts[0]
|
||||
report_lines.append(f" 下一个: <code>{first_acc['email']}</code>")
|
||||
shown_teams += 1
|
||||
|
||||
report_lines.append("")
|
||||
report_lines.append("💡 使用 /resume 继续处理")
|
||||
else:
|
||||
report_lines.append("✅ 没有待处理的账号")
|
||||
|
||||
await update.message.reply_text("\n".join(report_lines), parse_mode="HTML")
|
||||
|
||||
except Exception as e:
|
||||
await update.message.reply_text(f"❌ 停止任务时出错: {e}")
|
||||
|
||||
Reference in New Issue
Block a user