Back to skills
extension
Category: Productivity & OfficeNo API key required

学习通刷题(需自配ocr)

大一随便做的喵,不会代码喵~

personAuthor: asasllhubModelScope

超星学习通自动作业

概述

自动化完成超星学习通(i.chaoxing.com)上的作业/测验,支持选择题、填空题、判断题、简答题。

前置条件

  1. 浏览器: 使用 browser 工具(Playwright / CDP),profile 需已配置远程调试端口
  2. OCR 服务(可选): 本地多模态模型(如 Ollama + Qwen2.5-VL),仅在遇到图片题目时按需启动
  3. 网络: 用户需确保能访问 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: 登录

  1. 打开超星首页

    browser open url=https://i.chaoxing.com/base profile=<BROWSER_PROFILE> label=chaoxing
    
  2. 检查是否已登录

    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未登录,继续登录流程
  3. 询问账号密码(仅在未登录时)

    • 告知用户需要登录,请求提供账号密码
    • NEVER store credentials (username, password) in any file. Discard immediately after use.
  4. 填写登录表单

    登录页面元素定位:

    • 手机号输入框: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
    
  5. 处理验证码(如果有)

    • 检查页面是否有 #captcha 容器且非空
    • 如果有滑块验证码:尝试模拟拖拽
    • 如果失败,告知用户手动完成验证码,等待确认后继续
    • 如果无验证码,直接跳过
  6. 验证登录成功

    • 等待页面跳转到 i.chaoxing.com/base
    • 如果登录失败(错误提示),告知用户并重新询问

Phase 2: 导航到作业

  1. 读取用户指令确定要做的作业

    • 如果用户给了具体作业名称/URL,直接导航
    • 否则询问用户要做哪个作业
  2. 导航到作业页面

    browser navigate targetId=t1 url=<作业URL>
    
  3. 等待页面加载

    browser act targetId=t1 kind=wait loadState=networkidle
    browser snapshot targetId=t1 refs=aria
    

Phase 3: 提取题目

  1. 识别题目容器

    • 超星作业通常在 .question.TiMu 等 class 下
    • 用 snapshot 获取页面结构
  2. 逐题提取

    for each question_element in page:
      1. browser snapshot targetId=t1 refs=aria focus=<question_element_ref>
      2. 解析题目文本、选项、题型
      3. 如果题目包含图片(img 元素),按下方"图片题目处理"流程 OCR
    
  3. 图片题目处理

    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 / image tool 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 image tool with a chaoxing URL.
    • NEVER use evaluate to fetch, draw, or export images via canvas.
    • NEVER attempt any creative workaround for image extraction.
    • If screenshot fails, 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 结果到题目文本
    
  4. 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: 生成答案

  1. 使用当前 AI 推理答案

    • 将提取的题目文本直接交给当前对话的 AI(你自己)
    • 根据题型生成答案:
      • 选择题: 返回选项字母 (A/B/C/D)
      • 判断题: 返回 "对" 或 "错"
      • 填空题: 返回填空内容
      • 简答题: 返回 50-200 字的回答
  2. 答案格式

    第1题 (选择题): B
    第2题 (填空题): 光合作用
    第3题 (判断题): 对
    

Phase 5: 填写答案

  1. 逐题填写

    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 秒(模拟真人)
    
  2. 填写节奏

    • 每题之间 sleep 5-15 秒(随机)
    • 填空题打字速度模拟:每字符 50-100ms
    • MUST NOT fill all answers at once. Simulate human pacing with random delays.

Phase 6: 提交

  1. 确认答案(可选,用户可跳过)

    • 告诉用户题目已做完,询问是否提交
    • 如果用户说"全自动",直接提交
  2. 点击提交按钮

    browser snapshot targetId=t1 refs=aria
    # 找到提交按钮(通常是 "提交" 或 "交卷")
    browser act targetId=t1 ref=<submit_ref> kind=click
    
  3. 处理确认弹窗

    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
    
  4. 报告结果

    • 告诉用户作业已提交
    • 如果有即时分数显示,报告分数
  5. 清理 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

安全与反检测

  1. Random delays

    • 5-15 seconds random wait between questions
    • 50-100ms per character when typing fill-in-blank answers
    • NEVER use fixed intervals
  2. Minimum duration

    • Entire homework MUST take at least 5-10 minutes
    • Extend proportionally if there are many questions
  3. 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 模型