← Back to home@forgotfish

dsh-cx-learn

DSH 插件:超星学习通自动刷课与作业答题。支持 AI 答题 / 人工答题两种模式,可自选浏览器内核与 LLM 模型。

Stars
2
Language
JavaScript
Created
Oct 25, 2026
Updated
Oct 25, 2026
GitHub repo

Introduction

dsh-cx-learn

DeepSeek Harness (DSH) 插件:把「超星学习通看课」变成一个可调度、可观测、可优雅停止的后台任务。

用 CDP(Chrome DevTools Protocol)驱动一个真实的 Chromium,自动推进课程视频: 恢复播放、关掉防挂机弹窗、自然结束自动切下一节、弹题作答(AI 或人工)、跳过已完成章节。


目录


它做什么

能力说明
P0 播放态检测视频被暂停就恢复播放;关掉防挂机弹窗
P1 自动切节当前节自然结束后自动切到下一节
P2 弹题作答「AI 答题」或「人工答题」两种模式
P3 跳过已完成识别已看完的任务点并跳过
P4 章节模式单章节 / 章节连播,带最大节数上限
拟人化节奏所有随机延迟集中在 CONFIG,可统一调节

另有 扫码登录:插件设置页直接显示二维码,用手机 App 扫一次即可,登录态长期复用。


特点

  • 零 npm 依赖 —— 引擎只用 Node 内置模块,不引入 puppeteer / playwright
  • 内核与插件解耦 —— 换机器只要把浏览器内核丢进共享目录,UI 上直接选
  • 多用户隔离 —— 每个用户自己的配置、日志、登录态、浏览器 profile
  • 模型来源通用 —— 直接读取你在 DSH 里已配置的所有模型,不是硬编码几个
  • 安全停止 —— 检测到人脸识别 / 活体 / 验证码立即停止,绝不尝试绕过
  • 不碰后端 —— 不篡改数据、不伪造进度上报、不调用任何进度写接口

安装

方式一:DSH 插件市场

在 DSH 的插件管理页搜索 dsh-cx-learn,安装后启用。

方式二:手动安装

# 克隆到 DSH 的插件目录(路径按你的部署调整)
git clone https://github.com/forgotfish/dsh-cx-learn.git

# 让 profile 认识这个 bundle
dsh plugin --profile web add dsh-cx-learn

# 本地开发时指向本地目录
dsh plugin --profile web add link:/绝对路径/dsh-cx-learn

安装后在 DSH 的 设置 → 学习通看课 里就能看到面板。

全局安装(多用户)

在共享插件清单 access.yaml 的 base_bundles 里加上 dsh-cx-learn,所有用户 profile 自动继承:

base_bundles:
- '@deepseek-ai/dsh-base'
- '@deepseek-ai/dsh-web-app'
- dsh-cx-learn

快速上手

  1. 准备浏览器内核(见下一节)
  2. 打开 DSH → 设置 → 学习通看课
  3. 点「开始登录」→ 等约 10 秒 → 点「刷新二维码」→ 用手机学习通 App 扫码
  4. 点「读取我的课程」→ 从下拉里选一门课(会自动带上正确的 clazzid / enc)
  5. 选「答题方式」:
    • 人工答题 —— 遇到弹题就停下等你处理
    • AI 答题 —— 选一个模型自动作答
  6. 点「保存配置」→「开始看课」

浏览器内核从哪来

内核不在插件目录里,而是在一个共享目录里,这样换机器不用改插件。

插件按这个顺序找内核目录:

  1. 环境变量 CX_BROWSER_ROOT
  2. $DSH_HOME/cx-learn/browsers
  3. /vol1/@apphome/dsh-shared/browsers(fnOS / NAS 场景)
  4. /opt/dsh-shared/browsers
  5. 插件目录下的 .browser/

目录结构:每个子目录 = 一个内核,目录里放可执行文件。

browsers/
├── chrome-linux64/
│   └── chrome          ← 可执行文件
├── chromium/
│   └── chromium
└── chrome-headless-shell-linux64/
    └── chrome-headless-shell

支持的可执行文件名:chrome、chromium、chromium-browser、headless_shell、chrome-headless-shell。

设置页的下拉里会列出所有找到的内核(含版本号),也可以直接填自定义绝对路径。

去哪下载内核:

注意:部分精简版 Chromium 缺 H.264/AAC 解码,播放某些课程视频会失败。 chrome-headless-shell 与完整 chrome 在这一点上不同。


答题模型从哪来

下拉里的模型来自两个来源,插件启动时自动读取:

1. 你在 DSH 里已配置的模型

通过 ctx.llm.listProviders() + listModels() 读出你配置过的所有服务商及其模型。 装了 dsh-our-free-model 之类的插件,它们的模型也会一并出现。

2. 插件内置模型

智谱 GLM 系列(走 OpenAI 兼容接口,需要环境变量 ZHIPU_API_KEY)。

