一个纯前端的 Tampermonkey 用户脚本,如何自动遍历课程目录、倍速刷视频、像"大学搜题酱/作业帮"一样搜题作答,以及在夸克浏览器上踩的那些坑。
一、起因:网课任务点,是个体力活
每学期都有这样的课:视频要看满时长、章节测验要做完、文档要点开。一门课 66 个任务点,全手动下来就是小半天。更烦的是测验部分——题干要一个个复制去搜题软件里查。
于是做了这个学习通刷课助手:打开课程页点一下"开始刷课",它自己遍历目录、播视频、搜题、提交,我在旁边看着日志刷屏就行。
二、成品能力
任务类型
自动化策略
视频
静音 + 16 倍速播放,属性锁防播放器偷改倍速;中途弹题自动处理;已学完的自动跳过
作业 / 测验
题干检索题库(链式多源)→ LLM 兜底 → 手动辅助;自动勾选、自动提交
文档 / 讨论
自动停留后跳过
全局
悬浮控制面板(进度/日志/设置)、断点续跑、失败清单、目录侦察
搜题逻辑对标大学搜题酱/作业帮:题干文本检索题库、返回答案并给出题干匹配度;支持多个题库地址换行分隔链式查询,命中即停;也可以接任意 OpenAI 兼容接口(DeepSeek/通义/Kimi)直接作答。
三、架构:一个脚本,两种角色
flowchart TD
A["课程页目录树"] --> B["▶ 开始刷课(编排器)"]
B --> C{"任务类型识别"}
C -->|视频| D["静音 + 16x 倍速
弹题自动处理"]
C -->|作业/测验| E["题库搜题 → LLM 兜底
自动勾选并提交"]
C -->|文档| F["自动停留跳过"]
D & E & F --> G["下一章,循环"]
G --> H["全部完成
输出成功/失败清单"]
- 编排器(顶层页面):收集目录 → 逐章点击 → 等待 iframe 加载 → 按任务类型分发处理。
- 内容自接管(任意框架):视频/作业在新标签页或跨域 iframe 打开时,所在框架的脚本实例自动接管,无需编排器。
- 两者通过 sessionStorage 里的编排标志协调:同标签页内子框架交给编排器;顶层实例发现编排器已随页面跳转失效时自动"放权",避免没人干活。
四、几个关键技术点
- 同域 iframe 直接 DOM 驱动
学习通的内容区在 #iframe 里,同源所以可以直接伸手进去操作,不需要 message 通信:
function contentIframe() {
return document.querySelector('#iframe') || document.querySelector('iframe[name=iframe]')
|| $$('iframe').filter(visible)[0] || null;
}
跨域 iframe(播放器等)则靠"内容自接管"兜底。 - 锁倍速:防播放器偷改速率
直接 video.playbackRate = 16 会被播放器改回去(实测被压到 1.6x)。用属性描述符把 setter 焊死:
Object.defineProperty(video, 'playbackRate', {
get: () => cfg.speed,
set: () => {}, // 播放器想改?不答应
configurable: true
}); - 新版目录树没有类名?用文本特征做启发式识别
改版后的目录面板(页面右侧"目录"树)不再有 .posCatalog 这类稳定类名。与其猜类名,不如按章节文本特征找:
const CHAPTER_RE = /(第[一二三四五六七八九十百千\d]+[讲章节篇部]|\d+(.\d+)+|导论$|绪论|总结|考试|测验|作业)/;
// 找"有 3 个以上子元素文本匹配章节特征"的最内层容器,其子元素即目录项
类名会过时,"第几讲 + 小数点编号"这种文本结构不会。
4. 搜题:链式题库 + 题干匹配度
题库响应格式千奇百怪,统一解析成 {answer, question};再用 Dice 系数算返回题干与原题的相似度,匹配度低的宁可标"未找到"也不乱选:
function similarity(a, b) { /* 二元词袋 Dice 系数 */ }
5. 富文本编辑器作答
简答题/填空题用的是 UEditor,没有 input/textarea,答案要注入 iframe 里的 contenteditable,优先走 UE API,失败再操作 body。
五、踩坑全记录(本文精华)
坑 1:夸克装不上 Tampermonkey——MV2 之殇
- 火狐版 Tampermonkey 是 MV2 清单。加载报 The 'webRequest' API cannot be used with event pages,把 background.persistent 改 true 解决;
- 接着报 清单文件缺失或不可读取——选文件夹时选浅了一层(父目录没有 manifest.json);
- 再报 无法安装扩展程序,因为它使用了不受支持的清单版本——夸克内核直接不支持 MV2,此路不通,最终通过夸克插件中心装上了 MV3 版(5.4.1)。
坑 2:脚本装了却不运行
Chrome 138+ 内核把"开发者模式"和"允许用户脚本"拆成了两个开关。Tampermonkey 菜单里显示"已启用"但面板不出现,就是缺后者:quark://extensions → Tampermonkey 详情 → 打开"允许用户脚本"。
坑 3:本地文件装不了脚本
把 .user.js 拖进夸克报 无法从该网站添加应用、扩展程序和用户脚本——浏览器禁止从 file:// 安装。解法:Tampermonkey 管理面板 → 添加新脚本 → 粘贴全文 → Ctrl+S。粘贴法在任何浏览器都有效。
坑 4:页面跳转后自接管失效
编排器标志存在 sessionStorage 里,章节跳转(整页刷新)后标志残留为"1",新页面实例以为还有编排器在驱动,结果两边都不干活。修复:顶层实例发现标志在但自己没有运行中的任务时,自动清标志放权。
坑 5:目录识别失败
老选择器 .posCatalog 在新版 UI 下命中 0 个。除了启发式识别,脚本还内置了"目录侦察"模式:一键 dump 页面里各候选选择器的命中情况、iframe 列表、目录面板结构,用户把日志发回来,开发者 5 分钟就能精修。这个功能后期救了不止一次。
六、版本与规划 - v1.0:目录遍历、视频倍速、题库搜题、自动提交、控制面板
- v1.1:启发式目录识别、锁倍速、跳过已完成视频、iframe 自接管、侦察增强
待完善清单(应用持续升级中):
- 题库稳定性——免费题库接口说挂就挂,后续做接口健康探测 + 自动切换
- 风控对抗——倍速过高可能被平台识别,计划加入"拟人化节奏"选项
- 题型覆盖——阅读理解、完形填空、多材料题
- 跨浏览器适配——Edge/Chrome/夸克三端回归测试
- 配置同步——设置项支持导入导出
七、结语
这个项目最大的收获是:自动化脚本的难点从来不是"播放视频",而是和不断改版的前端、越来越严的内核策略斗智斗勇。选择器集中管理 + 侦察模式 + 启发式兜底,这套组合让脚本在页面改版后不至于全军覆没。
免责声明:本文及插件仅供技术学习与个人使用,请遵守所在学校及平台的相关规定,因使用产生的一切后果由使用者自行承担。
项目文件:chaoxing-auto.user.js(约 1100 行,零依赖)+ README.md。技术栈:Tampermonkey API(GM_xmlhttpRequest / GM_setValue)、原生 DOM、无后端。
浙公网安备 33010602011771号