ClassPad 是一个用于 MindReset Quote/0「摘录」墨水信息显示设备的电子课表服务端。
它会读取你提供的 CSES 课表,根据当前时间将正在上的课程、下一节课程、课间状态、课程进度和今日剩余课程推送到一个或多个 Quote/0 设备。
- 支持 CSES 通用课表交换格式
- 自动显示当前课程、下一节课程和课间休息
- 显示课程教师、上课时间、剩余时间和实时进度
- 支持多个账号、多个设备和不同设备的显示所有者
- 支持按设备配置城市并自动获取实时天气
- 只在显示内容变化时推送,减少不必要的网络请求
- 配置文件和设备文件统一放在
config/目录 - 内置 CSES 解析器,无需额外安装课表解析工具
ClassPad/
├── config/
│ ├── config.yaml # 服务运行配置
│ └── devices.yaml # 账号、Token 和设备配置
├── schedule/ # CSES 课表文件
├── lib/pycses/ # 内置 CSES 解析器
├── src/
│ ├── app.py # 单轮运行和推送去重
│ ├── canvas_client.py # Dot Canvas API 客户端
│ ├── cses_schedule.py # CSES 课表读取
│ ├── schedule_service.py # 课程状态和显示数据生成
│ └── weather.py # Open-Meteo 天气服务
├── tests/ # 自动化测试
├── main.py # 服务入口
└── requirements.txt # Python 依赖
建议使用 Python 3.10 或更高版本:
python -m pip install -r requirements.txt编辑 config/devices.yaml:
tokens:
- name: account-a
token: dot_app_xxx
owner: UserA
devices:
- sn: ABCD1234EF56
location: Songjiang
- sn: ABCD1234EF56
- name: account-b
token: dot_app_yyy
owner: TeamB
devices:
- sn: ABCD1234EF56
owner: Alice说明:
- 一个 Token 可以配置多个设备。
owner可以在账号级别设置,也可以在单个设备上覆盖,用于在屏幕右下角展示组织或所有者。location使用英文城市名,用于自动获取实时天气;不配置时显示为滚木。
编辑 config/config.yaml:
push_interval_seconds: 30
request_timeout_seconds: 15
devices_file: devices.yaml
cses_file: schedule/example.yamlpush_interval_seconds:服务循环间隔,单位为秒。request_timeout_seconds:每次网络请求的超时时间,单位为秒。devices_file:设备配置文件路径,相对config/config.yaml所在目录解析。cses_file:CSES 课表文件路径,相对项目根目录解析。
将课表文件放入 schedule/,然后在 config/config.yaml 中指定:
cses_file: schedule/example.yaml(当然你也可以直接从 ClassIsland 等软件中导出CSES格式的课表)
服务端会自动读取 CSES 文件,并在文件修改后热重载。课表中的科目、教师、星期、开始时间和结束时间会用于生成 Quote/0 的显示内容。
python .\main.py服务会持续运行,默认每 30 秒检查一次。只有设备显示数据发生变化时才会向设备推送。 临时网络错误和服务器错误会进行有限次数的指数退避重试,认证失败等永久错误不会重复请求。
服务启动时会验证运行配置、设备 Token、设备序列号以及 CSES 文件。配置有误时,日志会指出对应字段和位置。
在交互式终端中可以直接按键控制:
p:暂停 / 继续推送r:重新加载配置、设备和课表x:停止服务
命令栏会固定重绘在日志底部。使用 PyCharm 时请选择项目附带的 ClassPad
运行配置;该配置已启用终端模拟。
python -m unittest discover -s tests -v本项目使用 GNU General Public License v3.0,详见根目录的 LICENSE。
licenses/ 目录包含第三方依赖的许可证文本。
