北京交通大学 MIS / AA / 智慧课程平台的命令行客户端。为 Coding Agent 驱动而设计:一次登录后会话持久化,全部命令可 --json 输出、有明确退出码、永不弹出交互式提示。
查成绩绩点、课表、考试、作业、课件、教室,下载成绩单与校历,检测数据变更,以及全校任选课/跨选课的搜索、抢课、退课、循环抢课。
由 BJTUselfService 的 macOS SwiftUI 版本剥离 GUI 而来。
需要 Swift 5.9+ 工具链,不需要完整 Xcode(CoreML 模型以整目录 copy 打包,构建期不经过 coremlc)。
macOS / Linux
git clone https://github.com/fish2lab/bjtu-cli.git && cd bjtu-cli
bash Scripts/install.sh # 装到 /usr/local/bin,可用 PREFIX= 覆盖Windows
git clone https://github.com/fish2lab/bjtu-cli.git; cd bjtu-cli
pwsh -File Scripts\install.ps1 # 装到 %LOCALAPPDATA%\Programs\bjtu或直接开发运行:swift build && .build/debug/bjtu doctor
bjtu doctor # 环境自检,先跑这个
bjtu login --username 21301234 --password '******'
bjtu sync # 全量同步并列出变更
bjtu homework --pending --due-within 48login 后 Cookie 与凭据落到状态目录,此后所有命令都不必再传账号密码:每条命令自动恢复 Cookie、校验会话,失效时静默重登。
不想让密码落盘:
export BJTU_USERNAME=21301234 BJTU_PASSWORD='******'
bjtu login --store none| macOS | Windows | Linux | |
|---|---|---|---|
| 全部命令 | ✅ | ✅ | ✅ |
| 验证码自动识别 | ✅ 内置 CoreML 模型 | 需外部求解器 | 需外部求解器 |
| 凭据存钥匙串 | ✅ | 用文件或环境变量 | 用文件或环境变量 |
| GBK 附件名解码 | ✅ | ✅ | ✅ |
内置的 CRNN 验证码模型依赖 CoreML,只在 Apple 平台可用。其他平台通过 BJTU_CAPTCHA_CMD 接外部求解器即可同样全自动:
pip install ddddocr
export BJTU_CAPTCHA_CMD="python3 /path/to/bjtu-cli/Examples/solve-captcha.py"
bjtu doctor # 自检会真拉一张验证码验证这条链路约定很简单:命令收到一个参数(验证码图片路径),把算式的计算结果打到 stdout。Examples/solve-captcha.py 是一份可直接用的实现。
不配求解器也能用,只是登录和抢课时要手动传 --captcha(填算式结果,图上 3+4= 就填 7)。
Windows / Linux 未经实机验证。 平台相关代码都做了条件编译隔离,Windows 的代码路径(外部求解器进程调用、GBK 解码、路径解析)已在 macOS 上通过强制开关验证,但作者没有 Windows/Linux 机器实测构建与运行。遇到问题欢迎提 issue。
| 分类 | 命令 |
|---|---|
| 会话 | login logout status whoami doctor links version |
| 同步 | sync notices |
| 成绩 | grades gpa transcript |
| 课表考试 | schedule exams calendar |
| 作业 | homework homework-download homework-submit subscribe |
| 课件 | courses courseware courseware-download teaching-calendar |
| 教室 | classroom empty-rooms |
| 抢课 | grab-search grab-captcha grab-submit grab-drop grab-watch |
完整选项见 bjtu help,字段级说明见 references/commands.md。
仓库自带 Claude Code 技能 .claude/skills/bjtu-selfservice/,在本仓库内开 Claude Code 即自动可用。想全局启用:
# macOS / Linux
ln -s "$PWD/.claude/skills/bjtu-selfservice" ~/.claude/skills/bjtu-selfservice# Windows(需管理员或开发者模式)
New-Item -ItemType SymbolicLink -Path "$env:USERPROFILE\.claude\skills\bjtu-selfservice" -Target "$PWD\.claude\skills\bjtu-selfservice"对 Agent 的约定:
--json输出{"ok":true,"data":…}/{"ok":false,"error":"…"}- 退出码
0成功 ·1失败 ·2参数错误 ·3需要登录 ·4验证码失败 --cached只读本地缓存,零网络请求(实测 0.02 秒返回)- 缺参数直接以退出码 2 结束,永远不会停下来等输入
| 变量 | 用途 |
|---|---|
BJTU_USERNAME / BJTU_PASSWORD |
凭据,优先级高于凭据文件与钥匙串 |
BJTU_HOME |
状态目录,也用于多账号隔离 |
BJTU_DOWNLOAD_DIR |
下载目录 |
BJTU_CAPTCHA_CMD |
外部验证码求解器 |
BJTU_DISABLE_LOCAL_CAPTCHA=1 |
禁用内置模型,强制走外部求解器 |
默认目录:
| 状态目录 | 下载目录 | |
|---|---|---|
| macOS | ~/Library/Application Support/bjtu-cli |
~/Downloads/bjtu-downloads |
| Windows | %APPDATA%\bjtu-cli |
<下载>\bjtu-downloads |
| Linux | ~/.config/bjtu-cli |
~/Downloads/bjtu-downloads |
多账号:BJTU_HOME=~/.bjtu-alt bjtu login --username 另一个学号 ...
Sources/bjtu/
├── main.swift 进程入口
├── CLI/ 参数解析、命令分发、输出与 JSON 载荷
├── Core/ HTTP、验证码、平台适配、本地存储、会话与同步引擎
├── Services/ MIS / 智慧课程平台 / 抢课 / 下载
└── Resources/ CoreML 验证码模型、GBK 解码表
平台差异集中在 Core/Platform.swift、Core/Captcha.swift、Core/CredentialStore.swift 三处,其余代码没有 #if os(...)。
登录链路、抢课接口、各数据源与已知坑详见 references/architecture.md。
--store file(默认)会把明文密码写进状态目录下的credentials.json。POSIX 平台上设为 0600;Windows 依赖用户目录的 ACL。介意就用--store none+ 环境变量,macOS 也可以用--store keychain。session.json里的 Cookie 等同于登录态,同样按上述方式保护。- 仓库本身不含任何凭据。
仅供学习交流。请勿用于非法用途。抢课相关命令会真实改动教务数据,--interval 不要低于 2 秒。
- 上游 Android / macOS 项目:BJTUselfService
- 抢课逻辑参考:Badguys