Skip to content

CsuCook1e/AntiChaoxing

Repository files navigation

AntiChaoxing

学习通页面前端自动化研究项目。包含两个独立但联动的模块:

  1. 自动刷课脚本 — 检测视频/阅读/测验任务,按原页面框架自动播放推进。
  2. 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

模块 1:自动刷课脚本

功能概览

  • Chrome MV3 扩展入口:通过 manifest.json 注册 content script,匹配学习通课程页(mooc1.chaoxing.com/mycourse/studentstudy*)。
  • 页面脚本注入content.jsv3_optimized.user.js 注入到页面 main world,便于访问课程框架 jQuery 对象。
  • 任务类型识别:通过 _getTaskKind() 区分 video / reading / quiz。
  • 视频任务自动播放:每秒检查视频状态,暂停时自动恢复,进度不前进 7 秒时触发保活,播放结束自动切下一节。默认倍速 1x,避免学习通后台 token 校验异常。
  • 阅读任务自动滚动:每 800ms 滚动 420 像素,到底部停留 5 秒后判定完成。
  • 章节测验跳过:识别 quiz 页面直接点击下一节按钮。
  • 弹窗自动确认:劫持 window.confirm 处理任务点弹窗,自动应答。
  • 课程目录自动推进:同章节有下一小节 → 切小节;否则切下一章。

关键配置(window.app.configs

字段 默认值 说明
playbackRate 1 视频播放速率
autoplay true 是否启用自动播放流程
retryInterval 2000 播放失败重试间隔(ms)
maxRetries 10 最大重试次数
videoCheckInterval 1000 视频状态检查间隔(ms)
dialogCheckInterval 1000 弹窗检查间隔(ms)
readingScrollInterval 800 阅读任务滚动间隔(ms)
readingScrollStepPx 420 每次滚动像素
guardNoProgressMs 7000 视频卡顿判定阈值

模块 2:AI 答题侧边栏

功能概览

功能 实现
右侧拉环 + 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 同步

支持的 AI 提供商

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

安装与使用

安装扩展

  1. 打开 chrome://extensions/,开启右上角的"开发者模式"
  2. 点击"加载已解压的扩展程序",选择本仓库目录
  3. 如果是首次安装:会提示需要 <all_urls> 权限(用于 captureVisibleTab),点"启用"

配置 API Key

方式 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 答案 侧边栏内「📋 复制答案」
重新提问(同一张图) 侧边栏内「🔁 重新提问」

申请 API Key

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 答题侧边栏返回的回答仅供学习参考,请独立判断与验证。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors