超星学习通自动作业
概述
自动化完成超星学习通(i.chaoxing.com)上的作业/测验,支持选择题、填空题、判断题、简答题。
前置条件
- 浏览器: 使用 browser 工具(Playwright / CDP),profile 需已配置远程调试端口
- OCR 服务(可选): 本地多模态模型(如 Ollama + Qwen2.5-VL),仅在遇到图片题目时按需启动
- 网络: 用户需确保能访问 i.chaoxing.com
配置项
以下参数需根据用户环境调整:
| 参数 | 说明 | 示例 |
|------|------|------|
| BROWSER_PROFILE | 浏览器 profile 名称 | yuki, default, openclaw |
| CDP_PORT | Chrome 远程调试端口 | 9222 |
| OLLAMA_MODELS_DIR | Ollama 模型存储路径 | F:\ollama-models |
| OLLAMA_EXE | Ollama 可执行文件路径 | C:\Users\<user>\AppData\Local\Programs\Ollama\ollama.exe |
| OCR_MODEL | OCR 模型名称 | qwen2.5vl:7b |
Ollama 按需启动
Ollama 服务不常开,仅在遇到图片题目时启动,作业完成后关闭。
启动检查
curl -s --max-time 2 http://127.0.0.1:11434/api/version
- 返回
{"version":...}→ 已运行,直接使用 - 超时或无响应 → 需要启动
启动命令
$env:OLLAMA_MODELS = "<OLLAMA_MODELS_DIR>"
Start-Process -FilePath "<OLLAMA_EXE>" -ArgumentList "serve" -WindowStyle Hidden
启动后等待 3 秒,再次检查 /api/version 确认就绪。
关闭
作业全部完成后关闭(节省资源):
Stop-Process -Name ollama -Force -ErrorAction SilentlyContinue
操作流程
Phase 1: 登录
-
打开超星首页
browser open url=https://i.chaoxing.com/base profile=<BROWSER_PROFILE> label=chaoxing -
检查是否已登录
browser act targetId=t1 kind=wait loadState=networkidle browser snapshot targetId=t1 refs=aria- 页面 URL 是
i.chaoxing.com/base且包含用户头像/用户名 → 已登录,跳到 Phase 2 - 页面重定向到
passport2.chaoxing.com/login→ 未登录,继续登录流程
- 页面 URL 是
-
询问账号密码(仅在未登录时)
- 告知用户需要登录,请求提供账号密码
- NEVER store credentials (username, password) in any file. Discard immediately after use.
-
填写登录表单
登录页面元素定位:
- 手机号输入框:
placeholder="手机号/邮箱号"(selector:#phone) - 密码输入框:
placeholder="学习通密码"(selector:#pwd) - 登录按钮:
name="登录"(selector:#loginBtn)
browser act targetId=t1 ref=<phone_ref> kind=fill text=<手机号> browser act targetId=t1 ref=<pwd_ref> kind=fill text=<密码> browser act targetId=t1 ref=<login_btn_ref> kind=click - 手机号输入框:
-
处理验证码(如果有)
- 检查页面是否有
#captcha容器且非空 - 如果有滑块验证码:尝试模拟拖拽
- 如果失败,告知用户手动完成验证码,等待确认后继续
- 如果无验证码,直接跳过
- 检查页面是否有
-
验证登录成功
- 等待页面跳转到
i.chaoxing.com/base - 如果登录失败(错误提示),告知用户并重新询问
- 等待页面跳转到
Phase 2: 导航到作业
-
读取用户指令确定要做的作业
- 如果用户给了具体作业名称/URL,直接导航
- 否则询问用户要做哪个作业
-
导航到作业页面
browser navigate targetId=t1 url=<作业URL> -
等待页面加载
browser act targetId=t1 kind=wait loadState=networkidle browser snapshot targetId=t1 refs=aria
Phase 3: 提取题目
-
识别题目容器
- 超星作业通常在
.question或.TiMu等 class 下 - 用 snapshot 获取页面结构
- 超星作业通常在
-
逐题提取
for each question_element in page: 1. browser snapshot targetId=t1 refs=aria focus=<question_element_ref> 2. 解析题目文本、选项、题型 3. 如果题目包含图片(img 元素),按下方"图片题目处理"流程 OCR -
图片题目处理
CRITICAL IMAGE RULE — READ BEFORE HANDLING ANY IMG ELEMENT
The chaoxing image server (
p.ananas.chaoxing.com) enforces anti-hotlinking and has NO CORS headers.| Method | Result | |--------|--------| | Direct fetch /
imagetool with chaoxing URL | HTTP 403 Forbidden | |evaluate+canvas.toDataURL()| Tainted canvas error | |evaluate+fetch()inside page JS | CORS blocked |The ONLY working method is:
browser screenshot targetId=t1 selector=<img_css_selector>- NEVER use the
imagetool with a chaoxing URL. - NEVER use
evaluateto fetch, draw, or export images via canvas. - NEVER attempt any creative workaround for image extraction.
- If
screenshotfails, SKIP the image and tell the user.
for each question with img element: 1. 检查 Ollama 是否运行(curl /api/version) 2. 如果未运行,启动 Ollama(见"Ollama 按需启动") 3. browser screenshot targetId=t1 selector=<img_selector> 4. 将截图 base64 发送给 OCR 模型 5. 合并 OCR 结果到题目文本 - NEVER use the
-
OCR 调用
curl -s http://127.0.0.1:11434/api/chat -d '{ "model": "<OCR_MODEL>", "messages": [ {"role": "system", "content": "你是OCR文字识别助手。提取图片中的所有文字,保持原格式。不要添加解释。"}, {"role": "user", "content": "提取所有文字", "images": ["<base64_image>"]} ], "stream": false }'
Phase 4: 生成答案
-
使用当前 AI 推理答案
- 将提取的题目文本直接交给当前对话的 AI(你自己)
- 根据题型生成答案:
- 选择题: 返回选项字母 (A/B/C/D)
- 判断题: 返回 "对" 或 "错"
- 填空题: 返回填空内容
- 简答题: 返回 50-200 字的回答
-
答案格式
第1题 (选择题): B 第2题 (填空题): 光合作用 第3题 (判断题): 对
Phase 5: 填写答案
-
逐题填写
for each (question, answer) in questions_and_answers: 1. browser snapshot targetId=t1 refs=aria 2. 定位答案输入元素: - 选择题: 找到对应选项的 radio/checkbox - 填空题: 找到 input/textarea - 判断题: 找到 "对"/"错" 的 radio 3. 填写答案: browser act targetId=t1 ref=<answer_ref> kind=<click|fill> text=<answer> 4. 随机等待 5-15 秒(模拟真人) -
填写节奏
- 每题之间
sleep 5-15 秒(随机) - 填空题打字速度模拟:每字符 50-100ms
- MUST NOT fill all answers at once. Simulate human pacing with random delays.
- 每题之间
Phase 6: 提交
-
确认答案(可选,用户可跳过)
- 告诉用户题目已做完,询问是否提交
- 如果用户说"全自动",直接提交
-
点击提交按钮
browser snapshot targetId=t1 refs=aria # 找到提交按钮(通常是 "提交" 或 "交卷") browser act targetId=t1 ref=<submit_ref> kind=click -
处理确认弹窗
browser act targetId=t1 kind=wait loadState=networkidle browser snapshot targetId=t1 refs=aria if confirm_dialog: browser act targetId=t1 ref=<confirm_ref> kind=click -
报告结果
- 告诉用户作业已提交
- 如果有即时分数显示,报告分数
-
清理 Ollama(如果本次启动过)
- 如果用户还有后续作业要做,保持 Ollama 运行
- 所有作业完成后可选关闭
错误处理
| 错误 | 处理 | |------|------| | 登录失败 | 告诉用户错误信息,重新询问账号密码 | | 验证码无法解决 | 告诉用户手动完成,等待确认后继续 | | 题目图片 OCR 失败 | 尝试放大图片重 OCR,失败则跳过该题告诉用户 | | 找不到输入元素 | 截图告诉用户当前页面状态,请求指导 | | 提交失败 | NEVER auto-retry submission (prevent duplicate submissions). Tell the user the error. |
Browser 工具 API 语法
IMPORTANT: Follow the exact syntax below. Incorrect API calls will fail silently.
Top-level actions (call directly)
browser open url=<url> profile=<BROWSER_PROFILE> label=chaoxing
browser snapshot targetId=t1 refs=aria
browser screenshot targetId=t1 selector=<css_selector>
browser navigate targetId=t1 url=<url>
Sub-actions (use action=act + kind=<action>)
browser act targetId=t1 kind=click ref=<ref>
browser act targetId=t1 kind=fill ref=<ref> text=<value> # NOTE: use text=, NOT value=
browser act targetId=t1 kind=wait loadState=networkidle
browser act targetId=t1 kind=type text=<string>
browser act targetId=t1 kind=drag startRef=<ref> endRef=<ref>
browser act targetId=t1 kind=evaluate fn=<js_function_string>
Common mistakes to avoid
✗ browser wait targetId=t1 loadState=networkidle → ✓ browser act targetId=t1 kind=wait loadState=networkidle
✗ browser act ref=<ref> action=fill value=<val> → ✓ browser act ref=<ref> kind=fill text=<val>
✗ browser act ref=<ref> action=click → ✓ browser act ref=<ref> kind=click
安全与反检测
-
Random delays
- 5-15 seconds random wait between questions
- 50-100ms per character when typing fill-in-blank answers
- NEVER use fixed intervals
-
Minimum duration
- Entire homework MUST take at least 5-10 minutes
- Extend proportionally if there are many questions
-
Data privacy
- NEVER store credentials in any file — discard immediately after use
- NEVER log user's answer history
工具依赖
- browser: Playwright + CDP 浏览器自动化工具
- OCR(可选): 本地多模态视觉模型(如 Ollama + Qwen2.5-VL)
- AI 推理: 当前对话的 AI 模型
Scan to join WeChat group