添加原仓库引用 + 详细变更日志 (MIT)

This commit is contained in:
ephron
2026-04-18 22:08:51 +08:00
parent 04dbfd3b7b
commit d1791e709d

View File

@@ -1,25 +1,31 @@
# GLM Coding 抢购助手 v4.6 # GLM Coding 抢购助手 v4.6
> **基于 [qtaxm/glm-rush](https://github.com/qtaxm/glm-rush) v4.0 修改**
> 原作者qtaxm | 原版协议MIT
> 本版本v4.6)继承 MIT 协议,代码可自由使用、修改、分发。
智谱 GLM Coding Plan 限时抢购自动化脚本Tampermonkey 油猴脚本) 智谱 GLM Coding Plan 限时抢购自动化脚本Tampermonkey 油猴脚本)
## 功能特点 ## 功能特点
- **极速并发引擎** — 双模式并发:极速模式 10 路 + 普通模式 5 路,任一成功立即取消其余 - **极速并发引擎** — 双模式并发:极速模式 10 路 + 普通模式 5 路,任一成功立即取消其余
- **自适应间隔** — 前 20 次零延迟爆发 → 30ms 快速重试 → 100ms 随机间隔,带 ±30% 抖动 - **自适应间隔** — 前 20 次零延迟爆发 → 30ms 快速重试 → 100ms 随机间隔,带 ±30% 抖动
- **preview + check 双重校验** — 获取 bizId 后调用 check 确认有效EXPIRE 立即重试 - **preview + check 双重校验 + 金额零值过滤** — 获取 bizId 后调用 check 确认有效EXPIRE 或金额为 0 则立即重试
- **4 层支付恢复** — 暴力清弹窗 → 缓存重点击 → 直接获取支付链接 → 兜底提醒 - **4 层支付恢复** — 暴力清弹窗 → 缓存重点击 → 直接获取支付链接 → 兜底提醒
- **反检测** — 请求指纹随机化X-Request-Id / X-Timestamp / Accept-Language、JSON.parse 定向拦截、fetch/XHR toString 伪装、Shadow DOM 面板隔离 - **反检测** — 请求指纹随机化X-Request-Id / X-Timestamp / Accept-Language、JSON.parse 定向拦截、fetch/XHR toString 伪装、Shadow DOM 面板隔离
- **高精度定时** — requestAnimationFrame + performance.now精度 ±2ms - **高精度定时** — requestAnimationFrame + performance.now精度 ±2ms,提前 2 秒触发补偿 RTT
- **配置持久化** — localStorage 保存所有配置sessionStorage 保存捕获的请求,刷新不丢失 - **配置持久化** — localStorage 保存所有配置sessionStorage 保存捕获的请求(含版本号),刷新不丢失
- **弹窗自动恢复** — MutationObserver 监控弹窗,自动关闭并重新触发,最多 3 次 - **弹窗自动恢复** — MutationObserver 监控弹窗,自动关闭并重新触发,最多 3 次
- **定时触发预热** — 开售前 5 分钟空 POST 预热连接池
- **5 分钟捡漏模式** — 达到重试上限后若在 10:05 内,自动降频捡漏退票
- **快捷键** — `Alt+S` 开始 / `Alt+X` 停止 / `Alt+H` 隐藏面板 - **快捷键** — `Alt+S` 开始 / `Alt+X` 停止 / `Alt+H` 隐藏面板
## 安装 ## 安装
### 方式 1 GitHub Raw 安装(推荐) ### 方式 1本仓库 Raw 安装
1. 安装 [Tampermonkey](https://www.tampermonkey.net/) 浏览器扩展 1. 安装 [Tampermonkey](https://www.tampermonkey.net/) 浏览器扩展
2. 点击安装:[glm-rush-v4.user.js](https://raw.githubusercontent.com/qtaxm/glm-rush/master/glm-rush-v4.user.js) 2. 点击安装:[glm-rush-v4.user.js](https://gitea.ephron.ren/ephron_ren/glm-rush/raw/branch/master/glm-rush-v4.user.js)
3. Tampermonkey 自动弹出安装页面,点击 **安装** 3. Tampermonkey 自动弹出安装页面,点击 **安装**
### 方式 2手动安装 ### 方式 2手动安装
@@ -34,7 +40,7 @@
3. **手动点一次购买按钮** — 脚本捕获请求参数(面板显示"已捕获" 3. **手动点一次购买按钮** — 脚本捕获请求参数(面板显示"已捕获"
4. 选择触发方式: 4. 选择触发方式:
- **主动抢购**:立即开始并发重试 - **主动抢购**:立即开始并发重试
- **定时触发**:设定时间(默认 10:00:00到点自动开始 - **定时触发**:设定时间(默认 10:00:00到点提前 2 秒自动开始
5. 抢购成功后自动弹出支付页面 5. 抢购成功后自动弹出支付页面
## 配置参数 ## 配置参数
@@ -49,6 +55,7 @@
| 快速间隔 | 30ms | 爆发后的重试间隔 | | 快速间隔 | 30ms | 爆发后的重试间隔 |
| 慢速间隔 | 100ms | 后期重试间隔中值 | | 慢速间隔 | 100ms | 后期重试间隔中值 |
| 抖动 | ±30% | 间隔随机化幅度 | | 抖动 | ±30% | 间隔随机化幅度 |
| 提前触发 | 2s | 定时触发提前几秒开始,补偿网络 RTT |
| 抢购时间 | 10:00:00 | 每天定时触发时间 | | 抢购时间 | 10:00:00 | 每天定时触发时间 |
## 快捷键 ## 快捷键
@@ -56,7 +63,7 @@
| 快捷键 | 功能 | | 快捷键 | 功能 |
|--------|------| |--------|------|
| `Alt + S` | 启动主动抢购 | | `Alt + S` | 启动主动抢购 |
| `Alt + X` | 停止所有操作 | | `Alt + X` | 停止所有操作(含当前 batch 所有请求) |
| `Alt + H` | 隐藏/显示面板 | | `Alt + H` | 隐藏/显示面板 |
## 工作原理 ## 工作原理
@@ -76,6 +83,7 @@
check 校验 bizId check 校验 bizId
├── EXPIRE → 立即重试 ├── EXPIRE → 立即重试
├── 金额=0 → 立即重试(空单过滤)
└── 通过 → 成功! └── 通过 → 成功!
4 层支付恢复 4 层支付恢复
@@ -87,11 +95,41 @@
## 更新日志 ## 更新日志
### v4.6 (2026-04-10) ### v4.6 (2026-04-18) — 本版本
- **修复** 支付弹窗不弹出 — 根因: 前端 `payComponent.isServerBusy=true` 阻止 `payPreviewFn` 发请求
- **新增** `patchSoldOut` 增加 `isServerBusy` 拦截JSON.parse 层 #### 严重缺陷修复Safety
- **新增** `patchVueServerBusy` 兜底:定时扫描 Vue 组件树,直接 patch `isServerBusy=false`
- **新增** `forcePayDialog` 兜底:抢购成功 1.5s 后若弹窗未出现,直接设置 Vue `payDialogVisible=true` - **A1 空单未被完整过滤**check 校验通过后增加金额字段零值判断,金额为 0 视为空单继续重试,防止"弹出二维码但金额为 0"的无效订单
- **A2 patchSoldOut 触发 Vue 响应式对象循环引用**:增加 `__ob__` / `__v_isVNode` / `__v_isRef` 跳过逻辑,防止调用栈溢出
- **A3 定时触发时机错误**:增加 `preAdvanceSec` 配置项,提前 2 秒触发补偿网络 RTT
- **A4 错过 10:0010:05 捡漏窗口**:达到 maxRetry 后自动切换低频捡漏模式2 并发/3 秒间隔5 分钟后才彻底停止
- **A5 Fetch 拦截只处理 preview 接口**fetch 拦截器对所有 JSON 响应做文本级正则替换,防止页面初始化时 isSoldOut 无法解除
#### 高优先级优化Performance
- **B1 并发取消误计错误触发退避**:改用 Promise.allSettled + filter 排除"已取消",避免批量取消触发 3 秒假退避
- **B2 时间同步用业务接口有风险**:改用 favicon.ico HEAD 请求做时间同步,采样 3 次取中位数
- **B3 预热用 HEAD 请求触发 405**:改用空 POST 预热 preview 连接池,次数从 3 次增到 5 次,时机从提前 3 秒改为 5 分钟
- **B4 buy-btn 类名硬编码不稳定**:增加 waitForBuyButton 异步轮询(最多 8 秒),支持"特惠订购"等文本匹配多种策略
- **B5 stopAll 无法中止当前 batch**:维护 `_activeControllers` 数组stopAll 时主动 abort 所有当前活跃请求
- **B6 Vue 3 兼容**:新增 `getVueRoot` 函数兼容 Vue 2`__vue__`)和 Vue 3`__vue_app__`)两种访问方式
- **B7 recoveryAttempts 在支付弹窗出现后未重置**:支付弹窗真正出现时重置计数器,允许用户误操作后继续自动恢复
#### 中优先级优化Reliability
- **C1 code=555 退避时间过长**code=555 和 EXPIRE 视为立即重试无延迟429 限流退避上限从 16 秒缩短到 8 秒
- **C2 consecutiveSoldOut 判断过严**:从"全部售罄才计数"改为"超过 60% 即计数",混合网络场景更合理
- **C3 定时器精度依赖 setInterval 高负载漂移**:剩余 1 秒内切换到 requestAnimationFrame 精确对齐
- **C4 sessionStorage 无版本号旧格式静默出错**:添加 `CAPTURE_VER=1`,版本不匹配时清除旧数据
- **C5 beforeunload 无法拦截 SPA 内部路由跳转**:劫持 `history.pushState` / `history.replaceState`,路由切换时弹窗确认
- **C6 fakeXHR 重复拦截抛出 TypeError**:新增 `setProp` 辅助函数用 try-catch + Object.defineProperty 双重保护
#### 低优先级优化Polish
- **D1 默认 rushTime 写死 10:00:00 造成误解**:面板增加"⚠️ 每次确认放票时间"提示
- **D2 dismissDialog 强制 display:none 破坏 Vue 状态**:优先发送 Escape 事件让 Vue 自己处理300ms 降级再强制隐藏
- **D3 getDelay 参数语义混乱**:变量名从 `attempt` 改为 `roundNum`,语义从"请求序号"改为"轮次"
- **D4 版本号不一致**:定义 `VERSION='4.6'` 常量,统一控制台日志和面板标题
### v4.5 (2026-04-10) ### v4.5 (2026-04-10)
- **修复** `findBuyButton` 找错按钮(匹配到"即刻订阅"导航按钮),优先找 `buy-btn` 类按钮 - **修复** `findBuyButton` 找错按钮(匹配到"即刻订阅"导航按钮),优先找 `buy-btn` 类按钮
@@ -115,7 +153,7 @@
- **修复** stats.errors 永远显示 0 - **修复** stats.errors 永远显示 0
- **修复** Alt+H 快捷键在 Shadow DOM 中失效 - **修复** Alt+H 快捷键在 Shadow DOM 中失效
### v4.0 (2026-04-08) ### v4.0 (2026-04-08) — 原版 qtaxm/glm-rush
- 并发重试Promise.race 变体) - 并发重试Promise.race 变体)
- 自适应间隔(爆发→快速→随机抖动) - 自适应间隔(爆发→快速→随机抖动)
- 反检测定向拦截、toString 伪装、Shadow DOM - 反检测定向拦截、toString 伪装、Shadow DOM
@@ -124,7 +162,7 @@
- MutationObserver 弹窗监控 - MutationObserver 弹窗监控
- 快捷键、离开保护 - 快捷键、离开保护
### v3.2 (原版) ### v3.2 (原版 qtaxm/glm-rush)
- 单线程串行重试 - 单线程串行重试
- preview + check 双重校验 - preview + check 双重校验
- 错误弹窗自动恢复 - 错误弹窗自动恢复
@@ -132,4 +170,4 @@
## License ## License
MIT MIT License - 本版本基于 [qtaxm/glm-rush](https://github.com/qtaxm/glm-rush) 修改,继承 MIT 协议。