Files
xyzw_web_helper/MD说明文件夹/问题修复-批量加钟失败修复v3.13.4.md
2025-10-17 20:56:50 +08:00

14 KiB
Raw Blame History

问题修复 - 批量加钟任务失败修复 v3.13.4

问题描述

现象:

  • 批量自动化里的加钟任务失败
  • 错误信息:请求超时: system_mysharecallback (5000ms)
  • 实际游戏并没有加钟成功

影响范围:

  • 批量任务中的 addClock(加钟)任务
  • 用户在批量自动化中无法成功加钟,影响挂机奖励的获取

问题分析

原因定位

通过对比游戏功能模块和批量任务模块的加钟实现,发现了关键差异:

1. 批量任务的加钟实现(修复前)

// 位置src/stores/batchTaskStore.js 第1642-1645行
const result = await client.sendWithPromise('system_mysharecallback', { 
  type: 3,  // ❌ 错误:使用了 type: 3
  isSkipShareCard: true 
}, 5000)

问题:

  • 使用了错误的参数 type: 3
  • 只发送1次请求
  • 虽然设置了5000ms超时但由于参数错误导致服务器无响应

2. 游戏功能模块的加钟实现(正确的)

// 位置src/components/GameStatus.vue 第435-486行
for (let i = 0; i < 4; i++) {
  const result = tokenStore.sendMessage(tokenId, 'system_mysharecallback', {
    isSkipShareCard: true,
    type: 2  // ✅ 正确:使用 type: 2
  })
}

正确做法:

  • 使用参数 type: 2(分享/加钟类型)
  • 发送4次请求每次间隔300ms
  • 游戏功能模块能正常工作

参数含义

根据代码分析:

  • type: 2 - 分享游戏/加钟操作
  • type: 3 - 其他功能(可能是领取挂机奖励后的操作)

修复方案

修复内容

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

修改位置: 第1633-1692行addClock 任务)

核心改动:

  1. 参数修复: type: 3type: 2
  2. 请求次数: 1次 → 4次
  3. 请求间隔: 增加每次间隔300ms
  4. 保持超时: 维持5000ms超时避免连接池模式下的网络拥堵

修复后的代码

case 'addClock':
  // 加钟(挂机时间延长)- 必须在领取挂机奖励之后
  // 🔧 修复:参考游戏功能模块的加钟逻辑,使用 type: 2 并发送4次
  return await executeSubTask(
    tokenId,
    'add_clock',
    '加钟',
    async () => {
      try {
        console.log(`🕐 [${tokenId}] 开始加钟操作发送4次请求`)
        
        // 🔧 关键修复:参考 GameStatus.vue 的 extendHangUp 函数
        // 发送4次分享回调请求使用 type: 2而不是 type: 3
        const promises = []
        for (let i = 0; i < 4; i++) {
          const promise = (async () => {
            // 每次请求间隔300ms
            if (i > 0) {
              await new Promise(resolve => setTimeout(resolve, 300))
            }
            
            console.log(`🕐 [${tokenId}] 发送第${i+1}/4次加钟请求`)
            const result = await client.sendWithPromise('system_mysharecallback', {
              isSkipShareCard: true,
              type: 2  // 🔧 修复:使用 type: 2分享/加钟),而不是 type: 3
            }, 5000)  // 保持5000ms超时避免连接池模式下的网络拥堵
            
            console.log(`✅ [${tokenId}] 第${i+1}/4次加钟请求完成`)
            return result
          })()
          promises.push(promise)
        }
        
        // 等待所有请求完成
        const results = await Promise.all(promises)
        console.log(`✅ [${tokenId}] 加钟操作完成已发送4次请求`)
        
        return {
          success: true,
          message: '加钟完成',
          results: results
        }
      } catch (error) {
        const errorMsg = error.message || String(error)
        
        // 错误码 3100030 表示加钟次数已达上限或其他限制
        if (errorMsg.includes('3100030')) {
          console.log(`⚠️ [${tokenId}] 加钟: 次数已达上限或功能受限`)
          return {
            limitReached: true,
            message: '加钟次数已达上限或功能受限'
          }
        }
        
        // 其他错误正常抛出
        throw error
      }
    },
    false
  )

修复效果

预期效果

加钟任务成功执行

  • 发送4次 system_mysharecallback 请求type: 2
  • 每次请求间隔300ms确保稳定性
  • 挂机时间成功延长

日志输出清晰

