Files
xyzw_web_helper/MD说明文件夹/问题修复-发车和爬塔错误v3.10.3.md

290 lines
7.8 KiB
Markdown
Raw Normal View History

2025-10-17 20:56:50 +08:00
# 问题修复:发车和爬塔错误 v3.10.3
**版本**: v3.10.3
**日期**: 2025-10-08
**类型**: Bug Fix
---
## 问题描述
在批量自动化运行时,发现以下三个错误:
### 1. `role_getroleinfo` 请求超时 (1000ms)
**现象**:
```
❌ [token_xxx] 请求超时: role_getroleinfo (1000ms)
```
**影响**:
- Token 1 和 Token 3 在执行 `dailyFix` 任务时遇到此超时
- 虽然 Token 1 的后续 `car_getrolecar` 仍成功,但 Token 3 因此失败
**原因**:
- `dailyFix` 任务中的 `role_getroleinfo` 命令使用 1000ms 超时
- 在高并发或服务器负载较高时1000ms 不足以等待服务器响应
---
### 2. `car_getrolecar` 返回错误 200400
**现象**:
```
❌ [token_xxx] 发车任务失败: Error: 服务器错误: 200400 - 未知错误
```
**影响**:
- Token 2 和 Token 3 在执行 `sendCar` 任务时遇到此错误
- 导致发车任务完全失败,无法查询车辆
**原因**:
- 错误码 200400 表示账号未加入俱乐部或没有赛车权限
- 当前代码没有针对此错误码的特定处理,仅抛出通用错误
---
### 3. `presetteam_changeteam` 未知命令
**现象**:
```
❌ [token_xxx] presetteam_changeteam Error: Unknown cmd: presetteam_changeteam
```
**影响**:
- Token 2 在执行 `climbTower` 任务时遇到此错误
- 导致爬塔任务中的阵容切换失败
**原因**:
- `presetteam_changeteam` 命令未在 `CommandRegistry` 中注册
- `presetteam_changeteamresp` 响应未在 `responseToCommandMap` 中映射
---
## 解决方案
### 1. 增加 `role_getroleinfo` 超时时间
**修改文件**: `src/stores/batchTaskStore.js`
**修改内容**:
-`role_getroleinfo` 的超时时间从 **1000ms** 增加到 **10000ms**
- 影响范围:`dailyFix` 任务中的两处 `role_getroleinfo` 调用
- 执行前获取任务状态(第 538 行)
- 执行后获取任务状态(第 918 行)
**修改前**:
```javascript
const beforeRoleInfo = await client.sendWithPromise('role_getroleinfo', {}, 1000)
```
**修改后**:
```javascript
const beforeRoleInfo = await client.sendWithPromise('role_getroleinfo', {}, 10000)
```
**优势**:
- 为服务器响应提供更充足的时间
- 减少因网络波动导致的超时
- 与其他关键命令(如 `car_getrolecar` 20000ms的超时策略保持一致
---
### 2. 为错误 200400 添加特定错误处理
**修改文件**: `src/stores/batchTaskStore.js`
**修改内容**:
-`sendCar` 任务的 `car_getrolecar` 调用处添加 try-catch
- 检测错误消息是否包含 "200400"
- 如果是,抛出更友好的错误消息:"该账号未加入俱乐部或没有赛车权限"
**修改前**:
```javascript
const queryResponse = await tokenStore.sendMessageAsync(tokenId, 'car_getrolecar', {}, 20000)
if (!queryResponse || !queryResponse.roleCar) {
throw new Error('查询车辆失败:未返回车辆数据')
}
```
**修改后**:
```javascript
let queryResponse
try {
queryResponse = await tokenStore.sendMessageAsync(tokenId, 'car_getrolecar', {}, 20000)
} catch (error) {
// 检查是否是 200400 错误(账号未加入俱乐部或没有赛车权限)
if (error.message && error.message.includes('200400')) {
throw new Error('该账号未加入俱乐部或没有赛车权限')
}
// 其他错误直接抛出
throw error
}
if (!queryResponse || !queryResponse.roleCar) {
throw new Error('查询车辆失败:未返回车辆数据')
}
```
**优势**:
- 为用户提供更明确的错误原因
- 便于快速定位问题(账号未加入俱乐部)
- 避免误认为是服务器或客户端代码错误
---
### 3. 注册 `presetteam_changeteam` 命令
**修改文件**: `src/utils/xyzwWebSocket.js`
**修改内容**:
#### 3.1 在 `CommandRegistry` 中注册命令
**修改位置**: 第 163 行(`registerDefaultCommands` 函数)
**修改前**:
```javascript
.register("presetteam_getinfo")
.register("presetteam_getinfo")
.register("presetteam_setteam")
.register("presetteam_saveteam", { teamId: 1 })
.register("role_gettargetteam")
```
**修改后**:
```javascript
.register("presetteam_getinfo")
.register("presetteam_getinfo")
.register("presetteam_setteam")
.register("presetteam_changeteam", { teamId: 1 })
.register("presetteam_saveteam", { teamId: 1 })
.register("role_gettargetteam")
```
#### 3.2 在 `responseToCommandMap` 中添加响应映射
**修改位置**: 第 638 行(`_handlePromiseResponse` 方法)
**修改前**:
```javascript
'presetteam_saveteamresp': 'presetteam_saveteam',
'presetteam_getinforesp': 'presetteam_getinfo',
```
**修改后**:
```javascript
'presetteam_saveteamresp': 'presetteam_saveteam',
'presetteam_changeteamresp': 'presetteam_changeteam',
'presetteam_getinforesp': 'presetteam_getinfo',
```
**优势**:
- 使 `presetteam_changeteam` 命令能够被 WebSocket 客户端识别
- 确保 Promise 能够正确解析响应
- 修复爬塔任务中的阵容切换功能
---
## 测试验证
### 测试场景 1`role_getroleinfo` 不再超时
**预期结果**:
- `dailyFix` 任务中的 `role_getroleinfo` 命令在 10000ms 内成功响应
- 不再出现 "请求超时: role_getroleinfo (1000ms)" 错误
**日志示例**:
```
🔍 正在获取执行前的任务完成状态...
📊 执行前任务状态: { "101": true, "102": true, ... }
```
---
### 测试场景 2错误 200400 显示友好消息
**预期结果**:
- 对于未加入俱乐部的账号,`sendCar` 任务失败,但显示明确的错误原因
- 错误消息为:"该账号未加入俱乐部或没有赛车权限"
**日志示例**:
```
🚗 [token_xxx] 开始查询俱乐部车辆...
❌ [token_xxx] 发车任务失败: Error: 该账号未加入俱乐部或没有赛车权限
```
---
### 测试场景 3`presetteam_changeteam` 命令正常工作
**预期结果**:
- `climbTower` 任务中的阵容切换功能正常工作
- 不再出现 "Unknown cmd: presetteam_changeteam" 错误
**日志示例**:
```
🗼 [token_xxx] 开始爬塔(目标层数: 18...
✅ 已切换到阵容1
🏆 [token_xxx] 成功挑战第 1 层
```
---
## 影响范围
### 修改的文件
1. `src/stores/batchTaskStore.js` - 批量任务核心逻辑
2. `src/utils/xyzwWebSocket.js` - WebSocket 客户端命令注册
### 影响的功能
1. **批量自动化 - dailyFix 任务**: 任务状态获取更稳定
2. **批量自动化 - sendCar 任务**: 错误提示更友好
3. **批量自动化 - climbTower 任务**: 阵容切换功能可用
---
## 注意事项
### 1. 错误 200400 的根本解决
虽然我们添加了友好的错误提示,但根本解决方法是:
- **确保账号已加入俱乐部**
- 在执行 `sendCar` 任务前,先检查账号的俱乐部状态
### 2. `role_getroleinfo` 超时时间平衡
- **10000ms** 是一个较为保守的超时时间
- 如果服务器响应速度很快,可能会增加整体任务执行时间
- 如果发现超时仍频繁发生,可考虑进一步增加到 15000ms 或 20000ms
### 3. 并发控制
目前批量自动化的默认并发数为 1`maxConcurrency = 1`),这是为了:
- 避免服务器反批量检测
- 减少超时和错误发生的概率
如果用户增加并发数(如 3-6可能需要进一步优化超时策略或添加更多的延迟。
---
## 总结
本次修复解决了批量自动化中的三个关键问题:
1.**`role_getroleinfo` 超时** - 增加超时到 10000ms
2.**错误 200400 提示不明确** - 添加友好的错误消息
3.**`presetteam_changeteam` 未注册** - 注册命令和响应映射
这些修复提高了批量自动化的稳定性和用户体验,尤其是在处理未加入俱乐部的账号时。
---
**版本标识**: v3.10.3
**后续优化方向**:
1. 在执行 `sendCar` 任务前,预先检查账号的俱乐部状态
2. 根据实际测试情况,动态调整各命令的超时时间
3. 为所有 WebSocket 命令建立统一的超时管理机制