北师大空闲教室查询
使用本 skill 目录下的 scripts/bnu_classroom.py。把下文 <script> 替换为相对于当前 SKILL.md 解析得到的脚本绝对路径,命令中用引号包裹该路径;不要依赖当前工作目录或某台机器的安装路径。需要 Python 3.9+ 和到学校接口的网络连接。
查询
使用默认的纯文本输出。脚本会验证数据,并按 --free-slots 筛选;直接读取输出作答,无需额外调用工具解析。
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 节”等课表编号,避免只写查询时段编号。数据多时可分组摘要,不编造容量、设施或开放状态。
- 这是非官方工具,读取学校微信端课表接口。无课不等于无人、开门或允许自习,简要提醒以教务安排和现场情况为准。