Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
188 changes: 105 additions & 83 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,135 +1,157 @@
# 学习通自动刷课脚本 V3 稳定版
# 学习通自动播放脚本 V3 稳定版

当前版本基于原始 `v3_optimized.js` 的主框架整理,只保留稳定可用的核心逻辑:
这是基于原 `v3_optimized.js` 整理后的学习通课程自动化脚本。当前维护重点是稳定播放、默认 1x 倍速、自动处理同小节多任务点,并尽量避免误判导致的循环弹窗或错误滚动。

- 自动播放视频
- 视频结束后自动切换到下一小节
- 章节测验页面自动跳过
- 从“学习目标”步骤自动切到“视频”步骤
- 手动点“2视频”页签后自动重新接管播放
当前 Chrome 扩展版本:`3.2.0.9`

这版的目标是保持原模板的行为方式,不再额外叠加复杂的后台保活、通知、测试按钮等附加层,尽量减少冲突。
## 主要功能

- 默认播放速度为 `1x`,并持续锁定,避免页面自动切回 `1.5x`。
- 自动识别并播放视频任务点。
- 支持同一小节内存在多个视频任务点,按顺序逐个检查和播放。
- 如果某个视频任务点已经完成,会自动跳过并检查下一个视频任务点。
- 如果当前小节内所有视频任务点都已完成,会直接进入下一节。
- 自动识别教材、文档、阅读类任务点,逐步滚动到文档底部。
- 阅读任务只有在检测到任务点完成后才会进入下一节,避免滚到底就误跳。
- 章节测验页面会尝试跳过,并处理“当前章节还有任务点未完成,是否去完成?”弹窗。
- 视频任务优先级高于教材阅读判断,避免把视频页误判成教材文本页。
- 避免跨域 iframe 扫描报错刷屏。
- 支持 Tampermonkey 用户脚本和 Chrome 开发者模式扩展两种使用方式。

## 文件说明

- [v3_optimized.js](/E:/code/xuexitongScript-master/v3_optimized.js)
控制台直接执行版本
- [v3_optimized.user.js](/E:/code/xuexitongScript-master/v3_optimized.user.js)
Tampermonkey 油猴版本
- [test_serverchan_push.py](/E:/code/xuexitongScript-master/test_serverchan_push.py)
独立的 Server酱推送调试脚本
- `v3_optimized.user.js`
Tampermonkey 用户脚本版本。

## 当前脚本行为
- `v3_optimized.js`
可在浏览器控制台中直接执行的版本。

### 1. 学习目标页
- `chrome-extension/`
Chrome 开发者模式可加载的本地扩展目录。

如果当前小节先进入的是“学习目标”而不是视频页,脚本会尝试点击顶部的 `2视频` / `视频` 标签进入视频步骤。
- `tests/`
针对倍速锁定、弹窗处理、视频任务点、教材阅读、任务类型识别等逻辑的静态回归检查。

说明:
- 这条路径已经按当前页面结构收紧,只走顶部视频标签,不再点击底部 `下一节` 按钮
- 原因是底部按钮在当前页面里可能触发额外调试/暂停逻辑,稳定性较差
## 推荐安装方式:Chrome 扩展

### 2. 视频页
1. 打开 Chrome 的 `chrome://extensions/`。
2. 打开右上角“开发者模式”。
3. 点击“加载已解压的扩展程序”。
4. 选择仓库里的 `chrome-extension` 目录。
5. 如果已经加载过旧版本,修改代码后需要点击扩展卡片上的“重新加载”。

进入视频页后,脚本会:
当前扩展会注入 `chrome-extension/v3_optimized.user.js`,所以每次更新后都需要重新加载扩展,浏览器才会使用新版本。

## Tampermonkey 使用方式

1. 安装 Tampermonkey。
2. 新建脚本。
3. 复制 `v3_optimized.user.js` 的完整内容。
4. 保存并启用脚本。
5. 刷新学习通课程播放页面。

## 控制台使用方式

