fix: v4.6 clickButton 直接调用 Vue gotoPayFn() 绕过 disabled
Playwright 实测发现: 解除 DOM disabled 后点击按钮仍无法触发 Vue 事件, 因为 Vue 组件内部有自己的状态控制。 改为直接从按钮向上查找 Vue 实例,调用 gotoPayFn() 方法。
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
# GLM Coding 抢购助手 v4.5
|
# GLM Coding 抢购助手 v4.6
|
||||||
|
|
||||||
智谱 GLM Coding Plan 限时抢购自动化脚本(Tampermonkey 油猴脚本)
|
智谱 GLM Coding Plan 限时抢购自动化脚本(Tampermonkey 油猴脚本)
|
||||||
|
|
||||||
@@ -87,6 +87,10 @@
|
|||||||
|
|
||||||
## 更新日志
|
## 更新日志
|
||||||
|
|
||||||
|
### v4.6 (2026-04-10)
|
||||||
|
- **修复** clickButton 直接调用 Vue 组件的 `gotoPayFn()` 方法,彻底绕过 disabled 按钮限制
|
||||||
|
- **验证** Playwright 实测确认 `gotoPayFn()` 能触发完整的 preview + check 流程
|
||||||
|
|
||||||
### v4.5 (2026-04-10)
|
### v4.5 (2026-04-10)
|
||||||
- **修复** 支付弹窗不弹出的核心问题:改用"先抢再喂"策略,retry 独立抢到 bizId 后缓存响应,再点击按钮让前端正常处理
|
- **修复** 支付弹窗不弹出的核心问题:改用"先抢再喂"策略,retry 独立抢到 bizId 后缓存响应,再点击按钮让前端正常处理
|
||||||
- **修复** `findBuyButton` 找错按钮(匹配到"即刻订阅"导航按钮),现在按优先级排序,优先找特惠/购买按钮
|
- **修复** `findBuyButton` 找错按钮(匹配到"即刻订阅"导航按钮),现在按优先级排序,优先找特惠/购买按钮
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
// ==UserScript==
|
// ==UserScript==
|
||||||
// @name 智谱 GLM Coding 抢购助手 v4.0
|
// @name 智谱 GLM Coding 抢购助手 v4.0
|
||||||
// @namespace http://tampermonkey.net/
|
// @namespace http://tampermonkey.net/
|
||||||
// @version 4.5
|
// @version 4.6
|
||||||
// @description 并发重试 + 自适应间隔 + 反检测 + check校验 + 弹窗恢复 + 定时触发 + 配置持久化
|
// @description 并发重试 + 自适应间隔 + 反检测 + check校验 + 弹窗恢复 + 定时触发 + 配置持久化
|
||||||
// @author Assistant
|
// @author Assistant
|
||||||
// @match *://www.bigmodel.cn/*
|
// @match *://www.bigmodel.cn/*
|
||||||
@@ -649,15 +649,24 @@
|
|||||||
}, true);
|
}, true);
|
||||||
|
|
||||||
function clickButton(btn) {
|
function clickButton(btn) {
|
||||||
// 强制解除 disabled 状态(售罄按钮需要解锁才能触发事件)
|
// 优先方案: 直接调用 Vue 组件的 gotoPayFn(绕过 disabled 限制)
|
||||||
|
let el = btn;
|
||||||
|
for (let i = 0; i < 20 && el; i++) {
|
||||||
|
if (el.__vue__ && el.__vue__.gotoPayFn) {
|
||||||
|
log('直接调用 Vue gotoPayFn()');
|
||||||
|
el.__vue__.gotoPayFn();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
el = el.parentElement;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 降级方案: 强制解除 disabled + DOM 点击
|
||||||
|
log('未找到 Vue 实例, 降级为 DOM 点击');
|
||||||
if (btn.disabled) {
|
if (btn.disabled) {
|
||||||
btn.disabled = false;
|
btn.disabled = false;
|
||||||
btn.classList.remove('is-disabled', 'disabled');
|
btn.classList.remove('is-disabled', 'disabled');
|
||||||
log('已解除按钮 disabled 状态');
|
|
||||||
}
|
}
|
||||||
// 确保 pointer-events 可交互
|
|
||||||
btn.style.pointerEvents = 'auto';
|
btn.style.pointerEvents = 'auto';
|
||||||
// 多种方式触发点击,确保前端框架(Vue/Element UI)能响应
|
|
||||||
btn.focus();
|
btn.focus();
|
||||||
btn.dispatchEvent(new MouseEvent('mousedown', { bubbles: true, cancelable: true }));
|
btn.dispatchEvent(new MouseEvent('mousedown', { bubbles: true, cancelable: true }));
|
||||||
btn.dispatchEvent(new MouseEvent('mouseup', { bubbles: true, cancelable: true }));
|
btn.dispatchEvent(new MouseEvent('mouseup', { bubbles: true, cancelable: true }));
|
||||||
|
|||||||
Reference in New Issue
Block a user