V3.4:合并悬空分支 + 收敛修复 55 条反馈中的高频缺陷(F1–F8,含独立对抗验证) - #58
Closed
ywdddddddddd wants to merge 1 commit into
Closed
ywdddddddddd wants to merge 1 commit into
ywdddddddddd wants to merge 1 commit into
Conversation
基于 chaolucky18/xuexitongScript@1f129f0d (master, V3.3)。 分支合并: GitHub compare 证实 v1(ahead 0/behind 24)、v2_old(ahead 0/behind 9) 已被 master 完全包含; v3_tampermonkey(ahead 1/behind 5) 真实分叉, 仅其独有产物被合并并归档。合并后三分支 均被 master 完全包含。 修复 F1-F8 (每条带 F编号+#issue 注释): F1 导航死锁 / F2 小节内多视频 / F3 无视频课件页 / F4 异常暂停与风控 / F5 互动题弹窗(仅检测不代答) / F6 视频元素发现 / F7 启动与文档 / F8 V1 空指针 独立对抗验证复现的 medium 缺陷已修复: 视频结束后自动跳转的 setTimeout 未登记到 _delayedNextUnitTimer, 而三处却在取消它 -> 取消失效, 陈旧定时器 1.2s 后会把刚打开的小节瞬间跳过。现改用 _schedule() 登记 + 新增 _cancelDelayedNextUnit() (6 个调用点, 复位 _handlingVideoEnd)。 验证: regression 192/192 | adversarial 49/49 且 0 findings | verify-legacy-v1 14/14 | verify-v3 同步通过 反向验证: 同一套用例跑 V3.3 -> 32/44 失败, 证明用例非空转 有意不吸收: PR#53 自动作答 / PR#57 大模型答题 / PR#48 整体改写 / v3_tm 控制面板 思路来源署名: PR#48 @CsuCook1e、PR#53 @ooooooomg、PR#56 @Azuuimio
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
V3.4:合并悬空分支 + 收敛式修复线上高频缺陷(F1–F8)
本 PR 做两件事:(1)把悬空的
v3_tampermonkey分支合并进master;(2)在 V3.3 基础上交付 V3.4,针对仓库里 55 条 issue/PR 中最高频的缺陷做收敛式修复,并为每条修复补上可复现的回归用例。一、分支合并
GitHub compare API 实测的分支关系(非推测):
v1ahead_by=0, behind_by=24— 已被 master 完全包含v2_oldahead_by=0, behind_by=9— 已被 master 完全包含v3_tampermonkeyahead_by=1, behind_by=5— 真实分叉git blob 级验证:
v2_old与v3_tampermonkey的v2.js(77f7bcbf)、xuexitong.js(9c1e5b05)、.gitignore(041fb00d) 与 master 逐字节相同;v3_tampermonkey的v3_optimized.js(a45d2559) 是 V3.0.0,早于 master 的 V3.3,合入会倒退。因此只合并该分支的唯一独有产物并归档其文档,内容零丢失:
学习通自动刷课助手.user.js(V3.0.0 独立油猴版,自带可视化控制面板,7cc0bdb6)— 仅归档保留,未同步到 V3.4,不在维护范围docs/legacy/README-v3.0.0.md、docs/legacy/v3_optimized-v3.0.0.jsREADME.md冲突按 master 版本裁决合并后三个分支均已完全被 master 包含,不再有悬空内容。
二、修复清单
每条修复在
v3_optimized.js内以F编号(#issue)注释标注依据。nextUnit()置位_nextUnitPending后只在部分分支复位,「无视频安全停止 / 触顶重试 / 静音失败触顶 / 本课程已完成」之后所有切换被静默忽略。改为try/finally+ 10 处显式释放;destroy()亦复位_resolveCatalogPosition()(区分active-node/active-parent/tracked),并引入视频任务点模型(_getVideoTaskFrames/_getNextPendingVideoTaskIndex/_areAllVideoTasksComplete),逐个播完未完成任务点才进下一节_bindPageGuards(),不再在document/window上劫持mouseout/mouseleave;恢复播放改为「非用户主动暂停 + 进度确实停滞 + 冷却 + 每小节预算」;接入 PR #56 的保活阶梯(7s 无进度 → pause/play → 2.5s 复检 → 回拨重播)与play()超时保护,且阶梯与恢复共用同一份次数预算,不放大抢播量;所有定时器统一登记、destroy()清零nextUnit()/play()并提示手动完成,弹窗消失后自动恢复。不含任何自动作答run()/destroy()显式失效缓存,并检查isConnected以捕获 iframe 重载后的失效节点#coursetree存在且已渲染.posCatalog_select」;CDN 被拦截/目录缺失/run()抛错均给出可操作提示;README 重写(链接全部有效、默认配置与代码逐项一致)xuexitong.js:39的querySelector('li[title="视频"]').click()无判空,上报堆栈main (<anonymous>:39:45)+119:1与该文件行号列号完全吻合。改为多选择器兜底 + 判空 + 可操作提示倍速与任务点(#2 #3 #6 #28 #31)
属服务端强制,非脚本可解。默认
playbackRate由 1.5 改为 1.0,依据两份独立证据:平台reportTimeInterval每 60 秒上报一次时间、部分课程要求观看时长达到 100%,1.5 倍既容易导致学时不达标、也更容易触发反作弊(#28 #31)。本 PR 不加入任何倍速回写对抗或验证码绕过——那正是 #32/#54「反复暂停并弹验证码」的来源之一。README 已把该约束写成明确的已知限制,倍速仍可手动调高。三、独立对抗验证发现并修复的缺陷
在独立验证阶段复现了一个 medium 缺陷并修复:
_handleVideoEnded()的自动跳转setTimeout未登记到统一账本,而_handleVideoPlay/playCurrentIndex/_handleVideoLoaded三处却在取消它 —— 取消失效。后果:视频结束后 1s 内若已进入下一小节,1.2s 后陈旧定时器会再次跳节,把刚打开的小节瞬间跳过。这正是 #9/#24/#27/#37/#50 那类「跳节」反馈的直接机制。修复:该定时器改用
_schedule()登记;新增_cancelDelayedNextUnit()(取消 + 置空 + 复位_handlingVideoEnd),6 个调用点,保证下一段视频结束仍能正常跳转一次。四、有意不吸收的内容
api.deepseek.com、浏览器端Bearer、题干内容出境、restore-local-configs.mjs会把 apiKey 明文写回源码;且油猴端@grant none且全 PR 无@connect,实际跑不通。verify-no-secrets.mjs只打印不exit(1),不构成门禁chrome-extension/v3_optimized.user.js是第二份源码副本,违反「单一源码 + 构建脚本」约定(由tests/verify-v3.mjs强制);其测试是硬编码版本号的includes()字符串检查。但其功能思路已逐条吸收:多视频任务点模型、任务点弹窗、任务分类、跨域 frame 守卫、弹窗节流、jQuery 兼容——15 个函数在源码中带// 思路移植自 PR #48 @CsuCook1e署名xuexitong.js(V1) 与v2.js(V2) 的修复v3_optimized.js;多视频计数思路已被 F2 覆盖createControlPanel可视化面板onclick与@grant/CSP 耦合、无destroy。作为独立产物完整归档五、给维护者的 PR 处置建议
autoAnswerInteraction计数为 0)。诊断结论已被本 PR 保留;若维护者愿意接受自动作答,可作为独立分支另行评估@connect+ 门槛化verify-no-secrets后再议六、验证方式
测试基于 jsdom,不联网(加载脚本前注入页面自带的 jQuery,避免触发 CDN);每个用例结束
destroy()并断言定时器净零残留;对抗用例对源码做 SHA256 钉扎,运行期间源码被改写即判失败。反向验证(证明用例不是「无论如何都通过」):把被测源码指向 V3.3,同一套用例 32/44 失败,其中 F1 直接复现导航死锁。
七、致谢
paused===false不等于在播放、iframe 重载后节点失效、切屏时序竞争、顶层无法拦截子 frame 监听器)与保活阶梯、play()超时保护、倍速默认值依据