学习通页面前端自动化研究项目。包含两个独立但联动的模块:
- 自动刷课脚本 — 检测视频/阅读/测验任务,按原页面框架自动播放推进。
- AI 答题侧边栏 — 在学习通页面注入一个右侧滑出面板,支持一键截图当前页 → 调用多模态大模型识题作答。
本项目仅用于脚本调试、前端自动化研究和页面行为分析。请遵守目标平台的使用规定。 请勿将本项目用于违反平台规则、绕过课程要求、代替真实学习或规避考核的场景。
.
├── manifest.json # Chrome MV3 扩展配置
├── content.js # content script,把主脚本注入到页面 main world
├── v3_optimized.user.js # 主刷课脚本 + 侧边栏暂停闸门
├── v3_optimized.js # 主刷课脚本的油猴版本(不含侧边栏闸门)
├── background.js # MV3 service worker:截图、AI 调用、配置存储
├── sidepanel/
│ ├── providers.js # 5 个 AI 视觉 provider 抽象(OpenAI 兼容 + Anthropic 原生)
│ └── sidepanel.js # Shadow DOM 侧边栏 UI
├── config.example.js # 配置文件模板(提交到 git)
├── config.local.js # 实际配置含 API Key(.gitignore 忽略)
├── .gitignore # 拦截 config.local.js 等敏感文件
└── README.md
- Chrome MV3 扩展入口:通过
manifest.json注册 content script,匹配学习通课程页(mooc1.chaoxing.com/mycourse/studentstudy*)。 - 页面脚本注入:
content.js将v3_optimized.user.js注入到页面 main world,便于访问课程框架 jQuery 对象。 - 任务类型识别:通过
_getTaskKind()区分 video / reading / quiz。 - 视频任务自动播放:每秒检查视频状态,暂停时自动恢复,进度不前进 7 秒时触发保活,播放结束自动切下一节。默认倍速
1x,避免学习通后台 token 校验异常。 - 阅读任务自动滚动:每 800ms 滚动 420 像素,到底部停留 5 秒后判定完成。
- 章节测验跳过:识别 quiz 页面直接点击下一节按钮。
- 弹窗自动确认:劫持
window.confirm处理任务点弹窗,自动应答。 - 课程目录自动推进:同章节有下一小节 → 切小节;否则切下一章。
| 字段 | 默认值 | 说明 |
|---|---|---|
playbackRate |
1 |
视频播放速率 |
autoplay |
true |
是否启用自动播放流程 |
retryInterval |
2000 |
播放失败重试间隔(ms) |
maxRetries |
10 |
最大重试次数 |
videoCheckInterval |
1000 |
视频状态检查间隔(ms) |
dialogCheckInterval |
1000 |
弹窗检查间隔(ms) |
readingScrollInterval |
800 |
阅读任务滚动间隔(ms) |
readingScrollStepPx |
420 |
每次滚动像素 |
guardNoProgressMs |
7000 |
视频卡顿判定阈值 |
| 功能 | 实现 |
|---|---|
| 右侧拉环 + 380px 抽屉式面板 | Shadow DOM (closed) 隔离样式,不被学习通 CSS 污染 |
| 一键截图(含 iframe / canvas / video) | chrome.tabs.captureVisibleTab |
| 流式 AI 回答(token by token 渲染) | chrome.runtime.connect Port + SSE 解析 |
| 5 个视觉模型可切换 | Qwen-VL / GLM-4V / Doubao Vision / OpenAI / Claude |
| 自定义 prompt 模板 + 一键重置 | 设置 tab |
| API Key 持久化 | chrome.storage.local |
| 本地配置文件机制 | 启动时从 config.local.js 加载 key,不进 git |
| 历史记录(最多 30 条) | 含截图缩略图 + 答案预览,可一键回填 |
| 复制答案 / 重新提问 / 停止 | UI 按钮 |
| 快捷键支持 | Alt+Q 截图并问 AI,Alt+W 切换面板 |
| 点击扩展图标切换面板 | chrome.action.onClicked |
| 侧边栏打开时暂停刷课 | dataset 闸门 + MutationObserver 跨 world 同步 |
| Provider | 协议 | 默认 Endpoint | 默认模型 |
|---|---|---|---|
| Qwen-VL (阿里 DashScope) | OpenAI 兼容 | dashscope.aliyuncs.com/compatible-mode/v1/chat/completions |
qwen-vl-max-latest |
| GLM-4V (智谱) | OpenAI 兼容 | open.bigmodel.cn/api/paas/v4/chat/completions |
glm-4v-plus |
| Doubao Vision (字节火山) | OpenAI 兼容 | ark.cn-beijing.volces.com/api/v3/chat/completions |
doubao-1.5-vision-pro-32k-250115 |
| OpenAI / ChatGPT | OpenAI 兼容 | 自定义中转 | gpt-5.5 |
| Claude (Anthropic) | Anthropic 原生 (/v1/messages) |
自定义中转(如 freemodel) | claude-sonnet-4-6 |
Claude 与其他四家不同,走 Anthropic 原生协议:
x-api-key认证、messages端点、image: {source: {type: base64, media_type, data}}图片格式、content_block_delta流式事件。
避免"我正在看 AI 回答时课程被自动推到下一节"。
实现:
sidepanel.js (content script, isolated world)
↓ panel.classList 变化 → MutationObserver
document.documentElement.dataset.antiCxSidebarPause = '1'
↓ (跨 world DOM 可见)
v3_optimized.user.js (page main world)
↓ MutationObserver 监听 dataset
所有"切换下一节"入口被 _holdIfSidebarOpen() 拦截:
- nextUnit()
- _handleVideoTaskEnded()
- _advanceLearningStep()
- play() 内 quiz 跳过的两处 click(#prevNextFocusNext)
- _checkVideoStatus() 中的视频保活恢复(避免强制 resume)
↓
被拦截的动作存入 _pendingAdvanceFn
↓ 用户关闭面板 → dataset 属性被移除 → MutationObserver 触发
执行缓存的动作,课程继续推进
| 场景 | 期望行为 |
|---|---|
| 视频快播完时按 Alt+W 打开面板 | 视频播完后不切下一节 |
| 截图问 AI 期间视频结束 | 显示已完成但不跳,等收起面板后才切 |
| 章节测验页面打开面板 | 不会被自动跳过测验,可以看完题再决定 |
| 手动暂停视频读题 | 脚本不会强制 resume |
- 打开
chrome://extensions/,开启右上角的"开发者模式" - 点击"加载已解压的扩展程序",选择本仓库目录
- 如果是首次安装:会提示需要
<all_urls>权限(用于captureVisibleTab),点"启用"
方式 A(推荐):本地配置文件
cp config.example.js config.local.js编辑 config.local.js,把你要用的 provider 填入 apiKey。例如:
export const LOCAL_CONFIG = {
aiProvider: 'openai',
providers: {
openai: {
apiKey: '你的-OpenAI-key',
baseUrl: 'https://api.openai.com', // 或你的中转地址
model: 'gpt-4o', // 或其他视觉模型
},
// ... 其他 provider 可留空
},
};config.local.js 已在 .gitignore 中,不会被推送到远程仓库。
在 chrome://extensions/ 中重新加载扩展,配置会自动写入 chrome.storage。
方式 B:在 UI 中填
打开任意学习通页面 → 右侧拉环 → 设置 tab → 选 provider → 填 Key → 保存。
如果两种方式都用了:UI 里改的优先级最高,会持久化到 chrome.storage;点设置面板里的「↻ 从配置文件重载」可强制让
config.local.js覆盖当前 storage。
| 操作 | 快捷键 / 入口 |
|---|---|
| 切换侧边栏显示 | Alt+W / 点扩展图标 / 点右侧拉环 |
| 截图当前页面并自动询问 AI | Alt+Q |
| 仅截图(不自动问) | 侧边栏内「📷 截图当前页」按钮 |
| 询问 AI | 侧边栏内「🤖 询问 AI」按钮 |
| 复制 AI 答案 | 侧边栏内「📋 复制答案」 |
| 重新提问(同一张图) | 侧边栏内「🔁 重新提问」 |
| Provider | 申请地址 |
|---|---|
| Qwen-VL | https://dashscope.console.aliyun.com/ |
| GLM-4V | https://open.bigmodel.cn/ |
| Doubao | https://www.volcengine.com/product/ark |
| OpenAI | https://platform.openai.com/api-keys 或任意中转 |
| Claude | https://console.anthropic.com/ 或 freemodel 等中转 |
┌─────────────────────────────────────────────────────────┐
│ Content Scripts │
│ ├─ content.js → 注入 v3_optimized.user.js 到 main world │
│ └─ sidepanel/sidepanel.js → Shadow DOM 侧边栏 UI │
└──────────────────┬──────────────────────────────────────┘
│ chrome.runtime.sendMessage / Port
▼
┌─────────────────────────────────────────────────────────┐
│ Background Service Worker (background.js) │
│ ├─ chrome.tabs.captureVisibleTab → PNG DataURL │
│ ├─ chrome.storage.local → Settings │
│ ├─ chrome.runtime.onConnect → AI 流式 Port │
│ └─ dynamic import config.local.js │
└──────────────────┬──────────────────────────────────────┘
│ fetch (AI 平台)
▼
┌─────────────────────────────────────────────────────────┐
│ AI Providers (sidepanel/providers.js) │
│ ├─ OpenAI 兼容: Qwen / GLM / Doubao / OpenAI │
│ └─ Anthropic 原生: Claude │
└─────────────────────────────────────────────────────────┘
<all_urls>权限:captureVisibleTab在 MV3 下要求<all_urls>host permission 或activeTab被用户手势激活;从 content script 按钮触发不会激活 activeTab,因此选用前者- Shadow DOM (closed):侧边栏样式与学习通页面完全隔离,且
closed模式防止页面脚本访问 - 跨 world 通信:sidepanel 在 isolated world,v3 主脚本在 main world;通过
document.documentElement.dataset共享状态,避免window.postMessage的握手开销 - Port 流式:AI 调用走
chrome.runtime.connect长连接,service worker 在流式期间保持唤醒 - 结构化输出兜底:所有 SSE 解析对
JSON.parse失败的行静默 continue,避免半行截断阻塞流
本仓库中的代码和说明仅面向授权环境下的脚本调试、前端自动化研究和页面行为分析。使用者应自行确认行为符合目标平台规则、课程要求、学校或机构规定以及所在地法律法规。
维护者不鼓励、不支持将本项目用于逃避学习过程、绕过课程任务、规避考核、代答题目或干扰平台正常运行。AI 答题侧边栏返回的回答仅供学习参考,请独立判断与验证。