# 问题修复 - 错误码200020俱乐部已签到 v3.12.1 **版本**: v3.12.1 **日期**: 2025-10-08 **类型**: 问题修复 ## 问题描述 用户反馈俱乐部签到时遇到错误: ``` 俱乐部签到失败 服务器错误: 200020 - 未知错误 ``` **实际情况**:查看游戏内俱乐部,发现已经签到成功了。 **问题分析**: - 错误码 `200020` 实际上表示"今日已签到" - 但系统没有识别这个错误码 - 导致已签到的情况被标记为失败 - 应该像错误码 `2300190` 一样处理为成功状态 ## 错误码对比 ### 已知的"已签到"错误码 | 错误码 | 含义 | 原处理方式 | 修复后处理方式 | |--------|------|-----------|--------------| | `2300190` | 今日已签到 | ✅ 跳过,视为成功 | ✅ 跳过,视为成功 | | `200020` | 今日已签到 | ❌ 标记为失败 | ✅ 跳过,视为成功 | ### 其他俱乐部相关错误码 | 错误码 | 含义 | 处理方式 | |--------|------|---------| | `2300070` | 未加入俱乐部 | ❌ 失败,提示加入俱乐部 | | 超时 | 请求超时 | ⚠️ 警告,可能已成功 | ## 解决方案 ### 修改内容 在俱乐部签到的错误处理中,将 `200020` 错误码与 `2300190` 合并处理: #### 修改前 ```javascript } catch (error) { const errorMsg = error.message || String(error) // 错误码 2300190 表示"今日已签到",不应视为错误 if (errorMsg.includes('2300190')) { console.log('ℹ️ 俱乐部今日已签到,跳过') return { alreadySignedIn: true } } // ...其他错误处理 } ``` #### 修改后 ```javascript } catch (error) { const errorMsg = error.message || String(error) // 错误码 2300190 或 200020 表示"今日已签到",不应视为错误 if (errorMsg.includes('2300190') || errorMsg.includes('200020')) { console.log('ℹ️ 俱乐部今日已签到,跳过') return { alreadySignedIn: true } } // ...其他错误处理 } ``` ### 完整的错误处理逻辑 ```javascript case 'legionSignIn': // 俱乐部签到 return await executeSubTask( tokenId, 'legion_signin', '俱乐部签到', async () => { try { const result = await client.sendWithPromise('legion_signin', {}, 5000) return result } catch (error) { const errorMsg = error.message || String(error) // 1. 错误码 2300190 或 200020 表示"今日已签到" if (errorMsg.includes('2300190') || errorMsg.includes('200020')) { console.log('ℹ️ 俱乐部今日已签到,跳过') return { alreadySignedIn: true } // 返回成功 } // 2. 错误码 2300070 表示"未加入俱乐部" if (errorMsg.includes('2300070')) { console.log('⚠️ 俱乐部签到失败:该账号未加入俱乐部') throw new Error('该账号未加入俱乐部,无法签到') // 抛出错误 } // 3. 超时错误:可能已成功 if (errorMsg.includes('请求超时') || errorMsg.includes('timeout')) { console.warn('⚠️ 俱乐部签到超时,请检查游戏内是否已签到') return { timeout: true, message: '超时(可能已成功,请检查游戏内状态)' } } // 4. 其他错误正常抛出 throw error } }, false ) ``` ## 修改文件 ### src/stores/batchTaskStore.js **修改位置**: Line 1169-1172 **修改内容**: - 将 `errorMsg.includes('2300190')` 改为 `errorMsg.includes('2300190') || errorMsg.includes('200020')` - 更新注释说明包含两个错误码 ## 用户体验改进 ### 修改前 ``` 执行进度详情 ┌─────────────────────────────┐ │ ❌ 俱乐部签到 │ │ 服务器错误: 200020 - │ │ 未知错误 │ └─────────────────────────────┘ 统计: - 总任务: 7 - 成功: 6 - 失败: 1 ← 误判 ``` ### 修改后 ``` 执行进度详情 ┌─────────────────────────────┐ │ ✅ 俱乐部签到 │ │ 今日已签到,跳过 │ └─────────────────────────────┘ 统计: - 总任务: 7 - 成功: 7 ← 正确识别 - 失败: 0 ``` ### 控制台日志 **修改前**: ``` ❌ [10608服-2-7145...] 俱乐部签到失败: 服务器错误: 200020 - 未知错误 ``` **修改后**: ``` ℹ️ 俱乐部今日已签到,跳过 ``` ## 技术要点 ### 1. 错误码识别优先级 在俱乐部签到的错误处理中,按照以下优先级检查: 1. **已签到状态**(200020, 2300190)→ 返回成功 2. **未加入俱乐部**(2300070)→ 返回失败,提示加入 3. **超时错误** → 返回警告,可能已成功 4. **其他错误** → 原样抛出 ### 2. 为什么存在两个"已签到"错误码? 可能的原因: - **2300190**: 新版本的错误码(标准格式 23xxxxx) - **200020**: 旧版本的错误码(兼容保留) - 不同服务器版本可能返回不同的错误码 - 游戏更新过程中的过渡状态 ### 3. 处理策略 使用 `||` 运算符同时检查两个错误码: ```javascript if (errorMsg.includes('2300190') || errorMsg.includes('200020')) { // 任意一个错误码匹配,都视为已签到 return { alreadySignedIn: true } } ``` **优点**: - ✅ 兼容新旧版本 - ✅ 覆盖所有"已签到"的情况 - ✅ 避免误判为失败 ## 相关错误码汇总 ### 俱乐部签到相关 | 错误码 | 含义 | 处理方式 | 版本 | |--------|------|---------|------| | `2300190` | 今日已签到 | ✅ 成功 | v3.11.1 | | `200020` | 今日已签到 | ✅ 成功 | v3.12.1 | | `2300070` | 未加入俱乐部 | ❌ 失败 | v3.11.24 | | 超时 | 请求超时 | ⚠️ 警告 | v3.11.15 | ### 发车相关 | 错误码 | 含义 | 处理方式 | 版本 | |--------|------|---------|------| | `200350` | 非发车时间或已收车 | ⚠️ 跳过 | v3.11.20 | | `200020` | 发送冷却期 | ⚠️ 跳过 | - | | `2300070` | 未加入俱乐部 | ⚠️ 跳过 | v3.11.24 | | `12000050` | 今日发车已达上限 | ⚠️ 跳过 | - | ## 测试验证 ### 测试场景 1. ✅ **已签到的账号(错误码 200020)** - 执行俱乐部签到任务 - 应该显示"今日已签到,跳过" - 标记为成功 2. ✅ **已签到的账号(错误码 2300190)** - 执行俱乐部签到任务 - 应该显示"今日已签到,跳过" - 标记为成功 3. ✅ **未签到的账号** - 执行俱乐部签到任务 - 正常签到成功 - 标记为成功 4. ✅ **未加入俱乐部的账号(错误码 2300070)** - 执行俱乐部签到任务 - 显示"未加入俱乐部,无法签到" - 标记为失败 ### 预期行为 **场景1:100个Token批量签到,其中50个已签到(错误码200020)** ``` 执行结果: - 总任务: 100 - 成功: 100 ← 全部成功 - 50个正常签到 - 50个已签到(跳过) - 失败: 0 详情: ✅ Token1: 签到成功 ✅ Token2: 今日已签到,跳过 (200020) ✅ Token3: 今日已签到,跳过 (2300190) ... ``` ## 问题来源分析 ### 为什么会出现200020错误? 可能的情况: 1. **第二次签到**:同一天内重复执行批量任务 2. **游戏内手动签到**:已在游戏内手动签到过 3. **其他脚本签到**:其他自动化工具已签到 4. **定时任务重复**:定时任务多次触发 ### 为什么之前没发现? - 大多数情况下返回的是 `2300190` 错误码 - `200020` 错误码可能只在特定情况下返回 - 用户可能在不同的游戏服务器版本 ## 最佳实践 ### 错误码处理原则 1. **明确识别**:为每个已知错误码提供明确处理 2. **宽容处理**:对于"已完成"类的错误,视为成功 3. **友好提示**:提供清晰的错误说明 4. **兼容性**:同时支持新旧错误码 ### 代码示例 ```javascript // ❌ 不好的做法:只检查一个错误码 if (errorMsg.includes('2300190')) { return { alreadySignedIn: true } } // ✅ 好的做法:检查所有可能的"已签到"错误码 if (errorMsg.includes('2300190') || errorMsg.includes('200020')) { return { alreadySignedIn: true } } ``` ## 相关版本 - **v3.11.1**: 首次添加错误码 2300190 识别 - **v3.11.15**: 添加超时错误处理 - **v3.11.24**: 添加错误码 2300070 识别 - **v3.12.1**: 添加错误码 200020 识别(本版本) ## 总结 **问题**: - ❌ 错误码 200020 被识别为"未知错误" - ❌ 已签到的情况被标记为失败 - ❌ 影响批量任务的成功率统计 **修复**: - ✅ 识别错误码 200020 为"今日已签到" - ✅ 与错误码 2300190 合并处理 - ✅ 正确标记为成功状态 **效果**: - ✅ 避免误判已签到为失败 - ✅ 提高批量任务成功率 - ✅ 兼容新旧错误码 - ✅ 更准确的执行统计 --- **状态**: ✅ 已修复 **版本**: v3.12.1