- 识别 iframe 内的真实视频元素
- 自动调用 `play()`
- 如果播放被短暂中断,则尝试恢复播放
- 如果普通播放失败,则尝试静音播放
1. 打开学习通课程播放页面。
2. 按 `F12` 打开开发者工具。
3. 进入 `Console`。
4. 复制 `v3_optimized.js` 的完整内容并执行。

当前默认配置
首次执行后可手动调用

```javascript
configs: {
playbackRate: 1.5,
autoplay: true,
retryInterval: 2000,
maxRetries: 10,
videoCheckInterval: 1000,
}
app.run()
app.nextUnit()
```

### 3. 视频结束后
## 当前行为说明

视频触发结束事件后,脚本会调用 `nextUnit()`,在课程目录树中定位到下一小节并点击进入。
### 默认倍速

### 4. 章节测验

如果当前不是视频而是“章节测验”页面,脚本会尝试点击:
脚本默认配置为:

```javascript
#prevNextFocusNext
playbackRate: 1
```

以跳过当前测验步骤并继续后续流程。
页面播放器如果自行改回其他倍速,脚本会在播放、暂停恢复、倍速变化和定时检查时重新设置为 `1x`。

### 视频任务点

## 使用方法
进入视频页后,脚本会:

### 方法一:控制台执行
- 扫描当前页面和可访问 iframe 中的视频任务 iframe。
- 找到真实的 `video` 元素并尝试播放。
- 播放失败时尝试静音播放。
- 视频暂停或长时间无进度时尝试恢复播放。
- 视频结束后检查同小节内是否还有未完成的视频任务点。

1. 打开学习通课程播放页
2. 按 `F12`
3. 进入 `Console`
4. 复制 [v3_optimized.js](/E:/code/xuexitongScript-master/v3_optimized.js) 全部内容
5. 粘贴并执行
如果某个视频任务点已经显示完成,脚本会跳过它;如果本小节所有视频任务点都完成,脚本会直接进入下一节。

首次执行后可用:
### 教材和文本阅读任务

```javascript
app.run()
app.nextUnit()
```
脚本会在确认当前任务不是视频、不是章节测验后,才进入阅读任务流程。

### 方法二:Tampermonkey
阅读任务会逐步滚动页面和文档容器。滚动到底部后,如果任务点仍未完成,脚本会继续等待和检测,不会直接切到下一节。

1. 安装 Tampermonkey
2. 导入 [v3_optimized.user.js](/E:/code/xuexitongScript-master/v3_optimized.user.js)
3. 确认脚本已启用
4. 刷新学习通播放页面
### 章节测验

## 已知说明
章节测验页面会尝试点击下一节跳过。遇到“当前章节还有任务点未完成,是否去完成?”弹窗时,脚本会根据当前页面类型处理:

### 1. 为什么有时会看到 `AbortError`
- 普通学习任务:点击“去学习”或“去完成”。
- 章节测验:优先点击“下一节”,避免在测验页和弹窗之间反复循环。

常见报错:
### 任务类型识别

```text
The play() request was interrupted by a call to pause()
```
任务类型判断的优先级为:

1. 视频任务
2. 章节测验
3. 教材、文档、阅读任务
4. 未知任务

这通常不是视频坏了,而是:
这样可以避免视频 iframe 加载较慢时,被误判成教材阅读页面而一直滚动。

- 页面从步骤页切到视频页时,播放器初始化会短暂停一下
- 页面内部脚本会在加载过程中重置播放状态
- 浏览器对媒体播放请求进行了短暂中断
## 常见问题

脚本会优先尝试恢复播放,而不是立即判定失败。
### 仍然跑旧逻辑怎么办?

### 2. 为什么会出现重复日志
如果使用 Chrome 扩展,请打开 `chrome://extensions/`,点击该扩展的“重新加载”,然后刷新学习通页面。

如果同一页面反复粘贴执行脚本,会导致同一套监听和定时逻辑叠加,从而出现多次日志
如果使用 Tampermonkey,请确认脚本内容已经替换成最新的 `v3_optimized.user.js`

建议:
### 为什么控制台仍然有学习通自己的报错?