🕐 [tokenId] 开始加钟操作发送4次请求
🕐 [tokenId] 发送第1/4次加钟请求
✅ [tokenId] 第1/4次加钟请求完成
🕐 [tokenId] 发送第2/4次加钟请求
✅ [tokenId] 第2/4次加钟请求完成
🕐 [tokenId] 发送第3/4次加钟请求
✅ [tokenId] 第3/4次加钟请求完成
🕐 [tokenId] 发送第4/4次加钟请求
✅ [tokenId] 第4/4次加钟请求完成
✅ [tokenId] 加钟操作完成已发送4次请求

错误处理完善

  • 识别错误码 3100030次数上限
  • 超时保护5000ms
  • 详细的错误日志

测试建议

测试步骤

  1. 启动批量任务(包含加钟任务)

    完整套餐 或 快速套餐
    
  2. 观察控制台日志

    • 检查是否输出 "开始加钟操作发送4次请求"
    • 检查是否成功发送4次请求
    • 检查是否有错误信息
  3. 检查游戏内挂机时间

    • 执行前记录挂机剩余时间
    • 执行后检查时间是否延长
    • 每次加钟应延长2小时4次 × 30分钟

预期结果

正常情况

  • 控制台显示4次加钟请求成功
  • 游戏内挂机时间增加约2小时
  • 任务状态显示 "加钟完成"

⚠️ 达到上限

  • 控制台显示 "加钟: 次数已达上限或功能受限"
  • 任务仍标记为成功(不影响整体任务流程)

网络错误

  • 控制台显示具体错误信息
  • 任务标记为失败(触发重试机制)

相关代码对比

system_mysharecallback 参数类型说明

根据项目中的使用场景:

type值 用途 位置 备注
type: 2 分享游戏/加钟 GameStatus.vue (extendHangUp)
batchTaskStore.js (分享游戏)
batchTaskStore.js (加钟)
正确的加钟参数
type: 3 未明确 旧的加钟实现 导致加钟失败

一键补差中的分享任务

// 位置src/stores/batchTaskStore.js 第1124-1133行
const shareResult = await client.sendWithPromise('system_mysharecallback', {
  isSkipShareCard: true,
  type: 2  // 使用 type: 2
}, 3000)

说明: 一键补差中的"分享游戏"任务也使用 type: 2,进一步证实了参数的正确性。

技术细节

为什么要发送4次

游戏服务器的加钟机制可能需要:

  1. 每次分享回调可延长30分钟
  2. 4次请求共延长2小时
  3. 服务器可能有防作弊机制,需要多次确认

间隔300ms的作用

  1. 避免请求过快导致服务器拒绝
  2. 确保每次请求独立处理
  3. 防止触发反作弊机制

5000ms超时的意义

  1. 连接池模式优化在连接池模式下同时有多个Token在执行任务网络可能拥堵
  2. 避免误判:较长的超时时间减少因网络波动导致的失败
  3. 平衡性能:不会因超时设置过长导致任务卡住

🔧 追加修复串行执行问题v3.13.4.1

问题发现

用户反馈虽然发送了4次请求实际只加了3次钟

问题分析

原代码使用了并发执行

// ❌ 错误的并发执行
const promises = []
for (let i = 0; i < 4; i++) {
  const promise = (async () => {
    if (i > 0) {
      await new Promise(resolve => setTimeout(resolve, 300))
    }
    // 发送请求
  })()
  promises.push(promise)
}
await Promise.all(promises)

实际执行时序:

  • 0ms: 第1个请求发送
  • 300ms: 第2、3、4个请求几乎同时发送

问题根源: 所有promise同时创建并启动导致后3个请求在300ms后几乎同时到达服务器可能被服务器识别为异常请求而拒绝其中1个。

修复方案

改为串行执行

// ✅ 正确的串行执行
const results = []
for (let i = 0; i < 4; i++) {
  // 每次请求前间隔300ms第1次除外
  if (i > 0) {
    await new Promise(resolve => setTimeout(resolve, 300))
  }
  
  const result = await client.sendWithPromise('system_mysharecallback', {
    isSkipShareCard: true,
    type: 2
  }, 5000)
  
  results.push(result)
}

正确的执行时序:

  • 0ms: 第1个请求发送
  • 300ms: 第2个请求发送
  • 600ms: 第3个请求发送
  • 900ms: 第4个请求发送

每次请求都有300ms的间隔,服务器可以正确处理每个请求。


🔄 再次调整并行模式10次加钟v3.13.4.2

用户需求

用户要求:

  1. 恢复使用并行模式(更快)
  2. 增加加钟次数到10次(延长更多时间)

调整方案

最终代码:

