48 Commits
Author SHA1 Message Date
OLmatter 9c4745ae22 fix(v23.17): 405 冷却 0=不冷却 现可生效(之前 \&\& 守卫会落到 20000 默认值)
两处 (CFG.RISK_CONTROL_COOLDOWN_MS || 20000) 改成 if (cd > 0) 显式判断。
现在配置为 0 真的能关闭冷却机制,脚本立即重试。
2026-07-30 10:27:13 +08:00
OLmatter c1cfa4a6e0 i18n(v23.16): 状态栏中文化——auto-close disabled 提示 2026-07-30 10:23:06 +08:00
OLmatter f4d5faf1fc feat(v23.15): 风控冷却状态栏加可配置入口提示
状态栏显示「🛑 风控冷却中(剩 Xs),可在配置面板「405 风控冷却」调整」,
告诉用户冷却时间在哪改。配置入口:油猴菜单 → 打开配置面板 → 自动关闭
无效支付/限流弹窗下方 → 「405 风控冷却」输入框(默认 20000ms)。
2026-07-30 10:15:28 +08:00
OLmatter d7449a9d0c fix(v23.14): 405 风控冷却优先级 bug——小飞机警告盖过冷却提示
群反馈 9:47 抢购时'小飞机提示脚本不管用'。截图证据:preview 先 200(触发小飞机警告),
后 405(v23.13 识别到了)但状态栏还显示小飞机警告——用户看不到'风控冷却中(剩 Xs)',
以为脚本卡死。

根因:v23.13 只在 1530 路径(isPayDialog + busy/sold_out/risk_control)处理了 risk_control,
1081/1479 路径(isAirplanePayDialog 情况 D warn)没守卫 PS.result,405 走错分支。

修复:
- 1081 检查 hasAirplaneInDialog 时守卫 PS.result !== 'risk_control'
- 1479 WAITING 阶段小飞机警告加 risk_control 守卫
- 1495 路径(isAirplanePayDialog close)补 risk_control 时设 riskCooldownUntil
- 1495 reason 三元加 risk_control 分支显示'🛑 风控拦截(405),关闭弹窗并冷却'

