fix: (改为向原项目提交)引入智能等待与UI双重验证,解决速通秒跳转但丢进度问题,新增在线教学平台实名水印阻断功能 - #8
Open
anyvolunteer wants to merge 1 commit into
Open
anyvolunteer wants to merge 1 commit into
anyvolunteer wants to merge 1 commit into
Conversation
### 关联的 Issue Fixes SYSU-Tang#7 ### 变更背景 / Problem 原有脚本的视频速通功能在 `10ms` 发包完毕后,会立即触发页面跳转。 由于服务器处理高频 AJAX 请求存在明显的异步写入延迟(落盘耗时),过早的页面跳转会导致浏览器强行中断尚未完成响应的请求(Aborted),从而导致用户频繁遇到“提示速通成功但实际未刷满、下一页进度丢失”的问题。 ### 解决方案 / Solution 本 PR 保持了原有的发包速度,但在跳转控制上引入了**双重安全验证机制**,并新增了水印阻断功能: 1. **智能动态等待(Stage 1)**: 发包完毕后,根据数据包总量动态计算等待时间:`5000ms 基础缓冲 + (数据包数 * 80ms)`。期间通过 `toast` 给予用户明确的排队倒计时提示,给服务器留出数据消化的时间。**提交者通过掐表的方式发现差不多** 2. **UI 状态轮询校验(Stage 2)**: 等待倒计时结束后,脚本不会立刻跳转,而是每秒探测一次页面真实的进度元素(`.num-bfjd span`)。只有当确认数字达到 `100%` 时,才会安全触发 `click('#next-activity-link')` 跳转。**在视频到四十分钟以上的时候。可能会出现,需要等待页面探测,四十分钟以下的时候,一般页面探测时就已达到100%** 3. **强力阻断实名水印**: 定位到了水印宿主 `#wm_div_id`,采用 **“CSS 首屏压制(防止闪烁) + MutationObserver 监听物理移除(防止复活)”** 的混合防御,彻底清除了在线教学平台上的大面积实名水印。**水印阻断功能也设置为可以打开或关闭** --- ### 💡 探讨 / Future Proposal(写给维护者的建议) 在本次测试中,我发现 10ms 发包虽然速度快,但瞬时并发极高。 **未来改进设想**:我们是否可以尝试将发包心跳频率直接降低(例如调整为 `80ms` 甚至 `100ms` 一发)? 如果降低到 `80ms`,发包总耗时将天然地与服务器的处理落盘时间对齐。这样可能就不再需要 Stage 1 的盲等倒计时代码了,流程会更加精简。欢迎对此进行讨论!
Owner
|
感谢这位同学~ 原来的脚本确实会存在 对于同学提出的UI 状态轮询校验方法可以奏效,我这边加入了发送请求前获取当前视频的进度以此修改发送次数,定时器结束后发送500ms的POST请求轮询获取进度来判断完成情况,避免潜在的UI渲染错误。 另外,移除水印的想法挺不错,不过事实上有更加简单的办法,直接在文档加载结束后执行 手机浏览器上在线教学平台的脚本似乎用不了,或者说是移动端界面的网页用不了,暂时需要修改UA;中大儿的脚本功能还未完善,后面预计会添加从链接导入脚本、从文件导入脚本、更新脚本等脚本功能。 我的脚本主要在SYSU-Tang/sysuer-script上更新,以后同学有什么想法欢迎到https://github.com/SYSU-Tang/sysuer-script 上 PR。 |
SYSU-Tang
self-requested a review
July 19, 2026 12:20
Author
|
感谢新的思路 btw,一键评教,注入免验证cookie的功能都非常实用,已向同学们安利,期待未来的更新~ |
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.
关联的 Issue
Fixes #7
变更背景 / Problem
原有脚本的视频速通功能在
10ms发包完毕后,会立即触发页面跳转。由于服务器处理高频 AJAX 请求存在明显的异步写入延迟(落盘耗时),过早的页面跳转会导致浏览器强行中断尚未完成响应的请求(Aborted),从而导致用户频繁遇到"提示速通成功但实际未刷满、下一页进度丢失"的问题。
解决方案 / Solution
本 PR 保持了原有的发包速度,但在跳转控制上引入了双重验证,并新增了水印阻断功能:
智能动态等待(Stage 1): 发包完毕后,根据数据包总量动态计算等待时间:
5000ms 基础缓冲 + (数据包数 * 80ms)。期间通过toast给予用户明确的排队倒计时提示,给服务器留出数据消化的时间。PR提交者通过掐表的方式发现等待时间差不多够用orzUI 状态轮询校验(Stage 2): 等待倒计时结束后,脚本不会立刻跳转,而是每秒探测一次页面真实的进度元素(
.num-bfjd span)。只有当确认数字达到100%时,才会安全触发click('#next-activity-link')跳转。在视频到20分钟以上的时候。可能会出现,需要等待页面探测,20分钟以下的时候,一般页面探测时就已达到100%强力阻断实名水印: 定位到了水印宿主
#wm_div_id,采用 "CSS 首屏压制(防止闪烁) + MutationObserver 监听物理移除(防止复活)" 的混合防御,彻底清除了在线教学平台上的大面积实名水印。水印阻断功能也设置为可以打开或关闭💡 探讨 / Future Proposal(写给维护者的建议)
未来改进设想:我们是否可以尝试将发包心跳频率直接降低(例如调整为
80ms甚至100ms一发)? 如果降低到80ms,发包总耗时将天然地与服务器的处理落盘时间对齐。这样可能就不再需要 Stage 1 的盲等倒计时代码了,流程会更加精简。欢迎对此进行讨论!部分页面截图 / Photos
部分对于原有1.2/1.3版本脚本调试的日志 / Log
= SYSUER 运行排查日志 =
导出时间: 2026/7/1*
当前页面: https://lms.sysu.edu.cn/mod/fsresource/view.php?id=2135391&forceview=1
UserAgent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/150.0.0.0 Safari/537.36 Edg/150.0.0.0
[22:54:48.981] [INFO] SYSUER 脚本启动,日志系统已激活
[22:54:48.983] [INFO] 进入视频速通判定模块
-> 详细数据: {"videoJump":true}
[22:54:49.485] [DEBUG] 正在轮询等待视频加载 (尝试次数: 0)
-> 详细数据: {"hasPlayerData":true,"hasTCPWrapper":true,"hasVideoContainer":true}
[22:54:49.485] [SUCCESS] 探测到核心播放器变量,进入速通流程
-> 详细数据: {"attempts":0}
[22:54:49.485] [INFO] 开始执行发包 (runVideoSpeedRun)
[22:54:49.485] [DEBUG] 解析视频源成功
-> 详细数据: {"sourceDataKeys":["OD","FD"]}
[22:54:49.486] [DEBUG] 获取到视频时长
-> 详细数据: {"duration":1440.3999999999999}
[22:54:49.486] [INFO] 计算发包总次数
-> 详细数据: {"totalRequest":361}
[22:54:53.107] [SUCCESS] 视频进度刷取发包完毕!
-> 详细数据: {"finalCount":361}
[22:54:53.108] [WARN] 准备跳转下一页 (由发包完成触发)
[22:54:54.609] [SUCCESS] 成功点击元素: #next-activity-link