Files
xyzw_web_helper/MD说明文件夹/问题修复-发车和爬塔错误v3.10.3.md
2025-10-17 20:56:50 +08:00

7.8 KiB
Raw Permalink Blame History

问题修复:发车和爬塔错误 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 行)

修改前:

const beforeRoleInfo = await client.sendWithPromise('role_getroleinfo', {}, 1000)

修改后:

const beforeRoleInfo = await client.sendWithPromise('role_getroleinfo', {}, 10000)

优势:

  • 为服务器响应提供更充足的时间
  • 减少因网络波动导致的超时
  • 与其他关键命令(如 car_getrolecar 20000ms的超时策略保持一致

2. 为错误 200400 添加特定错误处理

修改文件: src/stores/batchTaskStore.js

修改内容:

  • sendCar 任务的 car_getrolecar 调用处添加 try-catch
  • 检测错误消息是否包含 "200400"
  • 如果是,抛出更友好的错误消息:"该账号未加入俱乐部或没有赛车权限"

修改前:

const queryResponse = await tokenStore.sendMessageAsync(tokenId, 'car_getrolecar', {}, 20000)

if (!queryResponse || !queryResponse.roleCar) {
  throw new Error('查询车辆失败:未返回车辆数据')
}

修改后:

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 函数)

修改前:

.register("presetteam_getinfo")
.register("presetteam_getinfo")
.register("presetteam_setteam")
.register("presetteam_saveteam", { teamId: 1 })
.register("role_gettargetteam")

修改后:

.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 方法)

修改前:

'presetteam_saveteamresp': 'presetteam_saveteam',
'presetteam_getinforesp': 'presetteam_getinfo',

修改后:

'presetteam_saveteamresp': 'presetteam_saveteam',
'presetteam_changeteamresp': 'presetteam_changeteam',
'presetteam_getinforesp': 'presetteam_getinfo',

优势:

  • 使 presetteam_changeteam 命令能够被 WebSocket 客户端识别
  • 确保 Promise 能够正确解析响应
  • 修复爬塔任务中的阵容切换功能

测试验证

测试场景 1role_getroleinfo 不再超时

预期结果:

  • dailyFix 任务中的 role_getroleinfo 命令在 10000ms 内成功响应
  • 不再出现 "请求超时: role_getroleinfo (1000ms)" 错误

日志示例:

🔍 正在获取执行前的任务完成状态...
📊 执行前任务状态: { "101": true, "102": true, ... }

测试场景 2错误 200400 显示友好消息

预期结果:

  • 对于未加入俱乐部的账号,sendCar 任务失败,但显示明确的错误原因
  • 错误消息为:"该账号未加入俱乐部或没有赛车权限"

日志示例:

🚗 [token_xxx] 开始查询俱乐部车辆...
❌ [token_xxx] 发车任务失败: Error: 该账号未加入俱乐部或没有赛车权限

测试场景 3presetteam_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. 并发控制

目前批量自动化的默认并发数为 1maxConcurrency = 1),这是为了:

  • 避免服务器反批量检测
  • 减少超时和错误发生的概率

如果用户增加并发数(如 3-6可能需要进一步优化超时策略或添加更多的延迟。


总结

本次修复解决了批量自动化中的三个关键问题:

  1. role_getroleinfo 超时 - 增加超时到 10000ms
  2. 错误 200400 提示不明确 - 添加友好的错误消息
  3. presetteam_changeteam 未注册 - 注册命令和响应映射

这些修复提高了批量自动化的稳定性和用户体验,尤其是在处理未加入俱乐部的账号时。


版本标识: v3.10.3
后续优化方向:

  1. 在执行 sendCar 任务前,预先检查账号的俱乐部状态
  2. 根据实际测试情况,动态调整各命令的超时时间
  3. 为所有 WebSocket 命令建立统一的超时管理机制