ouchn-learn 是一个面向国家开放大学 (OUCHN) 学习平台的 Tampermonkey 用户脚本。它把课程页自动查看、视频挂机、参考资料下载、全屏学习资源保存,以及考试页 AI 自动答题整合在一个浏览器脚本中。
当前代码已经从旧版 jQuery 字符串面板迁移到 React 19 渲染器:界面由 React 组件负责,状态由 Zustand 管理,课程自动化和考试自动答题通过 src/services/* 适配到浏览器 DOM 自动化模块。产物仍然是单文件 IIFE UserScript,运行在浏览器 + Tampermonkey 沙箱中。
| 课程页控制台 | AI 自动答题 |
|---|---|
![]() |
![]() |
- 课程页控制台: 进入课程页后自动挂载可拖动、可折叠的 React 面板。
- 一键查看页面: 自动打开未完成的查看页面任务,完成后返回课程页继续扫描。
- 视频挂机: 批量查找视频学习活动,按配置间隔提交学习进度。
- 参考资料下载: 展开课程目录,收集附件资源并按间隔触发下载。
- 全屏资源保存: 在学习活动全屏页展开资源树,保存视频和文档资源,文档可转 PDF。
- AI 自动答题: 支持 OpenAI/Claude 兼容接口、独立 Provider 配置、并发答题、图片题降级、工具化 DOM 回填和执行统计。
- 配置迁移与安全存储: AI API Key 优先写入 Tampermonkey GM 存储,兼容旧版 localStorage 配置迁移。
https://lms.ouchn.cn/course/**: 课程页,支持自动查看、视频挂机、参考资料下载。https://lms.ouchn.cn/course/**/learning-activity/full-screen#/**: 全屏学习活动页,支持批量保存学习资源。https://lms.ouchn.cn/exam/*/subjects*: 考试答题页,支持 AI 自动答题。
- 安装 Tampermonkey。
- 获取发布版用户脚本,或本地执行
pnpm run build生成dist/index.global.js。 - 在 Tampermonkey 中安装脚本。
- 访问 OUCHN 课程页、全屏学习活动页或考试页,脚本会根据 URL 自动切换面板模式。
课程页面板提供三类任务:
- 查看所有页面: 扫描未完成查看任务,自动进入页面并返回课程页。
- 批量下载参考资料: 按下载间隔展开章节并保存附件。
- 一键全部挂机: 按挂机间隔标记视频学习进度。
进入学习活动全屏页后,面板切换为保存资源模式:
- 点击保存所有学习资源。
- 脚本展开左侧资源树并逐项处理。
- 视频资源走文件保存,文档资源通过
jsPDF+html2canvas转为 PDF。
考试页面板提供 OpenAI 和 Claude 两套独立配置:
- 选择 Provider。
- 填写模型名称、API Key、Base URL。
- 设置答题并发数和可选自定义提示词。
- 点击保存配置或开始答题。
- 面板展示状态、填写数量和工具执行统计。
Provider 只负责生成答案;真实页面填写由本地工具层校验并执行,避免模型直接操作 DOM。
src/
├── index.ts # UserScript 入口,注入样式并挂载 React renderer
├── renderer/ # React 面板、页面模式识别、拖拽 hook、基础 UI
├── store/ # Zustand stores:课程、考试、面板状态
├── services/ # React UI 与业务模块之间的适配层
├── modules/ # 课程自动化、资源保存、AI 答题等业务模块
│ ├── auto-view.ts # 自动查看页面
│ ├── auto-hang.ts # 视频挂机
│ ├── auto-material-download.ts
│ ├── save-resources/
│ ├── resource-download.ts
│ ├── legacy-hang.ts
│ ├── styles.ts # scoped runtime CSS / Tailwind-like utilities
│ └── exam/ # AI 自动答题链路
├── utils/ # DOM、存储、页面运行时、通用工具
├── constants/ # 默认 Provider 配置和常量
└── types/ # 公共类型
src/renderer/mount.tsx负责创建单一 React root,并通过 URL 监听和轮询识别当前页面模式。src/renderer/App.tsx根据页面模式渲染CoursePanel、FullScreenPanel或ExamPanel。src/store/*保存 UI 状态、任务配置和执行状态。src/services/*把 React/Zustand action 转换为业务模块调用,避免组件直接编排复杂 DOM 流程。src/modules/*保留浏览器脚本式自动化逻辑,负责扫描 OUCHN 页面、读写 DOM、下载资源和执行答题工具。src/utils/storage.ts统一处理 localStorage 与 Tampermonkey GM 存储。
核心入口是 src/services/exam-runner.ts:
question-extract.ts等待题目 DOM 稳定并提取结构化Question[]。question-detect.ts判断题型、过滤装饰图,并识别图片题。ai-provider.ts按题并发调用 OpenAI 或 Claude Provider。- Provider 适配器通过
provider-http.ts统一处理fetch、GM_xmlhttpRequest和重试。 tool-executor.ts将 AI 答案转换为本地ExamToolUse[]。tool-registry.ts按题型校验工具输入并分派执行。answer-write.ts、answer-fill.ts、answer-match.ts处理单选、多选、填空、简答和匹配题写入。ExamStats汇总提取数量、AI 返回数量、工具成功/失败、跳过题目和图片降级情况。
这条链路把“模型推理”和“页面执行”分开,便于定位 Provider 问题、题型解析问题和 DOM 写入问题。
- 课程自动化状态、返回 URL、课程配置和参考资料缓存仍使用 localStorage,方便跨页面跳转恢复任务。
- AI 答题配置通过
src/utils/storage.ts统一读写。 - API Key 优先保存到
GM_setValue,读取时优先使用GM_getValue。 - 旧版 localStorage 中的 AI 配置会在读取时归一化,并迁移到 GM 存储。
- OpenAI 和 Claude 的模型、API Key、Base URL 独立保存,切换 Provider 不会覆盖另一套配置。
- TypeScript,target ES2020
- React 19 + React DOM
- Zustand
- jQuery,用于兼容 OUCHN 页面和既有 DOM 自动化
- tsup,IIFE/UserScript 构建
- jsPDF + html2canvas,文档资源 PDF 保存
- ESLint flat config + React Doctor + Prettier + Husky + lint-staged
pnpm run lint使用 ESLint flat config,并启用eslint-plugin-react-doctor推荐规则。pnpm run lint和pnpm run lint:fix都带--max-warnings=0,ESLint warning 会阻塞 CI 和本地检查。lint-staged对*.{ts,tsx}执行 Prettier、eslint --fix --max-warnings=0和tsc --noEmit。- 当前项目关闭了不适用的 React Doctor 规则,例如 SSR/server/hydration、React Compiler、未使用生态规则和 DOM 自动化串行 await 微优化规则。
pnpm install
pnpm run dev
pnpm run build
pnpm run typecheck
pnpm run lint
pnpm run lint:fix
pnpm run formatpnpm run build 会输出带 UserScript header 的 dist/index.global.js。dist/ 已被 .gitignore 忽略。
构建配置在 tsup.config.ts 中维护 UserScript header:
@match https://lms.ouchn.cn/course/**@match https://lms.ouchn.cn/exam/*/subjects*@grant GM_download@grant GM_getValue@grant GM_setValue@grant GM_xmlhttpRequest@grant unsafeWindow@connect *
新增 Tampermonkey API 或外部请求目标时,需要同步检查 @grant 和 @connect。
- 面板没有出现: 确认 Tampermonkey 已启用脚本,并且 URL 命中
@match。 - 课程任务没有继续执行: 自动查看和资源保存依赖页面跳转状态,执行期间不要刷新或手动切换页面。
- 参考资料下载失败: 检查浏览器下载权限、Tampermonkey 下载权限和课程资源是否需要登录态。
- AI 配置保存失败: 确认脚本 grant 中包含
GM_getValue和GM_setValue,并重新安装最新构建产物。 - AI 答题为空或部分跳过: 检查 Provider Base URL、模型名称、API Key、并发数,以及浏览器控制台中的
ExamStats。 - 匹配题填写失败: OUCHN 匹配题 DOM 形态差异较大,脚本会依次尝试 Angular model、拖拽、点击匹配和隐藏输入等策略,最终结果以面板统计为准。
- 本脚本仅供学习交流使用。
- 项目运行环境是浏览器 + Tampermonkey,不存在 Node.js 运行时。
- 业务代码不要直接使用 Node.js 专属 API,例如
fs、path、process。 - 涉及持久化时优先复用
src/utils/storage.ts。 - 涉及 DOM 操作时优先检查
src/utils/dom.ts。 - 保存资源或 AI 答题期间,不建议手动刷新、关闭或切换页面。
MIT