- 刷新页面后只执行一次
- 如果使用油猴版,尽量不要再在控制台重复粘贴执行
学习通页面本身会加载多个内部脚本和跨域 iframe,控制台可能出现平台自身的 warning 或 error。脚本已尽量忽略可预期的跨域 iframe 访问错误,重点看是否还有来自 `v3_optimized.user.js` 的连续异常。

### 3. 为什么“静音播放成功”但一开始还能听到声音
### 为什么阅读任务滚到底后没有立刻下一节?

旧逻辑里曾经会在静音启动成功后恢复声音。当前建议使用持续静音方式,不再自动恢复
这是有意设计。部分教材任务需要页面上报完成状态后才算任务点完成,所以脚本会等待“任务点已完成”信号,避免滚到底但任务未完成就误跳

## 当前调试结论
## 验证脚本

目前这版已经验证
可在仓库根目录运行

- 顶部 `2视频` 标签可以程序化点击
- 手动进入视频页后可以自动播放
- 静音恢复链路可用
```bash
node tests/verify-dialog-throttle.js
node tests/verify-no-skip-and-frame-guard.js
node tests/verify-flow-fixes.js
node tests/verify-reading-task.js
node tests/verify-speed-lock.js
node tests/verify-jquery-compat.js
node tests/verify-task-classification.js
node tests/verify-video-completion-skip.js
```

目前重点保留的是稳定性,不再继续叠加额外功能。
也可以对主要脚本做语法检查:

```bash
node --check v3_optimized.user.js
node --check chrome-extension/v3_optimized.user.js
node --check v3_optimized.js
node --check chrome-extension/content.js
```

## 免责声明

本项目仅用于脚本调试、前端自动化研究和页面行为分析请遵守目标平台的使用规定。
本项目仅用于脚本调试、前端自动化研究和页面行为分析请遵守目标平台的使用规定。
2 changes: 1 addition & 1 deletion README_v2.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
### 注意事项

- 如遇到脚本出错,请先刷新页面后再次使用。
- 默认播放速度为8倍,可以修改代码`v.playbackRate=8; `这个值来修改速度,如果电脑配置较低,请降低倍率
- 默认播放速度为1倍,可以修改代码`v.playbackRate=1; `这个值来修改速度。
- 测试最大倍率可以达到16倍,再快也许会报错。

### v2版本说明文档
Expand Down
14 changes: 14 additions & 0 deletions chrome-extension/README-install.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Xuexitong Script 1x Chrome Extension

This folder is an unpacked Chrome extension wrapper around the modified userscript.

Install manually:

1. Open `chrome://extensions/`.
2. Enable `Developer mode`.
3. Click `Load unpacked`.
4. Select this folder:
`C:\Users\ASUS\Documents\Codex\2026-05-18\chaolucky18-xuexitongscript-https-github-com-chaolucky18\chrome-extension`
5. Refresh the Xuexitong course page.

The bundled script sets `playbackRate` to `1`.
11 changes: 11 additions & 0 deletions chrome-extension/content.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
(() => {
const scriptId = "codex-xuexitong-script-1x";
if (document.getElementById(scriptId)) return;

console.log("[Xuexitong Script 1x] content script injecting page script");
const script = document.createElement("script");
script.id = scriptId;
script.src = chrome.runtime.getURL("v3_optimized.user.js");
script.onload = () => script.remove();
(document.head || document.documentElement).appendChild(script);
})();
23 changes: 23 additions & 0 deletions chrome-extension/manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"manifest_version": 3,
"name": "Xuexitong Script 1x",
"version": "3.2.0.9",
"description": "Runs the local Xuexitong autoplay script with default playback speed set to 1x.",
"content_scripts": [
{
"matches": [
"*://mooc1.chaoxing.com/mycourse/studentstudy*",
"*://*.chaoxing.com/mycourse/studentstudy*",
"*://*.chaoxing.com/mooc2-ans/mycourse/studentstudy*"
],
"js": ["content.js"],
"run_at": "document_idle"
}
],
"web_accessible_resources": [
{
"resources": ["v3_optimized.user.js"],
"matches": ["*://*.chaoxing.com/*"]
}
]
}
Loading