// ✅ 并行模式发送10次加钟请求
const promises = []
for (let i = 0; i < 10; i++) {
  const promise = new Promise((resolve) => {
    setTimeout(() => {
      client.sendWithPromise('system_mysharecallback', {
        isSkipShareCard: true,
        type: 2  // 使用 type: 2分享/加钟)
      }, 5000)
        .then(result => {
          console.log(`✅ 第${i+1}/10次加钟请求完成`)
          resolve(result)
        })
        .catch(error => {
          console.warn(`⚠️ 第${i+1}/10次加钟请求失败`)
          resolve(null) // 即使失败也resolve不影响其他请求
        })
    }, i * 300) // 每次间隔300ms启动
  })
  promises.push(promise)
}

const results = await Promise.all(promises)
const successCount = results.filter(r => r !== null).length
console.log(`✅ 加钟操作完成发送10次成功${successCount}次)`)

执行时序:

  • 0ms: 第1个请求发送
  • 300ms: 第2个请求发送
  • 600ms: 第3个请求发送
  • 900ms: 第4个请求发送
  • 1200ms: 第5个请求发送
  • 1500ms: 第6个请求发送
  • 1800ms: 第7个请求发送
  • 2100ms: 第8个请求发送
  • 2400ms: 第9个请求发送
  • 2700ms: 第10个请求发送

优势:

  • 并行执行总耗时约3秒而非串行的4.5秒)
  • 🛡️ 间隔300ms启动避免瞬间压力
  • 🔄 单个失败不影响其他请求
  • 📊 统计成功次数,便于调试

预期效果:

  • 每次加钟30分钟 × 10次 = 延长5小时(如果全部成功)
  • 即使部分失败,也能延长对应时间

最终优化一次性同时发送v3.13.4.3

用户需求

用户要求:去掉所有延迟一次性同时发送10个请求

最终代码

// ⚡ 一次性同时发送10次加钟请求无延迟
const promises = []
for (let i = 0; i < 10; i++) {
  console.log(`🕐 发送第${i+1}/10次加钟请求`)
  const promise = client.sendWithPromise('system_mysharecallback', {
    isSkipShareCard: true,
    type: 2  // 使用 type: 2分享/加钟)
  }, 5000)
    .then(result => {
      console.log(`✅ 第${i+1}/10次加钟请求完成`)
      return result
    })
    .catch(error => {
      console.warn(`⚠️ 第${i+1}/10次加钟请求失败`)
      return null
    })
  
  promises.push(promise)
}

const results = await Promise.all(promises)
const successCount = results.filter(r => r !== null).length
console.log(`✅ 加钟操作完成一次性发送10次成功${successCount}次)`)

特点:

  • 极速执行 - 10个请求在0ms时刻同时发送
  • 🔄 完全并发 - 无任何延迟,最快速度
  • 🛡️ 容错机制 - 单个失败不影响其他请求
  • 📊 成功统计 - 显示实际成功次数

版本信息

最终版本: v3.13.4.3

修复日期: 2025-01-09

修改历程:

  1. v3.13.4:参数修复 type: 3type: 24次请求
  2. v3.13.4.1:改为串行执行,避免并发问题
  3. v3.13.4.2恢复并行模式增加到10次300ms间隔
  4. v3.13.4.3去掉延迟一次性同时发送10次最终版

影响范围:

  • 批量任务 - 加钟功能
  • 完整套餐
  • 快速套餐

兼容性:

  • 传统模式
  • 连接池模式v3.13.0+
  • 100并发优化v3.11.0+

附录:完整修改记录

修改前(错误代码)

const result = await client.sendWithPromise('system_mysharecallback', { 
  type: 3,  // ❌ 错误参数
  isSkipShareCard: true 
}, 5000)

修改后(正确代码)

const promises = []
for (let i = 0; i < 4; i++) {
  const promise = (async () => {
    if (i > 0) {
      await new Promise(resolve => setTimeout(resolve, 300))
    }
    
    const result = await client.sendWithPromise('system_mysharecallback', {
      isSkipShareCard: true,
      type: 2  // ✅ 正确参数
    }, 5000)
    
    return result
  })()
  promises.push(promise)
}

const results = await Promise.all(promises)

总结

本次修复通过对比游戏功能模块和批量任务模块的加钟实现,发现并修正了参数错误:

  1. 核心问题: 参数 type: 3 应改为 type: 2
  2. 次要优化: 从发送1次改为发送4次与游戏模块保持一致
  3. 稳定性提升: 增加请求间隔300ms和详细日志

修复后,批量加钟任务应能正常工作,与游戏内手动加钟效果一致。


相关文档: