引言及简介
随着在线教育的普及,线上学习成为了许多高校和培训机构的首选平台。然而,大量的视频课程和章节测验往往让人感到疲惫。本文将介绍一个专为线上学习设计的自动化脚本,它能够自动播放视频、自动答题,让学习过程更加轻松高效。
这是一个功能强大的 Tampermonkey 用户脚本,专为线上学习设计。它不仅能够自动播放视频,还能智能识别并完成章节测验,支持单选题、多选题和判断题的自动作答。
主要功能
-
自动播放视频:自动检测并播放课程视频,支持多视频队列管理
-
智能答题:自动识别章节测验,支持单选、多选、判断题的自动作答
-
重做机制:当答案错误时,自动重做并填写正确答案
-
后台播放:支持标签页后台运行,不影响其他操作
-
异常监控:自动检测播放异常,必要时刷新页面
-
可视化面板:提供美观的控制面板,实时显示播放状态和进度
使用方式
安装步骤
-
安装 Tampermonkey 扩展
-
Chrome:访问 Chrome 网上应用店搜索 “Tampermonkey” 并安装
-
Firefox:访问 Firefox 附加组件商店搜索 “Tampermonkey” 并安装
-
Edge:访问 Microsoft Edge 扩展商店搜索 “Tampermonkey” 并安装
-
-
创建新脚本
-
点击 Tampermonkey 图标,选择"添加新脚本"
-
删除默认代码,粘贴本文提供的完整脚本代码
-
按
Ctrl+S保存脚本
-
-
访问学习页面
-
打开学习课程页面
-
脚本会自动运行,显示控制面板
-
界面说明

