Skip to content

fix: (改为向原项目提交)引入智能等待与UI双重验证,解决速通秒跳转但丢进度问题,新增在线教学平台实名水印阻断功能 - #8

Open
anyvolunteer wants to merge 1 commit into
SYSU-Tang:composefrom
anyvolunteer:anyvolunteer-patch-1

Conversation

@anyvolunteer

Copy link
Copy Markdown

关联的 Issue

Fixes #7

变更背景 / Problem

原有脚本的视频速通功能在 10ms 发包完毕后,会立即触发页面跳转。
由于服务器处理高频 AJAX 请求存在明显的异步写入延迟(落盘耗时),过早的页面跳转会导致浏览器强行中断尚未完成响应的请求(Aborted),从而导致用户频繁遇到"提示速通成功但实际未刷满、下一页进度丢失"的问题。

解决方案 / Solution

本 PR 保持了原有的发包速度,但在跳转控制上引入了双重验证,并新增了水印阻断功能:

  1. 智能动态等待(Stage 1): 发包完毕后,根据数据包总量动态计算等待时间:5000ms 基础缓冲 + (数据包数 * 80ms)。期间通过 toast 给予用户明确的排队倒计时提示,给服务器留出数据消化的时间。PR提交者通过掐表的方式发现等待时间差不多够用orz

  2. UI 状态轮询校验(Stage 2): 等待倒计时结束后,脚本不会立刻跳转,而是每秒探测一次页面真实的进度元素(.num-bfjd span)。只有当确认数字达到 100% 时,才会安全触发 click('#next-activity-link') 跳转。在视频到20分钟以上的时候。可能会出现,需要等待页面探测,20分钟以下的时候,一般页面探测时就已达到100%

  3. 强力阻断实名水印: 定位到了水印宿主 #wm_div_id,采用 "CSS 首屏压制(防止闪烁) + MutationObserver 监听物理移除(防止复活)" 的混合防御,彻底清除了在线教学平台上的大面积实名水印。水印阻断功能也设置为可以打开或关闭


💡 探讨 / Future Proposal(写给维护者的建议)

  1. 在本次测试中,我发现 10ms 发包虽然速度快,但瞬时并发极高。
    未来改进设想:我们是否可以尝试将发包心跳频率直接降低(例如调整为 80ms 甚至 100ms 一发)? 如果降低到 80ms,发包总耗时将天然地与服务器的处理落盘时间对齐。这样可能就不再需要 Stage 1 的盲等倒计时代码了,流程会更加精简。欢迎对此进行讨论!
  2. 也许去水印功能并不需要监听,删除监听功能,有利于节约性能,但笔者未对此进行测试。

部分页面截图 / Photos

428a86a31d863756088a7f71c7eec227 e05656d3299a4dbc999ddf9fe8253b11

部分对于原有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

### 关联的 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 的盲等倒计时代码了,流程会更加精简。欢迎对此进行讨论!
@SYSU-Tang

Copy link
Copy Markdown
Owner

感谢这位同学~

原来的脚本确实会存在过早跳页完成度不足等问题,10ms确实可能会对学校的服务器和自己浏览器有点压力,但是为了快速看完视频也是无奈之举。

对于同学提出的UI 状态轮询校验方法可以奏效,我这边加入了发送请求前获取当前视频的进度以此修改发送次数,定时器结束后发送500ms的POST请求轮询获取进度来判断完成情况,避免潜在的UI渲染错误。

另外,移除水印的想法挺不错,不过事实上有更加简单的办法,直接在文档加载结束后执行watermark.remove()就可以移除水印。

手机浏览器上在线教学平台的脚本似乎用不了,或者说是移动端界面的网页用不了,暂时需要修改UA;中大儿的脚本功能还未完善,后面预计会添加从链接导入脚本、从文件导入脚本、更新脚本等脚本功能。

我的脚本主要在SYSU-Tang/sysuer-script上更新,以后同学有什么想法欢迎到https://github.com/SYSU-Tang/sysuer-script 上 PR。

@SYSU-Tang
SYSU-Tang self-requested a review July 19, 2026 12:20
@anyvolunteer

Copy link
Copy Markdown
Author

感谢新的思路

btw,一键评教,注入免验证cookie的功能都非常实用,已向同学们安利,期待未来的更新~

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

刷课可用性问题,手机端sysuer刷课不能跳页,电脑端过早跳页(已解决电脑端问题已提PR)

2 participants