怎么知道哪个模型能用?

设置页有两个按钮:

  • 测试模型 —— 用当前选中的模型答一道题(1949 年那道),立刻知道通不通
  • 批量体检 —— 依次探测一批模型,列出哪些可用、哪些报什么错

常见失败原因:

现象原因
RATE_LIMIT / 免费额度用尽上游免费额度耗尽,等配额恢复
INVALID_CREDENTIAL该模型的凭据没配好
模型已下线上游把该模型 EOL 了
余额不足服务商账号欠费

HTTP 接口

所有接口挂在 /api/cx-learn 前缀下。

方法路径说明
GET/status完整状态:配置、引擎、内核、模型、近期日志
GET/config读配置
POST/config写配置(部分更新)
GET/models可选模型清单(含来源分类)
POST/models/health批量探活
POST/ask-test用指定模型答一道题
GET/browsers可用浏览器内核清单
POST/start启动一轮任务
POST/stop停止当前任务
POST/login启动扫码登录流程
GET/qr取登录二维码(base64 data URL)
GET/courses读取账号下的课程列表
GET/log最近日志

配置项

存在 $DSH_HOME/cx-learn/config.json:

字段默认值说明
courseUrl''课程学习页 URL
modecontinue_chapterscontinue_chapters 连播 / current_chapter 只跑当前章
maxSections5单轮最多看完多少节
videoDoneAt98.5%判定「看完」的进度阈值
browserId''选中的内核 id(空 = 自动探测)
chromiumPath''自定义内核绝对路径(非空时优先)
headlesstrue是否无头运行
quizModemanualai 模型代答 / manual 暂停等人工
quizModel''答题模型 id(见 /models 返回)

环境变量

变量作用
DSH_HOMEDSH 数据根目录,插件的运行期数据落在 $DSH_HOME/cx-learn/
CX_BROWSER_ROOT浏览器内核共享目录
ZHIPU_API_KEY内置智谱模型用的 API Key

引擎侧还支持(独立运行时有用):

变量作用
CX_CHROMIUM浏览器可执行文件路径
CX_PROFILE_DIR浏览器 profile 目录(存登录态)
CX_COURSE_URL课程 URL
CX_CDP_PORTCDP 端口(默认 9223)
CX_LOGIN_SHOT_DIR登录二维码截图目录
CX_QUIZ_MODEai / manual
CX_LLM_ASK_URL宿主答题回调地址(插件注入)

脱离插件独立运行

引擎是自包含的,不装插件也能跑:

# 扫码登录
node engine/chaoxing-autolearn.js --login

# 跑一轮
node engine/chaoxing-autolearn.js \
  --mode=continue_chapters \
  --max-sections=5 \
  --course-url='https://mooc1.chaoxing.com/...'

# 自检
node engine/chaoxing-autolearn.js --selftest

也可以当 MCP 工具用:

node engine/chaoxing-autolearn.js --serve-mcp

会暴露 cx_learn(推进看课)和 cx_login(扫码登录)两个工具。


架构

┌─────────────────────────────────────────────┐
│  DSH Web UI (client.js)                      │
│  设置页:课程 / 内核 / 模型 / 答题方式          │
└──────────────────┬──────────────────────────┘
                   │ /api/cx-learn/*
┌──────────────────▼──────────────────────────┐
│  host 半端 (index.js)                        │
│  · 进程生命周期 · HTTP 接口 · 配置持久化        │
│  · ask server:把引擎的答题请求转发给 ctx.llm  │
└──────────────────┬──────────────────────────┘
                   │ spawn + 环境变量
┌──────────────────▼──────────────────────────┐
│  引擎 (engine/chaoxing-autolearn.js)          │
│  零依赖 · CDP 适配层 + 业务状态机              │
│  · P0 播放态  P1 切节  P2 答题  P3 跳过  P4 模式 │
└──────────────────┬──────────────────────────┘
                   │ CDP
┌──────────────────▼──────────────────────────┐
│  真实 Chromium(共享内核目录)                 │
└─────────────────────────────────────────────┘

为什么要绕一圈 host? 引擎是子进程,拿不到 ctx.llm。所以 host 起一个 loopback ask 端点,引擎遇到弹题就回调过来,由 host 用 DSH 的模型服务作答。 这样引擎保持零依赖,同时又能用上你在 DSH 里配好的所有模型。


免责声明

本项目用于浏览器自动化技术研究。

超星学习通等教育平台普遍禁止自动化脚本,使用可能导致学习进度被退回或账号处罚。 使用者需自行确认所在平台的服务条款与当地法规,并自行承担全部责任。

本项目不篡改后端数据、不伪造进度上报、不调用任何进度写接口; 所有动作均为模拟页面点击 / 播放行为;一旦检测到人脸识别、活体检测、验证码等 人工验证特征会立即停止,不做任何绕过。


License

MIT