chaoxing-kit
超星学习通(xuexitong / chaoxing)课程自动化工具包。真实 1x 播放、不伪造进度上报,通过 Chrome DevTools Protocol 直接操控真实页面。
提供两种入口,共用同一套 core:
- CLI:
chaoxing scan / run / status / doc / quiz / score - MCP server:把同样的能力暴露成 MCP tools,供 Claude Desktop / Cursor / Hermes 等 agent 调用
设计原则
- 不碰协议层:
multimedia/log心跳里的enc是页面 JS 现算的签名、isdrag是防拖拽标记 —— 一律不动,让真播放器自己发。这是它能长时间稳定跑的原因。 - 完成判定读服务端:视频播完只是本地结束,还要回读右栏
.icon_Completed;任务点是否记账则看knowledge/cards里对应卡片有没有ans-job-finished、mArg.attachments[].isPassed。目录的 ✅ 可能骗人(只反映节点访问过)。 - 零依赖:不用 puppeteer / playwright,自带 200 行 CDP 客户端,只依赖 node 内置模块。
前置要求
| 项 | 说明 |
|---|---|
| Node.js | ≥ 18(用内置 fetch / ESM) |
| 浏览器 | Edge 或任意 Chromium 内核(CX_BROWSER 指定路径;默认 Windows 的 Edge) |
| 视觉能力 LLM | 测验环节必需:超星有字体混淆(DOM 文本是乱码),题目只能靠截图 + 视觉模型读。本工具只负责截图与点选,读题交给调用方(如 DeepSeek 4.1 系列、Qwen-VL、Claude 等) |
安装
git clone https://github.com/Nairocy/chaoxing-kit.git
cd chaoxing-kit
node src/cli.mjs --help
# 或全局: npm link
快速开始
# 1. 登录(弹有头 Edge,扫码;登录态存 profile,后续无头复用)
chaoxing login
# 2. 找到课程参数:courseId / clazzId(课程页 URL 里就有)
# 例:.../mycourse/studentstudy?courseId=266987706&clazzid=154444476&cpi=568614919
chaoxing scan --course 266987706/154444476 --cpi 568614919 --start 0 --limit 18
# 3. 跑视频(真实播放,播完回读核验)
chaoxing run --course 266987706/154444476 --cpi 568614919 --start 1.1 --max 8
# 4. 看进度 / 判阶段
chaoxing status --course ...
chaoxing stage --course ...
# 5. 文档任务点(滚到末页触发记账;多文档节点会逐个 iframe 处理)
chaoxing doc 9.1 --course ... --kid <knowledgeId>
# 6. 测验:先截图 → 视觉模型读题 → 按行索引点选 → 提交 → 读分
chaoxing quiz 4.2 --course ... --shots
chaoxing quiz 4.2 --course ... --perq "4,4,2" --ans "1:B,2:AC,3:A" --submit
chaoxing score --course ...
MCP 接入
{
"mcpServers": {
"chaoxing": {
"command": "node",
"args": ["/absolute/path/to/chaoxing-kit/src/mcp.mjs"]
}
}
}
工具列表:
| tool | 作用 |
|---|---|
cx_login |
有头浏览器扫码登录 |
cx_scan |
扫描课程结构(任务点类型/时长/完成态) |
cx_run |
跑视频(mil / skipWork / force 等模式) |
cx_status |
目录完成度 + cnt 欠账分布 |
cx_stage |
阶段判定(PLAYING / VIDEOS_DONE / VIDEOS_LEFT / BUSY) |
cx_doc |
文档任务点滚动记账 |
cx_quiz_shots |
测验分段截图(返回路径,交给视觉模型) |
cx_quiz_answer |
按行索引点选 / 提交 |
cx_score |
读成绩页逐题得分 |
典型 agent 流程:cx_scan → cx_run(mil:true) 刷完视频 → cx_stage 确认 VIDEOS_DONE → 逐节 cx_quiz_shots → 视觉模型出答案 → cx_quiz_answer → cx_score 核验。
关键概念
cnt(任务点欠账数):右栏目录每个节点带一个 jobUnfinishCount
2= 视频 + 测验都欠1= 只欠测验(视频已记账)- 空 = 无任务点(空壳父节点 / 阅读 / 问卷)
课型 → 跑法
| 课型 | 特征 | 跑法 |
|---|---|---|
| A 纯视频 | 节点只有 video | 普通模式 |
| B 内嵌测验 | 每节 = 视频 + 章节测验(cnt=2) |
--mil:先刷光视频,测验另做 |
| C 复合任务点 | 每节挂 document + video + workid | --mil + doc 逐节滚文档 |
| D 独立测试题 | 章末单独一个 work 节点 | --skip-work 跳过测验节点 |
测验为什么按「第几行」点:超星开了字体混淆,DOM 文本是乱码,只能按 a.fl.after 的行位置索引。--perq 给每题选项数(累加算 base),--ans 给 题号:字母。判断题 2 项;排序题的下拉框不在 a.fl.after 里,首项要写 0;图片选项同样占行。
目录假完成:目录 ✅ 只代表节点被访问过,不代表任务点记账。遇到「目录完成但卡片没有 ans-job-finished」的节点,用 --force <节号> 强制补课。
限制
- 只能 1x 实时:这是真实播放的必然代价,21 小时的课就是 21 小时
- 测验不能全自动:需要视觉模型读题;填空题(自定义 div 编辑器)无法程序化填入
- 单实例:一个浏览器调试端口 + 一个 profile,跑课期间同账号别在手机/其它浏览器进章节页(会触发「多终端登录」风控)
- 题库不可靠:外部题库答案键经常错位,必须按题干逐字对位,不要盲抄
免责声明
本项目仅用于学习 Chrome DevTools Protocol 自动化与个人学习记录管理。使用它可能违反超星用户协议及所在学校的学习纪律,由此产生的后果由使用者自负。请勿用于商业代刷或成绩作弊。