Files
ClassFeedback/.claude/rules/oj_data.md

4.8 KiB
Raw Blame History

OJ数据获取规则

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

OJ系统信息

  • 平台: Hydro OJ
  • 地址: https://oj.qonnwolf.com
  • 认证方式: Cookie登录(POST /login,uname + password)
  • 凭据来源: .env 文件中的 OJ_USERNAME 和 OJ_PASSWORD

OJ课程结构

课程 (course) → 课次 (period) → 作业包 (homework) → 题目 (problem)
  • 课程ID示例:6975984d71e15346c9e8fdc2
  • 课次ID示例:69aa50c127e54d3ad7ed7ab7(HTML中 period-card 的 data-id)
  • 作业包ID示例:69ad011c27e54d3ad7ef50d0(homework系统的ID)

⚠️ 重要规则

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

数据获取方式

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

python scripts/update_feedback_with_oj.py \
  --course CSP04-<课次编号> \
  --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"  # CSP04-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)
# 返回: [("CSP0409A1", "CSP0409A1", "银行叫号模拟"), ...]

作业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个作业包,统计该包内所有题目的完成情况
  • 如果有多个作业包,分别统计每类(课堂练习/课后作业/拓展练习)的完成情况

📌 当前学期课程定位(2026秋季 · CSP04)

⚠️ 2026秋季起 hw_dict.json 中 CSP04- 已更新为新学期 ID*(旧 ID 对应历史学期,已备份至 .claude/temp/)。

  • 课程: 2026 秋季班 CSP04(20 课次,对标 GESP 四级)
  • 课程页: https://oj.qonnwolf.com/course/6a826183bdde81887a2237b5
  • 每课 A 包(课堂练习)作业 ID 对照表: .claude/lesson/CSP/CSP04/OJ作业ID-2026秋.md
  • 题号命名: 第 N 课题目形如 S040NP1(P=编程题)、S040NA6/A7(选择/判断题,同属A包)、S040NB*(课后作业)、S040NC*(拓展练习)
  • 上课代码文件夹对照: C++代码/CSP04/NN/ ↔ OJ 第 NN 章(如 C++代码/CSP04/01/ ↔ 第1课「01 基础回顾」,内含 S0401P1~P5 五道题的参考代码)
  • 查 OJ 数据流程(课评用): 登录后 ① 按 OJ作业ID-2026秋.md 取该课 A 包 tid → ② 抓 /homework/{tid} 题目清单与 /record?tid={tid} 提交记录 → ③ 按学生分析 AC/WA/提交次数。注意:A 包除 P1~P5 编程题外通常还有 A6/A7 选择判断题,也计入统计(以 OJ 实际题目数为准)。