Files
ClassFeedback/.claude/rules/oj_data.md

3.6 KiB
Raw Permalink Blame History

OJ数据获取规则

本文件定义了OJ数据获取和分析的技术规范。

OJ系统信息

  • 平台: Hydro OJ
  • 地址: https://oj.qonnwolf.com
  • 认证方式: Cookie登录POST /loginuname + password
  • 凭据来源: .env 文件中的 OJ_USERNAMEOJ_PASSWORD

OJ课程结构

课程 (course) → 课次 (period) → 作业包 (homework) → 题目 (problem)
  • 课程ID示例6975984d71e15346c9e8fdc2
  • 课次ID示例69aa50c127e54d3ad7ed7ab7HTML中 period-carddata-id
  • 作业包ID示例69ad011c27e54d3ad7ef50d0homework系统的ID

⚠️ 重要规则

  1. OJ课次编号 ≠ 大纲编号OJ可能跳过或重排课次必须按标题匹配
  2. 只查A包课堂练习CSP03班OJ数据只查询A作业包不查B/C包
  3. A包包含多道具体题目每个A包通常包含3~5道具体题目CSP0309A1 银行叫号模拟CSP0309A2 模拟发牌需在OJ板块中按具体题目列出
  4. hw_dict.json 可能不准确如果配置的ID无数据需要从课程页面重新查找

数据获取方式

方式1: 运行脚本推荐自动获取A包具体题目

python scripts/update_feedback_with_oj.py \
  --course CSP03-<课次编号> \
  --title "<课程名称>" \
  --class-name "<班级目录名>" \
  --date <YYYYMMDD> \
  --students "学生1,学生2,学生3"

脚本执行流程:

  1. hw_dict.json 加载A作业包ID自动过滤B/C包
  2. 访问 /homework/{hw_id} 获取A包中的具体题目列表银行叫号模拟模拟发牌等)
  3. 抓取A包提交记录具体题目分析每个学生的完成情况
  4. 输出包含具体题目名称的OJ数据Markdown板块

方式2: 手动从作业页面获取

import httpx, re
from pathlib import Path

env = {}
for line in Path('.env').read_text(encoding='utf-8').split('\n'):
    if '=' in line and not line.startswith('#'):
        k, v = line.split('=', 1)
        env[k] = v

client = httpx.Client(base_url=env['OJ_BASE_URL'], follow_redirects=True)
client.post('/login', json={"uname": env['OJ_USERNAME'], "password": env['OJ_PASSWORD']})

# 获取A作业包中的具体题目列表
hw_id = "69acffac27e54d3ad7ef5013"  # CSP03-10A
r = client.get(f'/homework/{hw_id}')
problems = re.findall(r'href="/p/([^"?]+)\?tid=' + hw_id + r'"[^>]*><b>([^<]+)</b>(?:&nbsp;|\s)*([^<]*)</a>', r.text)
# 返回: [("CSP0309A1", "CSP0309A1", "银行叫号模拟"), ...]

<EFBFBD><EFBFBD>业ID映射

作业ID存储在 config/hw_dict.json,格式为:

{
  "CSP05-03": [
    {"title": "CSP05-03A", "id": "69ad011b27e54d3ad7ef50ca"},
    {"title": "CSP05-03B", "id": "69ad011d27e54d3ad7ef50dd"},
    {"title": "CSP05-03C", "id": "69ad012027e54d3ad7ef50f0"}
  ]
}

A/B/C分别对应课堂练习 / 课后作业 / 拓展练习

提交记录解析

/record?tid={homework_id}&page={page}/record?p={problem_id}&page={page} 页面解析HTML获取

  • 学生ID和姓名
  • 题目ID和标题
  • 判题状态Accepted→AC, Wrong Answer→WA, 等)
  • 提交时间

分析指标

对每个学生每题生成:

  • 完成状态: 是否AC
  • 提交次数: 总提交数
  • 思考模式: 一气呵成/调试改进/多次尝试/耐心调试/遇到困难
  • 错误分布: WA/CE/RE/TLE各几次

完成率统计规则

  • 完成率 = AC的题目数 / 总题目数
  • 总题目数以OJ实际为准不固定
  • 如果只有1个作业包统计该包内所有题目的完成情况
  • 如果有多个作业包,分别统计每类(课堂练习/课后作业/拓展练习)的完成情况