脚本运行后会在页面右上角显示一个控制面板,包含以下信息:
-
视频状态:显示当前视频的播放状态(播放中/暂停/已完成)
-
播放速度:当前视频播放倍速(默认2倍速)
-
剩余时间:当前视频剩余播放时间
-
音量状态:静音状态(默认静音)
-
视频进度:当前第几个视频/总视频数
按钮功能
-
2x速:循环切换播放速度(1x → 1.25x → 1.5x → 2x)
-
静音:切换静音状态
-
下一节:手动跳转到下一章节
答题流程
当检测到章节测验时,脚本会自动:
-
检测测验:识别测验页面并获取测验状态
-
第一次提交:提交空白答案获取正确答案
-
提取答案:从提交结果中提取正确答案
-
重做答题:自动点击重做按钮
-
填写答案:根据正确答案填写所有题目
-
最终提交:提交答案并自动跳转下一章节
技术实现
1. 页面检测机制
脚本使用多种方式检测当前页面类型:
// 检测章节测验页面
function isQuizPage() {
// 检测 .fr.testTit_status 元素
const testStatusDiv = document.querySelector('.fr.testTit_status');
if (testStatusDiv && testStatusDiv.textContent.includes('待完成')) {
return true;
}
// 检测页面文本
const pageText = document.body.innerText;
if (pageText.includes('章节测验') && pageText.includes('题量')) {
return true;
}
// 检测试题结构
if (/[一二三四]、[单选题|多选题|判断题]/.test(pageText)) {
return true;
}
// 检测 iframe 中的内容
const docs = getAllDocumentsRecursive(document);
for (let doc of docs) {
if (doc.querySelector('.TiMu')) {
return true;
}
}
return false;
}
2. 视频自动播放
脚本通过递归查找所有 iframe 来定位视频元素:
function findAllVideos() {
const videos = [];
// 查找主视频
const mainVideo = document.querySelector('#iframe')
?.contentDocument?.querySelector('iframe')
?.contentDocument?.querySelector('#video_html5_api');
// 查找所有 iframe 中的视频
const iframes = document.querySelectorAll('iframe');
iframes.forEach(iframe => {
const videoInIframe = iframe.contentDocument?.querySelector('video');
if (videoInIframe) videos.push(videoInIframe);
});
// 查找直接视频元素
const directVideos = document.querySelectorAll('video');
directVideos.forEach(v => videos.push(v));
return videos;
}
3. 答案提取算法
脚本通过解析提交后的页面,提取正确答案:
function extractAndStoreAnswers() {
const docs = getAllDocumentsRecursive(document);
let questionIndex = 0;
for (let doc of docs) {
const questions = doc.querySelectorAll('.TiMu, .questionLi');
for (let question of questions) {
// 识别题目类型
let questionType = 0; // 0:单选, 1:多选, 3:判断
if (question.textContent.includes('判断题')) {
questionType = 3;
} else if (question.textContent.includes('多选题')) {
questionType = 1;
}
// 提取正确答案
let answer = '';
const correctElements = question.querySelectorAll('.correctAnswer');
for (let el of correctElements) {
const match = el.textContent.match(/正确答案[::]\s*([^,\n]+)/);
if (match) {
answer = match[1].trim();
break;
}
}
// 判断题答案转换
if (questionType === 3 && answer) {
if (answer.includes('对') || answer === 'A') {
answer = '对';
} else if (answer.includes('错') || answer === 'B') {
answer = '错';
}
}
answerState.answers[questionIndex] = answer;
questionIndex++;
}
}
}
4. 自动答题实现
脚本通过模拟点击和 DOM 操作来自动填写答案:
function fillAllAnswers() {
const questions = document.querySelectorAll('.TiMu');
questions.forEach((question, index) => {
const answer = answerState.answers[index];
const options = answer.split('');
for (let option of options) {
// 查找对应的选项元素
let input = question.querySelector(`input[value="${option}"]`);
if (input) {
input.checked = true;
input.dispatchEvent(new Event('change', { bubbles: true }));
}
// 通过 label 文本查找
if (!input) {
const labels = question.querySelectorAll('label');
for (let label of labels) {
if (label.textContent.startsWith(option + '.')) {
const radio = label.querySelector('input');
if (radio) radio.checked = true;
break;
}
}
}
}
});
// 提交答案
setTimeout(() => submitAnswers(), 3000);
}
5. 异常监控与自动刷新
脚本实时监控视频播放状态,异常时自动刷新:
function startPlaybackMonitor() {
setInterval(() => {
if (!currentVideo) {
startCountdown('未检测到视频元素');
return;
}
const isPlaying = !currentVideo.paused &&
!currentVideo.ended &&
currentVideo.readyState >= 3;
if (isPlaying) {
// 播放正常,重置计时器
clearCountdown();
} else {
// 播放异常,启动倒计时
if (!playbackMonitor.isWaiting) {
startCountdown('视频暂停或加载失败');
}
}
}, 2000);
}
6. 跨 iframe 文档访问
由于学习通使用多层 iframe 嵌套,脚本实现了递归文档访问:
function getAllDocumentsRecursive(doc, visited = new Set()) {
const docs = [doc];
const iframes = doc.querySelectorAll('iframe');
for (let iframe of iframes) {
try {
const iframeDoc = iframe.contentDocument ||
iframe.contentWindow?.document;
if (iframeDoc && !visited.has(iframeDoc)) {
visited.add(iframeDoc);
const subDocs = getAllDocumentsRecursive(iframeDoc, visited);
docs.push(...subDocs);
}
} catch(e) {}
}
return docs;
}
技术亮点
1. 智能答案提取
脚本通过第一次提交获取正确答案,然后自动重做并填写,解决了传统答题脚本无法获取正确答案的问题。
2. 多层次页面检测
通过检测 DOM 元素、文本内容、URL 和 iframe 内容,确保能够准确识别各种形式的章节测验页面。
3. 完善的异常处理
-
自动检测视频播放异常
-
网络问题自动重试
-
超时自动刷新页面
-
防止重复提交
4. 优雅的 UI 设计
-
可拖拽移动的控制面板
-
贴边隐藏功能
-
折叠/展开功能
-
实时进度显示
5. 低侵入性
-
不影响原有页面功能
-
可随时手动控制
-
自动停止监控避免资源浪费
注意事项
-
合理使用:请在学习目的下使用本脚本,不要滥用
-
网络环境:确保网络稳定,避免因网络问题导致脚本异常
-
浏览器兼容:建议使用 Chrome 或 Edge 浏览器
-
定期更新:关注脚本更新,学习通平台更新后可能需要相应调整
总结
这个线上学习自动化脚本通过智能的页面检测、答案提取和自动答题机制,大大提升了在线学习的效率。它不仅解放了双手,还通过异常监控和自动恢复机制保证了运行的稳定性。
欢迎更多开发者参与改进。如果你有任何建议或问题,欢迎在评论区留言讨论。
附录
-
脚本版本:1.8.0
-
最后更新:2026年3月
-
依赖:Tampermonkey 或 Greasemonkey
本文旨在技术交流,请合理使用自动化工具,尊重平台规则和版权。
评论区