mirror of
https://github.com/zhinianboke/xianyu-auto-reply.git
synced 2025-08-02 12:37:35 +08:00
122 lines
4.3 KiB
Markdown
122 lines
4.3 KiB
Markdown
# 账号禁用功能修复说明
|
||
|
||
## 问题分析
|
||
|
||
在原有的代码中,账号禁用功能存在以下问题:
|
||
|
||
### 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被跳过
|
||
|
||
## 关键代码片段
|
||
|
||
### 消息处理中的状态检查
|
||
```python
|
||
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
|
||
```
|
||
|
||
### 任务管理逻辑
|
||
```python
|
||
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. **向后兼容**: 修改不影响现有功能,保持向后兼容性
|