Files
glm-rush/README.md

174 lines
8.9 KiB
Markdown
Raw 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.6
> **基于 [qtaxm/glm-rush](https://github.com/qtaxm/glm-rush) v4.0 修改**
> 原作者qtaxm | 原版协议MIT
> 本版本v4.6)继承 MIT 协议,代码可自由使用、修改、分发。
智谱 GLM Coding Plan 限时抢购自动化脚本Tampermonkey 油猴脚本)
## 功能特点
- **极速并发引擎** — 双模式并发:极速模式 10 路 + 普通模式 5 路,任一成功立即取消其余
- **自适应间隔** — 前 20 次零延迟爆发 → 30ms 快速重试 → 100ms 随机间隔,带 ±30% 抖动
- **preview + check 双重校验 + 金额零值过滤** — 获取 bizId 后调用 check 确认有效EXPIRE 或金额为 0 则立即重试
- **4 层支付恢复** — 暴力清弹窗 → 缓存重点击 → 直接获取支付链接 → 兜底提醒
- **反检测** — 请求指纹随机化X-Request-Id / X-Timestamp / Accept-Language、JSON.parse 定向拦截、fetch/XHR toString 伪装、Shadow DOM 面板隔离
- **高精度定时** — requestAnimationFrame + performance.now精度 ±2ms提前 2 秒触发补偿 RTT
- **配置持久化** — localStorage 保存所有配置sessionStorage 保存捕获的请求(含版本号),刷新不丢失
- **弹窗自动恢复** — MutationObserver 监控弹窗,自动关闭并重新触发,最多 3 次
- **定时触发预热** — 开售前 5 分钟空 POST 预热连接池
- **5 分钟捡漏模式** — 达到重试上限后若在 10:05 内,自动降频捡漏退票
- **快捷键** — `Alt+S` 开始 / `Alt+X` 停止 / `Alt+H` 隐藏面板
## 安装
### 方式 1从本仓库 Raw 安装
1. 安装 [Tampermonkey](https://www.tampermonkey.net/) 浏览器扩展
2. 点击安装:[glm-rush-v4.user.js](https://gitea.ephron.ren/ephron_ren/glm-rush/raw/branch/master/glm-rush-v4.user.js)
3. Tampermonkey 自动弹出安装页面,点击 **安装**
### 方式 2手动安装
1. 复制 `glm-rush-v4.user.js` 的内容
2. 打开 Tampermonkey → 添加新脚本 → 粘贴 → 保存
## 使用方法
1. 打开 [GLM Coding 页面](https://bigmodel.cn/glm-coding)
2. 右上角出现控制面板
3. **手动点一次购买按钮** — 脚本捕获请求参数(面板显示"已捕获"
4. 选择触发方式:
- **主动抢购**:立即开始并发重试
- **定时触发**:设定时间(默认 10:00:00到点提前 2 秒自动开始
5. 抢购成功后自动弹出支付页面
## 配置参数
| 参数 | 默认值 | 说明 |
|------|--------|------|
| 并发路数 | 5 | 普通模式同时发起的请求数 |
| 极速并发 | 10 | 前 5 秒的高并发路数 |
| 极速时长 | 5s | 高并发持续多久 |
| 最大重试 | 2000 | 达到上限后停止 |
| 爆发次数 | 20 | 前 N 次零延迟 |
| 快速间隔 | 30ms | 爆发后的重试间隔 |
| 慢速间隔 | 100ms | 后期重试间隔中值 |
| 抖动 | ±30% | 间隔随机化幅度 |
| 提前触发 | 2s | 定时触发提前几秒开始,补偿网络 RTT |
| 抢购时间 | 10:00:00 | 每天定时触发时间 |
## 快捷键
| 快捷键 | 功能 |
|--------|------|
| `Alt + S` | 启动主动抢购 |
| `Alt + X` | 停止所有操作(含当前 batch 所有请求) |
| `Alt + H` | 隐藏/显示面板 |
## 工作原理
```
用户点击购买 → 脚本捕获 preview 请求
┌── 极速模式 (前5秒) ──┐
│ 10路并发 × 零延迟 │
└──────────────────────┘
┌── 普通模式 ──────────┐
│ 5路并发 × 自适应间隔 │
└──────────────────────┘
任一获取 bizId
check 校验 bizId
├── EXPIRE → 立即重试
├── 金额=0 → 立即重试(空单过滤)
└── 通过 → 成功!
4 层支付恢复
├── 清除错误弹窗/遮罩
├── 缓存响应 + 重点击购买
├── 直接获取支付链接
└── 兜底提醒
```
## 更新日志
### v4.6 (2026-04-18) — 本版本
#### 严重缺陷修复Safety
- **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)
- **修复** `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) — 原版 qtaxm/glm-rush
- 并发重试Promise.race 变体)
- 自适应间隔(爆发→快速→随机抖动)
- 反检测定向拦截、toString 伪装、Shadow DOM
- 高精度定时rAF + performance.now
- 配置/请求持久化
- MutationObserver 弹窗监控
- 快捷键、离开保护
### v3.2 (原版 qtaxm/glm-rush)
- 单线程串行重试
- preview + check 双重校验
- 错误弹窗自动恢复
- 浮动控制面板
## License
MIT License - 本版本基于 [qtaxm/glm-rush](https://github.com/qtaxm/glm-rush) 修改,继承 MIT 协议。