Files
ClassFeedback/OJ作业数据API使用说明.md
chengzi 3b75170862 feat: 添加第12课课评、班级总结及学生画像更新
- K4周日1900班第12课《花朵随心画》课评(梁境城、钟嘉逸、王睿意补课)
- AICODE03/CSP03各班级第12课课评及班级总结
- 更新多班级学生画像
- 课评生成技能优化
2026-05-24 20:48:34 +08:00

153 lines
4.5 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 数据 API 使用说明
> 本文档面向所有老师,介绍如何通过 Claude Code 快速获取学生的 OJ 做题数据(含源代码和错误详情)。
## 一句话总结
在 Claude Code 对话中输入 **"获取 CSP05-02 的OJ数据"**,系统自动调 API 拉取、分析、保存结果。
---
## 前提条件
1. 项目根目录有 `.env` 文件,包含 OJ 登录凭据:
```ini
OJ_BASE_URL=https://oj.qonnwolf.com
OJ_USERNAME=你的用户名
OJ_PASSWORD=你的密码
```
2. OJ 插件 `HydroOJ-Course-Keli365` 已部署(目前已在 oj.qonnwolf.com 上运行)
---
## 使用方式
### 方式1直接对话推荐
在 Claude Code 中输入:
```
获取 CSP05-02 的OJ数据
```
系统自动完成:登录 OJ → 找到课程 → 找到课次 → 拉取全部学生数据 → 保存分析结果。
### 方式2指定班级筛选
```
获取 CSP05-02 的OJ数据只看 CSP05克力周六1600 班的
```
### 方式3不指定课次列出所有可选课次
```
获取 CSP05 的OJ数据
```
系统会先展示 CSP05 下所有课次列表,你选择要分析哪一个。
---
## 能获取到什么数据
对**每个学生**在**每道题**上API 返回:
| 数据 | 说明 | 举例 |
|------|------|------|
| 完成状态 | AC=通过WA=答案错误RE=运行错误等 | AC |
| 分数 | 0-100 分 | 100 |
| 提交次数 | 该学生这道题总共提交了几次 | 3 |
| 源代码 | 学生提交的完整代码 | `#include <bits/stdc++.h>...` |
| 编译错误 | 代码编译失败时的错误信息 | `expected ';' after expression` |
| 测试点详情 | 每个测试点的通过/失败情况 | 测试点1: AC, 测试点2: WA |
| 提交历史 | 每次提交的变化轨迹 | 第1次WA→第2次WA→第3次AC |
### 作业包分类
数据按三个作业包分别统计:
| 作业包 | 含义 | 常见题量 |
|--------|------|----------|
| 课堂练习 | 课上完成的题 | 3-5 题 |
| 课后作业 | 课后做的题 | 2-3 题 |
| 拓展练习 | 选做的挑战题 | 5-7 题 |
---
## 数据保存在哪里
```
.claude/memory/oj/analysis/
├── CSP05-02_student_analysis.json ← 原始数据API 返回的完整 JSON
└── CSP05-02_analysis.md ← AI 分析报告(可选)
```
**重要**:数据保存后,后续生成课评时会自动读取,不需要重复获取。
---
## 手动调 API给开发者参考
如果不用 Claude Code也可以直接用 Python 调 API
```python
import httpx
from pathlib import Path
# 1. 读取凭据
env = {}
for line in Path('.env').read_text().split('\n'):
if '=' in line and not line.startswith('#'):
k, v = line.split('=', 1)
env[k] = v
# 2. 登录
client = httpx.Client(base_url=env['OJ_BASE_URL'], follow_redirects=True)
client.post('/login', json={"uname": env['OJ_USERNAME'], "password": env['OJ_PASSWORD']})
# 3. 获取课程列表
r = client.get('/course/api/list')
print(r.json())
# 4. 获取课程详情(替换 {cid} 为实际课程 ID
r = client.get(f'/course/api/detail/{cid}')
print(r.json())
# 5. 获取章节分析(替换 {cid} 和 {csid}
r = client.get(f'/course/api/analysis/{cid}/{csid}?withHistory=true')
print(r.json())
```
### 三个 API 端点
| 端点 | 用途 | 说明 |
|------|------|------|
| `GET /course/api/list` | 课程列表 | 返回所有课程的标题、ID、人数 |
| `GET /course/api/detail/{课程ID}` | 课程详情 | 返回所有课次的标题和 ID |
| `GET /course/api/analysis/{课程ID}/{课次ID}` | 学生分析 | 返回每个学生每道题的完整数据 |
### 可选参数
| 参数 | 默认值 | 说明 |
|------|--------|------|
| `withCode` | true | 设为 false 跳过源代码,只返回状态(速度快) |
| `withHistory` | false | 设为 true 获取全部提交历史(含每次提交的代码和错误) |
---
## 常见问题
**Q课程代码怎么填**
A就是 OJ 上的课程编号,比如 CSP05-02、CSP06-05。跟大纲编号可能不一样以 OJ 实际的为准。
**Q提示"未找到课程"怎么办?**
A可能是阶段名不匹配。试试只说"获取 OJ 数据",系统会列出所有可用课程让你选。
**Q数据太多等很久怎么办**
A如果班级学生多15人以上获取源代码会比较慢。可以加 `withCode=false` 只获取状态,速度快很多。
**Q数据多久更新一次**
A每次调用 API 都是实时获取最新数据。但课评生成时会优先使用已保存的 JSON避免重复请求。需要刷新时重新获取即可。