Files
glm-rush/README.md

196 lines
9.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# GLM Coding 抢购助手 v4.6OpenClaw Mod
智谱 GLM Coding Plan 限时抢购自动化脚本Tampermonkey 油猴脚本)
基于 [qtaxm/glm-rush](https://github.com/qtaxm/glm-rush) v4.6 修改
## vs 原版的差异
本版本在原版基础上增加了以下改进:
| 修改 | 说明 |
|------|------|
| **A1 空单过滤** | check 返回金额为 0 视为空单,继续重试 |
| **A2 Vue 响应式保护** | patchSoldOut 跳过 `__ob__`/`__v_isVNode`/`__v_isRef` 防止崩溃 |
| **A3 提前触发** | 可配置提前 X 秒触发,补偿 RTT 网络延迟 |
| **A4 捡漏模式** | maxRetry 耗尽后自动降速2路/3s间隔等退票 |
| **A5 全局 soldOut 补丁** | 所有 fetch 响应的 JSON 中移除 isSoldOut/soldOut/isServerBusy/stock=0 |
| **B1 Promise.allSettled** | 并发取消不报 rejected统一 settled 处理 |
| **B2 favicon.ico 时间同步** | 改用 favicon.ico HEAD 请求,采样 3 次取中位数 |
| **B3 预热策略** | 改用空 POST + favicon.ico提前 5 分钟开始预热 |
| **B4 waitForBuyButton** | 按钮轮询最多 8 秒(每 200ms支持 class/文本双策略 |
| **B5 stopAll abort** | 停止时主动 abort 所有进行中的 AbortController |
| **B6 getVueRoot** | Vue 2/3 兼容获取根实例辅助函数 |
| **B7 支付弹窗恢复重置** | 检测到支付弹窗时重置 recoveryAttempts |
| **C1 555 视为 EXPIRE** | code=555 系统繁忙加入立即重试列表429 退避上限 8 秒 |
| **C2 连续售罄比例判断** | 60% 售罄即计数,非全量才计数 |
| **C3 rAF 精度提升** | 最后 1 秒切换 requestAnimationFramesetInterval/rAF 互斥 |
| **C4 sessionStorage 版本校验** | 写入 `__v:1`,读取时校验版本,不一致则清除 |
| **C5 history 路由劫持** | pushState/replaceState 拦截,离开确认提示 |
| **C6 fakeXHR setProp** | try-catch + Object.defineProperty 双重保护属性赋值 |
| **D1 放票时间警告** | 面板显示「⚠️ 每次确认放票时间」提示 |
| **D2 dismissDialog Escape** | 弹窗关闭前优先发送 Escape 键盘事件 |
| **D3 getDelay 参数名** | 参数名从 `attempt` 改为 `round`(语义更准确) |
| **D4 VERSION 常量** | 统一 `const VERSION = '4.6'` 变量管理 |
## 功能特点
- **极速并发引擎** — 双模式并发:极速模式 10 路 + 普通模式 5 路,任一成功立即取消其余
- **自适应间隔** — 前 20 次零延迟爆发 → 30ms 快速重试 → 100ms 随机间隔,带 ±30% 抖动
- **preview + check 双重校验** — 获取 bizId 后调用 check 确认有效EXPIRE/空单 立即重试
- **4 层支付恢复** — 暴力清弹窗 → 缓存重点击 → 直接获取支付链接 → 兜底提醒
- **反检测** — 请求指纹随机化X-Request-Id / X-Timestamp / Accept-Language、JSON.parse 定向拦截、fetch/XHR toString 伪装、Shadow DOM 面板隔离
- **高精度定时** — requestAnimationFrame + performance.now精度 ±2ms提前触发补偿 RTT
- **配置持久化** — localStorage 保存所有配置sessionStorage 保存捕获的请求(带版本校验)
- **弹窗自动恢复** — MutationObserver 监控弹窗,自动关闭并重新触发,最多 3 次
- **捡漏模式** — 抢购失败后自动降速等待退票
- **离开保护** — 路由跳转时确认是否中断抢购
- **快捷键** — `Alt+S` 开始 / `Alt+X` 停止 / `Alt+H` 隐藏面板
## 安装
### 方式 1从 Gitea Raw 安装(推荐)
1. 安装 [Tampermonkey](https://www.tampermonkey.net/) 浏览器扩展
2. 点击安装:[glm-rush-v4.user.js](https://gitea.ephron.ren/OpenClaw/glm-rush/raw/branch/master/glm-rush-v4.user.js)
3. Tampermonkey 自动弹出安装页面,点击 **安装**
### 方式 2从 GitHub Raw 安装(原版)
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)(原版)
## 使用方法
1. 打开 [GLM Coding 页面](https://bigmodel.cn/glm-coding)
2. 右上角出现控制面板
3. **手动点一次购买按钮** — 脚本捕获请求参数(面板显示"已捕获"
4. 选择触发方式:
- **主动抢购**:立即开始并发重试
- **定时触发**:设定时间(默认 10:00:00到点自动开始
5. 抢购成功后自动弹出支付页面
## 配置参数
| 参数 | 默认值 | 说明 |
|------|--------|------|
| 并发路数 | 5 | 普通模式同时发起的请求数 |
| 极速并发 | 10 | 前 5 秒的高并发路数 |
| 极速时长 | 5s | 高并发持续多久 |
| 最大重试 | 2000 | 达到上限后进入捡漏模式 |
| 爆发次数 | 20 | 前 N 次零延迟 |
| 快速间隔 | 30ms | 爆发后的重试间隔 |
| 慢速间隔 | 100ms | 后期重试间隔中值 |
| 抖动 | ±30% | 间隔随机化幅度 |
| 抢购时间 | 10:00:00 | 每天定时触发时间 |
| 提前触发 | 2s | 开抢前提前 X 秒触发(补偿 RTT |
## 快捷键
| 快捷键 | 功能 |
|--------|------|
| `Alt + S` | 启动主动抢购 |
| `Alt + X` | 停止所有操作 |
| `Alt + H` | 隐藏/显示面板 |
## 工作原理
```
用户点击购买 → 脚本捕获 preview 请求
┌── 极速模式 (前5秒) ──┐
│ 10路并发 × 零延迟 │
└──────────────────────┘
┌── 普通模式 ──────────┐
│ 5路并发 × 自适应间隔 │
└──────────────────────┘
任一获取 bizId
check 校验 bizId
├── EXPIRE/空单 → 立即重试
└── 通过 → 成功!
4 层支付恢复
├── 清除错误弹窗/遮罩
├── 缓存响应 + 重点击购买
├── 直接获取支付链接
└── 兜底提醒
超过 maxRetry 且 < 5分钟
捡漏模式2路/3s间隔
```
## 更新日志
### v4.6-mod (2026-04-18)
基于 qtaxm/glm-rush v4.6OpenClaw 新增修改:
- **A1** check 返回金额为 0 视为空单,继续重试
- **A2** patchSoldOut 增加 Vue 响应式对象保护
- **A3** 支持提前触发(补偿 RTT
- **A4** maxRetry 耗尽后自动进入捡漏模式
- **A5** 全局 fetch 响应 JSON soldOut/isServerBusy/stock=0 补丁
- **B1** Promise.allSettled 统一处理并发取消
- **B2** favicon.ico HEAD 时间同步,采样 3 次取中位数
- **B3** 预热改空 POST提前 5 分钟开始
- **B4** waitForBuyButton 异步轮询(最多 8 秒)
- **B5** stopAll 主动 abort 所有 AbortController
- **B6** getVueRoot Vue 2/3 兼容辅助函数
- **B7** 支付弹窗出现时重置 recoveryAttempts
- **C1** code=555 系统繁忙视为 EXPIRE 立即重试429 退避上限 8 秒
- **C2** 连续售罄改为比例判断60% 即计数)
- **C3** rAF 精度提升,最后 1 秒切换 requestAnimationFrame
- **C4** sessionStorage 版本校验__v:1
- **C5** history 路由劫持,离开时确认
- **C6** fakeXHR setProp 双重保护属性赋值
- **D1** 面板增加放票时间警告提示
- **D2** dismissDialog 优先发送 Escape 事件
- **D3** getDelay 参数名语义修正
- **D4** VERSION 常量统一版本管理
### v4.6 (2026-04-10) 原版
- **修复** 支付弹窗不弹出 — 根因: 前端 `payComponent.isServerBusy=true` 阻止 `payPreviewFn` 发请求
- **新增** `patchSoldOut` 增加 `isServerBusy` 拦截JSON.parse 层)
- **新增** `patchVueServerBusy` 兜底:定时扫描 Vue 组件树,直接 patch `isServerBusy=false`
- **新增** `forcePayDialog` 兜底:抢购成功 1.5s 后若弹窗未出现,直接设置 Vue `payDialogVisible=true`
### v4.5 (2026-04-10) 原版
- **修复** `findBuyButton` 找错按钮(匹配到"即刻订阅"导航按钮),优先找 `buy-btn` 类按钮
### v4.4 (2026-04-09) 原版
- **新增** 极速模式:前 5 秒 10 路并发,之后降为 5 路
- **新增** 请求指纹随机化X-Request-Id / X-Timestamp / Accept-Language 权重随机)
- **新增** 余额支付方式支持
- **优化** 并发数从 3 路提升到 5 路(普通模式)
- **优化** 最大重试从 500 提升到 2000
- **优化** 爆发次数从 10 提升到 20快速间隔从 50ms 降到 30ms
- **优化** 连续售罄 / 限流智能退避
### v4.1 (2026-04-08) 原版
- **修复** 售罄状态下按钮不可点击的问题(恢复全局 JSON.parse patch
- **修复** 支付弹窗不弹出的问题4 层恢复策略)
- **修复** `@match` 规则不匹配 `bigmodel.cn`(无 www
- **修复** 原型链污染风险Object.keys + WeakSet
- **修复** HTTP 401/403 会话过期检测
- **修复** 限流退避使用错误的计数器
- **修复** stats.errors 永远显示 0
- **修复** Alt+H 快捷键在 Shadow DOM 中失效
### v4.0 (2026-04-08) 原版
- 并发重试Promise.race 变体)
- 自适应间隔(爆发→快速→随机抖动)
- 反检测定向拦截、toString 伪装、Shadow DOM
- 高精度定时rAF + performance.now
- 配置/请求持久化
- MutationObserver 弹窗监控
- 快捷键、离开保护
## License
MIT License
## 致谢
- 原作者 [qtaxm/glm-rush](https://github.com/qtaxm/glm-rush)