Files
xyzw_web_helper/MD说明文件夹/问题修复-批量加钟失败修复v3.13.4.md

482 lines
14 KiB
Markdown
Raw Normal View History

2025-10-17 20:56:50 +08:00
# 问题修复 - 批量加钟任务失败修复 v3.13.4
## 问题描述
**现象:**
- 批量自动化里的加钟任务失败
- 错误信息:`请求超时: system_mysharecallback (5000ms)`
- 实际游戏并没有加钟成功
**影响范围:**
- 批量任务中的 `addClock`(加钟)任务
- 用户在批量自动化中无法成功加钟,影响挂机奖励的获取
## 问题分析
### 原因定位
通过对比游戏功能模块和批量任务模块的加钟实现,发现了关键差异:
#### 1. 批量任务的加钟实现(修复前)
```javascript
// 位置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. 游戏功能模块的加钟实现(正确的)
```javascript
// 位置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: 3``type: 2`
2. **请求次数:** 1次 → 4次
3. **请求间隔:** 增加每次间隔300ms
4. **保持超时:** 维持5000ms超时避免连接池模式下的网络拥堵
### 修复后的代码
```javascript
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)<br>batchTaskStore.js (分享游戏)<br>batchTaskStore.js (加钟) | ✅ 正确的加钟参数 |
| `type: 3` | 未明确 | ~~旧的加钟实现~~ | ❌ 导致加钟失败 |
### 一键补差中的分享任务
```javascript
// 位置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次钟**。
### 问题分析
原代码使用了**并发执行**
```javascript
// ❌ 错误的并发执行
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个。
### 修复方案
改为**串行执行**
```javascript
// ✅ 正确的串行执行
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次**(延长更多时间)
### 调整方案
**最终代码:**
```javascript
// ✅ 并行模式发送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个请求**
### 最终代码
```javascript
// ⚡ 一次性同时发送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: 3``type: 2`4次请求
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+
## 附录:完整修改记录
### 修改前(错误代码)
```javascript
const result = await client.sendWithPromise('system_mysharecallback', {
type: 3, // ❌ 错误参数
isSkipShareCard: true
}, 5000)
```
### 修改后(正确代码)
```javascript
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和详细日志
修复后,批量加钟任务应能正常工作,与游戏内手动加钟效果一致。
---
**相关文档:**
- [连接池模式 v3.13.0](./架构优化-100并发稳定运行方案v3.13.0.md)
- [问题修复-加钟超时和发车错误码v3.11.20](./问题修复-加钟超时和发车错误码v3.11.20.md)
- [批量自动化-超时延迟配置表v3.11](./批量自动化-超时延迟配置表v3.11.md)