冷却时间 RISK_CONTROL_COOLDOWN_MS 保持可配置(配置面板「405 风控冷却」输入框,默认 20000ms)。
2026-07-30 10:12:02 +08:00
OLmatter ef932668fc feat(#48 #51): 405 风控识别 + 冷却减速机制 (v23.13)
采纳 wang-zhuo996 在 #48 的诊断:preview fetch 拦截只判 body 里的 d.code,
从不看 r.status,405 落入 else 当 busy 处理 → 立即重试越撞越多 WAF 风控。

改动:
- fetch 拦截加 r.status === 405 分支,单独标记 risk_control
- checkPayDialog: risk_control → close(关弹窗)
- 关弹窗分支识别风控,设 riskCooldownUntil = now + 冷却时长
- tick 主循环冷却检查:冷却期内不点订阅,状态栏显示剩余秒数
- DEF 加 RISK_CONTROL_COOLDOWN_MS = 20000(默认 20 秒)
- 配置面板加「405 风控冷却」输入框(0 = 不冷却)

实现采纳诊断但不合 PR #51/#52(#51 自动重登风险高,#52 405→暂停是退步)。
2026-07-28 00:44:34 +08:00
OLmatter aef6ca65e1 fix: 更新 MiniMax 邀请码 IKhXTPYbQC → KkI58QB9Ip
user.js v23.12。邀请码数组拆分改为 ['KkI','58QB','9Ip'],MINIMAX_TOKEN_PLAN_URL
和油猴菜单「打开 MiniMax Token Plan 优惠入口」同步换码。邀请码字符串只在
initMiniMaxTokenPlanEntry 函数内引用,URL 自动注入逻辑不变。
2026-07-28 00:04:41 +08:00
OLmatter de0c2b475b feat: 注释邀请码注入(活动已下线)(#45 后续 v23.11)
邀请码活动下线后,脚本每次打开页面仍注入 ?ic=...&closedialog=true,
导致页面尝试加载已不存在的邀请码活动页。现注释相关逻辑,GLM_CODING_URL
改为纯 https://www.bigmodel.cn/glm-coding。

注释保留的位置(活动恢复时取消注释即可):
- GLM_DISCOUNT_CODE 常量
- 邀请码版 GLM_CODING_URL
- ensureDiscountEntry 函数定义 + 2 处调用(启动 + tick 循环)
- 未登录注册的邀请码引导

同步更新 README、Greasy Fork 描述、userscripts README、CHANGELOG。
2026-07-09 23:05:56 +08:00
OLmatter 57d98f9b86 feat: Shift+F8 跨同浏览器窗口批量暂停/恢复 (#45)
保留原 F8 单键行为不变,新增 Shift+F8 批量切换同浏览器所有 glm-coding
普通窗口的暂停状态。

- 新增独立广播 key PAUSE_BROADCAST_KEY,与原持久化 RUNTIME_PAUSE_KEY 分离
  (原 key 负责持久化/新窗口继承暂停态,广播 key 只做实时联动)
- 启动时 GM_addValueChangeListener 监听广播,remote 才响应、防回环
- DEF 加 HOTKEY_PAUSE_ALL='Shift+F8',可配置
- 油猴菜单加'批量暂停/恢复(同浏览器)'项
- 配置面板加批量暂停输入框 + bindHotkeyInput
- setRuntimePaused source 标签中文化(快捷键/批量/远程同步)

覆盖范围:同浏览器普通窗口。跨浏览器/无痕受扩展隔离不支持(设计如此)。

Closes #45
2026-07-05 21:59:05 +08:00
OLmatter cf4e594d49 fix(userscript): #40 无效支付页不自动关闭 - 加无金额1.7s兜底 (v23.9)
根因: checkPayDialog 只看接口(busy/sold_out才关),接口success时一律keep,
导致金额为空的无效支付页留着不关——即使开了AUTO_CLOSE_INVALID也没用(该开关
只在verdict=close时生效)。#40用户已开开关仍不关。

修复: 接口非busy/sold_out时读弹窗实际金额:
- 有金额(真支付页)→keep并清计时
- 无金额不立刻关——GLM有时先显示无金额/没抢到、约1s后才弹出真金额订单(#16/#40
  反馈的时序),持续无金额超1.7s宽限期才判无效页close

关键: 不误关真支付页。10个单测覆盖真支付页keep/无金额1s后金额出现keep/
无金额1.7s关/busy直接关/弹窗消失重置计时。

fix #40
2026-06-26 01:42:01 +08:00
OLmatter 1e01fad01e fix(userscript): 误把说明文字当点选目标导致后端 0 boxes (v23.8)
后端日志反复 FAIL: detected 0 boxes, need 3。截图显示"识别:验证码"
——根因是 isPointClickPrompt 兜底分支"3-8汉字即合法"太宽,把验证码容器的
说明文字(aria-label=验证码/安全验证/请点击图中文字/点击进行验证等)当成目标
字传给后端,YOLO 在点选图里找不到这些字 → 0 boxes,每分钟轮询反复刷屏。

修复:
- isPointClickPrompt/findPromptText 加说明性文字黑名单(验证码/安全验证/图形验证/
  请点击/完成验证/进行验证/点击图中/点击进行)
- 收紧 in-page [aria-label] 兜底选择器,限定在腾讯验证码容器内
- 真目标字(山水木/请依次点击)不受影响,11个用例全过
2026-06-26 01:31:07 +08:00
OLmatter 85ec6cf7fc fix(userscript): rush 模式 10:00 到点不点确定 - 熔断焊死修复 (v23.7)
根因: PR#36 验证码熔断(防自激振荡)两个缺陷:
1. captchaSession.stopped 置 true 后无任何重置路径(resetCaptchaSession/
   noteCaptchaSuccess 漏清),10:00 前累积 3 次失败即永久焊死,到点不识别
2. 失败计数跨所有图累计,但自激振荡只在同一张图反复开火时发生

修复:
- noteCaptchaFailure 绑定 bgUrl,换图(腾讯SDK重置/新挑战)即重置 failCount/stopped
- rush 黄金窗口(到点后 holdWindowMs 内)失败只冷却不 hard-stop
- resetCaptchaSession + noteCaptchaSuccess 补齐清 stopped/failCount/failBgUrl

保留 PR#36 对同一张图自激振荡的熔断保护,只消除两个副作用。
15 个单元测试覆盖: 同图熔断/换图重置/rush窗口不焊死/窗口外可恢复。
2026-06-26 01:08:29 +08:00
ygjj 45e9afd78d fix(userscript): 绕开 Chrome LNA + 防止 captcha 死循环自激振荡
本提交叠合两个相关的前端鲁棒性修复,都源自同一个故障复盘(成功几次后
进入 50ms 一发的死循环风暴)。

## 问题一:Chrome 130+ Local Network Access 拦截 fetch

公网 HTTPS 页面(bigmodel.cn)访问本机 loopback(localhost:8888)时,
Chrome 的 LNA 策略会在客户端直接拦截 fetch,根本发不到后端,提示
"Permission was denied for the loopback address space"。

原 `doFetch().catch(() => doGM())` 兜底逻辑虽然能用 GM_xmlhttpRequest
救回来,但每次都浪费 ~200ms 等 fetch 失败、且每次 console 一行红字
噪音、catch 切换瞬间偶尔会撞上业务上下文过期。

修法:localhost 请求**优先走 GM_xmlhttpRequest**(扩展进程,绕过页面
网络栈),fetch 只作为非 Tampermonkey 环境的兜底。同时把 GM onerror
的 [object Object] 改成 status/statusText/error 可读字符串,便于
诊断。补 @connect 127.0.0.1(之前只有 127.0.0.1:8888)。

## 问题二:captcha 状态机的自激振荡死循环

handleCaptchaDirectInPage 的 catch 分支会调用 resetCaptchaSession() 立刻
把 sent 标志清成 false,下一个 50ms tick 立即对同一张图开火,形成
"失败→重置→重打→再失败" 的自激振荡:

- 任何一次瞬时错误(网络、超时、腾讯 SDK 自我刷新换 bgUrl)都会被永久
  放大成持续故障;
- 腾讯 captcha SDK 在被识别为异常流量时会主动重置 widget 换新 bgUrl,
  我们的脚本误以为这是新挑战立刻开打,把后端打爆;
- 同时大量 WebGL context 累积,触发腾讯 SDK 自身的 "Too many active
  WebGL contexts" 警告,雪上加霜。

修法:在 captchaSession 加三道闸门:
1. 单次失败后 1500ms 冷却(inCaptchaCooldown)
2. 连续失败 ≥3 次后彻底熔断停手(isCaptchaStopped),console 打印
   提示用户手动验证 + 刷新页面恢复
3. 成功后清零失败计数(noteCaptchaSuccess),冷却/熔断只追"连续"
   而非"累积"

## 配套文档
README 常见问题加一节 "loopback address space 报错",告诉用户当
GM 通道在某些 Chrome 严苛策略下也被拦时,可以通过 chrome://flags/
#block-insecure-private-network-requests 设为 Disabled 来彻底放行。

## 验证
- 抢购流程跑通后再连续触发 5+ 次验证码,不再出现 "成功几次就开始一直
  报错" 的现象;
- 人为 kill 后端后再触发验证码:失败 1/3 → 冷却 → 失败 2/3 → 冷却 →
  失败 3/3 → 熔断停手,不再 50ms 一发把后端打爆;
- Tampermonkey 环境下 console 不再有 "Permission was denied for
  loopback" 红字。
2026-06-25 05:45:58 +08:00
OLmatter 67b23f4883 perf: speed up main-page captcha detection 1200ms -> 200ms
User reported captcha visible but takes very long to reach backend (OCR itself
only 24ms). The main-page captcha IIFE polled every 1200ms, adding up to 1.2s
delay before processing starts. Reduce to 200ms so detection is near-instant.
The iframe IIFE already runs at 50ms; this brings the main-page path in line.
2026-06-24 22:23:03 +08:00
OLmatter f0694ddc37 fix: stop auto-refresh on '抢购人数过多' - manual refresh only to avoid heavier risk control
When all packages show '抢购人数过多,请刷新再试', the script used to
auto-refresh via location.replace - too aggressive, triggers heavier risk
control. Now it stops and tells the user to manually refresh (F5) until they
see the '特惠订阅' button. State set to DONE so the script pauses cleanly;
page reload on manual refresh restarts the scan fresh.
2026-06-24 21:51:36 +08:00
OLmatter 94886c4ad5 v23.6: recognize '抢购人数过多/刷新再试' as not-buyable (#32); macos tkinter docs (#33)
#32: canBuy/isSoldOut regex was only catching 售罄/补货/暂时; buttons showing
'抢购人数过多,请刷新再试' still passed canBuy -> wasted clicks. Add those +
'请稍后' to the block regex so the script skips and waits instead of clicking
a button that won't go through.

#33: macos-setup.md already had python-tk but framed as optional; Tk is actually
required (one-click-start.command launches a Tk GUI). Reword to make it clear
Tk is required, mention python.org installer bundles tkinter, list the error
messages users see when it's missing.

Also: CRLF fix from earlier, Linux support (PR #34), version bump 23.5 -> 23.6.
2026-06-24 21:20:19 +08:00
OLmatter 611d66a8dc docs(userscript): mention OCR v6 + risk-control workaround in @description
The @description shows on Greasy Fork/Tampermonkey list and update notices -
first thing users see. Add: (1) PP-OCRv6 in parens, (2) the risk-control
workaround one-liner '订阅入口被风控拦截时手动点特惠订阅即可,验证码自动打'.
2026-06-23 22:23:23 +08:00
OLmatter 9de06c1890 v23.5: add configurable first-click delay (random range) before clicking captcha
OCR is now so fast (v6 tens of ms) that the first character click can land
before the captcha DOM finishes rendering/animating -> first click misses.
Previously the inter-click delay only applied between characters; the first
click had zero wait. Add a configurable pre-first-click random delay (default
150-300ms): new CAPTCHA_FIRST_CLICK_DELAY_MIN_MS/MAX_MS config, exposed in the
config panel under '验证码点字延时策略' as '首击前延时', passed through
getCaptchaDirectDelayConfig + normalize, slept at the start of
clickCaptchaDirectCoords. Set to 0 to disable.
2026-06-23 21:30:09 +08:00
OLmatter 5023168f46 fix(pause): F8 resume after manual popup close was stuck waiting 30s
Repro: auto-mode -> F8 pause -> manually close invalid popup -> F8 resume
-> stuck in WAITING for full timeout. Root cause: tick returns immediately
while paused, so taskClickTime stays frozen at the pre-pause click; on resume
elapsed includes pause duration. Worse, the manually-closed popup is gone,
so findRLModal/isPayDialog return null and WAITING has no branch to detect
'the popup I was waiting for is gone' -> falls through to the timeout tail.

Fix in setRuntimePaused(resume): if currently WAITING, reset taskClickTime to
now (re-count elapsed from resume); if no popup present anymore (closed during
pause), drop straight to IDLE to retry instead of waiting out the timeout.
Explains why not-closing-the-popup was fine (popup still detectable on resume).
2026-06-23 05:11:36 +08:00
OLmatter cfa8306c62 v23.4: cap WAITING timeout at 10s, remove unreliable captcha-state checks
The 30s wait (rare but should never happen) came from layered captcha-state
guessing (captchaSeen/GM counter/PS.inProgress branches) that misjudged some
edge cases as 'captcha in progress, wait patiently'. Strip all of it: after
click, just wait for a result (preview response / dialog), hard cap 10s. Normal
recognition (even on slow CPU) finishes in 5-8s; over 10s = stuck = retry.
2026-06-23 05:07:19 +08:00
OLmatter 905b6e6651 v23.3: upgrade OCR to PP-OCRv6_tiny + fix click-no-captcha 15s wait
Backend:
- Default OCR model PP-OCRv5_server_rec -> PP-OCRv6_tiny_rec (~14x faster,
  83ms/img vs 1189ms on 379 real captchas, accuracy still 100%)
- Configurable via config.json ocr_model or env CNCAPTCHA_CPU_OCR_MODEL/GLM_OCR_MODEL
- GUI OCR model choices updated to v6 (tiny/medium) + v5 server fallback
- worker.py: split 3 crops into independent OCR tasks for parallel recognition
- ppocr_worker.py: batch forward (predict_batch_*) + single-crop path
- server.py: partial results aggregation + OCR_MODEL env passthrough
- requirements: paddleocr>=3.7.0 / paddlex>=3.7.0 (v6 requires)

Userscript v23.3:
- Fix: auto-click subscribe then wait 15s when click didn't trigger captcha.
  Synthetic click sometimes gets swallowed by Zhipu frontend (button DOM ready
  but component state machine not ready), no captcha pops up, main loop stuck in
  WAITING until MODAL_WAIT=15000 timeout.
- Fix: use 'iframe got new prompt+bg image' as the signal. iframe increments GM
  counter glm_captcha_seen_seq each time it sees a new captcha (prompt or bg
  changed); main loop records baseline at click time, compares in WAITING -
  counter increased = captcha popped, wait patiently; no increase after 1.5s =
  click didn't trigger captcha, immediately retry subscribe. Counter is
  monotonic, no residue, no timestamp race.
2026-06-23 00:07:51 +08:00
OLmatter 16a7194197 Handle captcha image changes 2026-06-22 04:30:38 +08:00
OLmatter 8d3125972e Fix ready state payment alarm 2026-06-21 06:42:05 +08:00
OLmatter 6dd7e969ae Show backend connection status on startup 2026-06-21 06:39:16 +08:00
OLmatter 469fd205a7 Show opt-in ready state for auto-click 2026-06-21 06:28:18 +08:00
OLmatter c2bffcf428 Make auto-click subscription opt-in 2026-06-21 06:22:22 +08:00
OLmatter e5a1990cb4 Make hotkeys configurable 2026-06-21 05:19:31 +08:00
OLmatter df42a5b170 Add rush control hotkeys 2026-06-21 05:16:28 +08:00
OLmatter c4410fec71 Make rush release conservative 2026-06-21 05:07:48 +08:00
OLmatter 2d0834e4ae Tune rush release timing 2026-06-21 03:48:35 +08:00
OLmatter 7e228a6889 Fix rush mode early request guard 2026-06-21 03:20:21 +08:00
OLmatter 15313a9ab6 Refine rush and captcha timing flow 2026-06-16 04:08:15 +08:00
OLmatterandClaude Opus 4.7 6f00ad245f revert(userscript): 回退到 v8.19 (e07ec9e)
v8.20 / v8.21 / v8.21.x 在用户本地确认主循环失效
(不会自动购买 / 不会自动关弹窗),回退到 PR #17 之前
的 v8.19 黄金时间延长版,这是用户最后确认正常的版本。

高级模式 / ±20% 抖动 / incognito 提示全部撤销(它们是
引入 CFG undefined 死循环的根源,且不再单独发布)。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-15 23:43:30 +08:00
OLmatterandClaude Opus 4.7 03dd2f1e0e fix(userscript): v8.21.3 root-cause captcha loop — CFG undefined in captcha IIFE
真正根因:v8.21 在 captcha IIFE 内的 handleCaptchaDirectInPage 直接引用
CFG.CAPTCHA_CLICK_DELAY,但 captcha IIFE 是独立闭包,没有 CFG。
后端响应成功后走到 click loop 就抛 ReferenceError: CFG is not defined,
catch 块重置 captchaSent=false + lastCaptchaText='' → 50ms tick 死循环。

修复:
- captcha IIFE 顶部通过 GM_getValue('glm_coding_config_v5') 读
  CAPTCHA_CLICK_DELAY / RL_RETRY_DELAY(主 IIFE 写到同一 key),
  预计算 _clickDelay / _rlDelay 常量
- catch 块改为 30s 冷却(window.__glmCaptchaCooldownUntil),
  checkCaptchaPrompt 起手检查冷却直接 return,不再重发同一张图

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-15 23:27:53 +08:00
OLmatterandClaude Opus 4.7 cd64ff6bab fix(userscript): v8.21.2 inline jitter logic, kill captcha-send loop
Root cause: v8.21 added a top-level `function jitterDelay()` helper.
In some Tampermonkey/cache scenarios the helper is undefined inside
the `handleCaptchaDirectInPage` async closure, throwing
`ReferenceError: jitterDelay is not defined`. The catch block then
resets `captchaSent = false` and `lastCaptchaText = ''`, so the
`setInterval(checkCaptchaPrompt, 50)` loop resends the same captcha
to the backend every 50ms ("dead loop sending captcha").

Fix: inline the ±20% jitter math at both call sites
(line 1814 and 1117), drop the helper entirely. Also added
`Number(...) || default` guards so a stale `CFG.CAPTCHA_CLICK_DELAY`
or `CFG.RL_RETRY_DELAY` of NaN/null/undefined falls back to the
DEF value rather than making `setTimeout(NaN)` fire instantly.

Side effect that confirmed the bug: the captcha bg element lost
its layout during the storm, so `rect.width = 0` and
`nx * rect.width = 0`, but `rect.left` was ~-9992 from a stale
frame ref — hence the marker spamming `(-9992, -10029)`.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-15 23:12:47 +08:00
OLmatterandClaude Opus 4.7 9410388eff feat(userscript): v8.21 高级模式 + 经典模式自带 ±20% 抖动
高级模式(默认关闭)开启后露出两个数字输入框:
- 验证码点击间隔(默认 220ms)
- 限流重试间隔(默认 1000ms)

经典模式(v8.20 行为)也自动加 ±20% 随机抖动,防止
RPM 风控识别。jitterDelay() helper 统一处理。

v8.21.1:黄金时间(9:30-11:00)首次进入时弹紫色条提示
用户试试无痕窗口(Ctrl+Shift+N),消除隐形风控标记。
sessionStorage 去重,当天只弹一次。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-15 22:12:08 +08:00
OLmatterandClaude Opus 4.7 a1397fca40 chore: bump userscript to v8.20 after PR #17 merge
PR #17 was merged as v8.19 (matching the rush mode feature label),
but our v8.19 was already the golden-time extension. Bump to v8.20
to reflect the combined feature set: golden-time 9:30-11:00 + rush
mode + tabEl 1-index fix + findAndClickConfirm payment-button guard.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-15 20:40:44 +08:00
sunshineandsunshine 1b090e4bf6 feat(userscript): rush mode v8.19 (rebase from author v8.18) (#17)
- Configurable via panel: enable toggle + HH:MM:SS target time
- checkPayDialog: __glmRushConfirmed guard protects first payment dialog
- tick(): rush lock cleared only when dialog is gone (!getPayDialog)
- handleCaptchaDirectInPage: wait for target time, set rush lock on both
  before-target and already-past branches
- RUSH_CFG reads from user config, parseInt fixed (Number.isFinite guard)

- everSucceeded && PS.bizId (2 locations): prevent stale success
  from keeping sold-out dialogs open
- findAndClickConfirm: removed .pay-dialog/.el-dialog selectors
  (prevent accidental payment button clicks by captcha confirm)
- tabEl: [n] -> [n-1] for correct 1-index to 0-index mapping

- @connect localhost + @connect 127.0.0.1
- Version 8.18 -> 8.19
- Both copies synced, SHA256 identical, whitespace clean

Co-authored-by: sunshine <qt22260@gmail.com>
2026-06-15 20:40:12 +08:00
OLmatterandClaude Opus 4.7 e07ec9e181 feat: extend golden time to 11:00 (10:30+ still possible per user feedback)
isGoldenTime() now covers 9:30-11:00 (was 9:30-10:10) so late-morning
restock windows are treated as rush mode: no page refresh, no MAX_RL
cap on 555 retries. Bump userscript to v8.19 and add CHANGELOG entry.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-15 19:33:55 +08:00
OLmatterandClaude Opus 4.7 514d0b330e docs: warn about RPM risk control and default 2 windows
- change openMultipleWindows prompt default from 3 to 2 (max stays 10)
- add prominent RPM warning box in README rush section after GLM upgraded RPM limits
- strengthen language in step 5 and 重要提醒 from "may trigger" to "has caused widespread failure"
- sync root and scripts/userscripts/ copies

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-14 14:00:42 +08:00
OLmatter 08afc38844 fix: allow localhost direct captcha requests 2026-06-13 23:53:31 +08:00
OLmatter a787a48ee0 feat: add MiniMax token plan referral entry 2026-06-13 19:20:53 +08:00
OLmatter 27629a1839 fix: clean userscript prompt and package cmd launchers 2026-06-13 11:23:40 +08:00
sunshine 095d1947c7 feat(userscript): fetch-first, GM_xmlhttpRequest fallback
4 network functions changed to try fetch() first, fallback to GM_xmlhttpRequest:
- fetchImageDataUrl
- postDirect
- serverRequest
- fetchCaptchaImageDirect

fetch() has no 6-connection limit per domain (unlike GM_xmlhttpRequest),
eliminating the bottleneck when multiple windows/iframes hit localhost:8888.
GM_xmlhttpRequest is kept as fallback for CORS-restricted contexts.

Both userscript copies synced, SHA256 identical, trailing whitespace cleaned.
2026-06-09 23:18:50 +08:00
OLmatter 2f8cc1bf0f Improve rush stability and discount entry 2026-05-29 20:16:22 +08:00
OLmatter d4dd03ed6c Simplify release packaging and direct captcha flow 2026-05-27 20:52:57 +08:00
OLmatter 89a7d5706a Add captcha model development journey 2026-05-26 11:04:30 +08:00
OLmatter b5285097be Improve Chinese search keywords 2026-05-26 09:38:05 +08:00
OLmatter 395e9decc4 Expose userscript at repository root 2026-05-26 08:18:22 +08:00