# Bnu Classroom

> 查询北京师范大学空闲教室和课表占用；支持指定教学楼今明后三天、多个大节全部空闲筛选，以及指定教室七天课表。用户寻找自习教室或询问教室空闲时使用。

- Skill: `kawarox/bnu-classroom` (Agent Skill, multi-file: 4 files)
- Install (CLI): `npx skillmds@latest add kawarox/bnu-classroom`
- Raw SKILL.md: https://api.skillmd.com/api/skills/kawarox/bnu-classroom/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: KawaroX (https://skillmd.com/u/kawarox)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/kawarox/bnu-classroom

---


# 北师大空闲教室查询

使用本 skill 目录下的 `scripts/bnu_classroom.py`。把下文 `<script>` 替换为相对于当前 SKILL.md 解析得到的脚本绝对路径，命令中用引号包裹该路径；不要依赖当前工作目录或某台机器的安装路径。需要 Python 3.9+ 和到学校接口的网络连接。

## 查询

使用默认的纯文本输出。脚本会验证数据，并按 `--free-slots` 筛选；直接读取输出作答，无需额外调用工具解析。

```sh
python3 "<script>" --list-buildings
python3 "<script>" --building 教二楼 --day tomorrow --free-slots 5 6
python3 "<script>" --building 教四楼 --room 101
```

- `--building`：支持楼宇用 `--list-buildings` 获取。脚本默认教二楼，但不能把默认查询描述为全校结果。优先使用用户指定或上下文确定的楼宇；无楼宇信息时询问。用户要求所有支持楼宇时逐栋查询，汇总结果并指出失败的楼宇。
- `--day`：`today`、`tomorrow`、`2daysl` 分别为今天、明天、后天。楼宇查询默认今天，不支持任意日期。
- `--room`：返回指定楼宇中单间教室的七天课表，不能与 `--day` 同用。若用户指定日期，选择输出中对应日期的记录；返回范围外的日期不能推断。
- `--free-slots 3 4`：筛选查询时段 3、4（课表第 5–8 节）**全部空闲**的教室；单间模式则筛选满足条件的日期。
- 默认直连；环境要求代理时可使用 `--use-proxy`。不要无限重试，临时网络错误最多重试一次。

## 时间解释

使用当前北京时间（Asia/Shanghai）解析今天、明天、现在等表述。用户说“第几节”时，默认指课表小节（1–12）；接口按每两小节合并为一个查询时段（1–6）。对应关系如下：

| 课表节次 | 时间 | 查询时段编号（`--free-slots`） |
| --- | --- | --- |
| 第 1–2 节 | 08:00–09:40 | 1 |
| 第 3–4 节 | 10:00–11:40 | 2 |
| 第 5–6 节 | 13:30–15:10 | 3 |
| 第 7–8 节 | 15:30–17:10 | 4 |
| 第 9–10 节 | 18:00–19:40 | 5 |
| 第 11–12 节 | 19:50–21:30 | 6 |

- 小节 n 对应查询时段 `(n + 1) // 2`；多个小节先转换、去重，再传给 `--free-slots`。例如“第 3–4 节”传 `2`，“第 5–8 节”传 `3 4`，“第 2–3 节”传 `1 2`。不要直接把课表小节编号当作参数。用户明确说“大节”或“查询时段编号”时才按 1–6 理解。
- 查询单个小节时仍只能取得其所属两小节合并时段的数据。例如“第 3 节”查询时段 2；合并时段空闲可据此判断该小节课表空闲，但合并时段占用不能证明其中每个小节都占用。答复说明查询粒度，不编造单小节状态或起止时间。
- “下午”默认查询 3、4，“晚上”默认查询 5、6；在答复中说明实际查询时段。
- “现在”仅选择当前所在大节；如果处于课间、午休或其他未覆盖时间，说明该时间没有对应数据，可提供相邻大节情况但不能声称当前空闲。
- 自定义时间段查询所有与之重叠的大节（按起点包含、终点不包含判断）。例如 14:00–16:00 检查 3、4，并说明 15:10–15:30 课间缺少数据，不能保证全程可用。
- 不把超出三天的楼宇请求悄悄改成今天，不根据时间段之外的结果推断空闲。

## 读取与答复

- 首行是楼宇及查询日期（单间模式为楼宇及教室号），随后是六个时段的对照。每条记录以教室号（单间模式为日期）开头，后面六个“空 / 占”依次对应六个时段，表示课表空闲或占用。
- 楼宇查询以首行按北京时间计算的日期为准；单间查询以每条记录的日期为准。
- 末尾“共 N 条（原始记录 M 条）”分别表示筛选后、筛选前的条数。原始记录为 0 表示接口没有记录，不能断言整栋楼空闲或教室不存在；有原始记录但筛选后为 0 才表示没有匹配记录。
- 成功退出码为 0；网络或数据异常退出码为 1，错误写入 stderr；参数错误为退出码 2、错误写入 stderr。失败不能回答“没有空教室”。
- 回答列出楼宇、实际日期、课表节次及对应时间和教室，面向用户使用“第 1–2 节”等课表编号，避免只写查询时段编号。数据多时可分组摘要，不编造容量、设施或开放状态。
- 这是非官方工具，读取学校微信端课表接口。无课不等于无人、开门或允许自习，简要提醒以教务安排和现场情况为准。

