xianyu-auto-reply/账号禁用功能修复说明.md
2025-07-28 12:11:45 +08:00

4.3 KiB
Raw Blame History

账号禁用功能修复说明

问题分析

在原有的代码中,账号禁用功能存在以下问题:

1. 账号状态检查不完整

  • reply_server.py 中的 match_reply 函数虽然有账号状态检查,但只影响关键词匹配回复
  • XianyuAutoAsync.py 的消息处理流程中没有检查账号的启用/禁用状态
  • Token刷新、心跳、WebSocket连接等核心功能都没有账号状态检查

2. 任务管理机制缺陷

  • 账号禁用时,对应的 XianyuLive 任务WebSocket连接、token刷新任务等并没有被停止
  • cookie_manager.py 中的 update_cookie_status 方法只更新了状态,但没有停止或启动相应的任务
  • 任务一旦启动就会持续运行,不受账号状态影响

3. 重启后token刷新的原因

  • Start.py 启动时会为所有数据库中的Cookie启动任务不管其启用状态
  • XianyuAutoAsync.py 中的token刷新是独立的定时任务一旦启动就会持续运行

解决方案

1. 修改XianyuAutoAsync消息处理流程

文件: XianyuAutoAsync.py

修改内容:

  • handle_message 方法开头添加账号状态检查
  • main 方法的主循环中添加账号状态检查
  • token_refresh_loop 方法中添加账号状态检查
  • heartbeat_loop 方法中添加账号状态检查

效果: 禁用的账号将不再处理消息、刷新token或发送心跳

2. 修改CookieManager任务管理

文件: cookie_manager.py

修改内容:

  • update_cookie_status 方法中添加任务启动/停止逻辑
  • 新增 _start_cookie_task 方法用于启动指定账号的任务
  • 新增 _stop_cookie_task 方法用于停止指定账号的任务

效果:

  • 禁用账号时立即停止相关任务
  • 启用账号时立即启动相关任务

3. 修改Start.py启动逻辑

文件: Start.py

修改内容:

  • 启动时检查每个账号的启用状态
  • 只为启用状态的账号创建任务
  • 跳过禁用的账号

效果: 重启后禁用的账号不会自动启动任务

修改后的工作流程

账号禁用时

  1. 用户在管理界面点击禁用账号
  2. 前端调用 /cookies/{cid}/status API
  3. cookie_manager.update_cookie_status 被调用
  4. 状态更新到数据库和内存
  5. 检测到状态变化,调用 _stop_cookie_task
  6. 取消对应的异步任务
  7. 正在运行的 XianyuLive 实例在下次循环时检测到状态变化并退出

账号启用时

  1. 用户在管理界面点击启用账号
  2. 前端调用 /cookies/{cid}/status API
  3. cookie_manager.update_cookie_status 被调用
  4. 状态更新到数据库和内存
  5. 检测到状态变化,调用 _start_cookie_task
  6. 创建新的异步任务启动 XianyuLive 实例

系统重启时

  1. Start.py 从数据库加载所有Cookie
  2. 检查每个Cookie的启用状态
  3. 只为启用状态的Cookie创建任务
  4. 禁用的Cookie被跳过

关键代码片段

消息处理中的状态检查

async def handle_message(self, message_data, websocket):
    # 检查账号是否启用
    from cookie_manager import manager as cookie_manager
    if cookie_manager and not cookie_manager.get_cookie_status(self.cookie_id):
        logger.debug(f"【{self.cookie_id}】账号已禁用,跳过消息处理")
        return

任务管理逻辑

def update_cookie_status(self, cookie_id: str, enabled: bool):
    old_status = self.cookie_status.get(cookie_id, True)
    self.cookie_status[cookie_id] = enabled
    db_manager.save_cookie_status(cookie_id, enabled)
    
    # 如果状态发生变化,需要启动或停止任务
    if old_status != enabled:
        if enabled:
            self._start_cookie_task(cookie_id)
        else:
            self._stop_cookie_task(cookie_id)

测试验证

可以使用提供的 test_account_disable.py 脚本来测试账号禁用功能是否正常工作。

注意事项

  1. 立即生效: 修改后账号禁用/启用将立即生效,无需重启系统
  2. 资源清理: 禁用账号时会正确清理相关的异步任务和资源
  3. 状态持久化: 账号状态会保存到数据库,重启后保持一致
  4. 错误处理: 添加了完善的错误处理和日志记录
  5. 向后兼容: 修改不影响现有功能,保持向后兼容性