Files
ClassFeedback/.claude/rules/oj_data.md

121 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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包具体题目)
```bash
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: 手动从作业页面获取
```python
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`,格式为:
```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 实际题目数为准)。