Skip to content

Repository files navigation

bjtu-cli

北京交通大学 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 48

login 后 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

给 Agent 用

仓库自带 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.swiftCore/Captcha.swiftCore/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 秒。

About

北京交通大学 MIS / AA / 智慧课程平台命令行客户端,为 Coding Agent 驱动设计

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages