GDUT iOS Timetable 是一个基于 iOS Scriptable 的广东工业大学教务系统课表工具,用于在 iPhone 上离线查看课表、显示桌面小组件、写入 Apple 日历、安排本地通知,并通过快捷指令实现一键更新和自动化维护。
它可以实现:
- 本地离线查看课表
- 桌面小组件显示今日课程
- 登录态过期提醒
- 写入 Apple 日历
- 课前提醒、上课开始、下课结束通知
- 快捷指令一键更新
- 每日/每周自动化维护
- 通过 JSESSIONID 访问教务系统课表接口
- 本地缓存课表
- 小组件显示今日课表
- 支持 small、medium、large / max size
- large / max size 支持课程状态颜色区分
- 支持 Apple 日历写入
- 支持本地通知
- 支持登录态检测
- 支持快捷指令一键更新
- 支持每日检查和每周同步自动化
GDUT_iOS_Timetable/
├── README.md
├── .gitignore
├── scripts/
│ ├── GDUT_SetCookie.js
│ ├── GDUT_TestWeek.js
│ ├── GDUT_CheckSession.js
│ ├── GDUT_SyncTimetable.js
│ ├── GDUT_TodayWidget.js
│ ├── GDUT_WriteCalendar.js
│ ├── GDUT_ScheduleNotifications.js
│ └── GDUT_RunSummary.js
└── docs/
├── usage.md
└── security.md
| 文件 | 作用 | 是否联网 | 是否读取 JSESSIONID | 是否修改缓存 |
|---|---|---|---|---|
GDUT_SetCookie.js |
保存 JSESSIONID | 否 | 否,由用户输入 | 写入 Scriptable Keychain |
GDUT_TestWeek.js |
测试单周课表接口是否可用 | 是 | 是 | 否 |
GDUT_CheckSession.js |
检查登录态 | 是 | 是 | 写入 gdut_auth_status.json |
GDUT_SyncTimetable.js |
同步多周课表,生成本地缓存 | 是 | 是 | 写入 gdut_schedule.json,并可能更新登录态状态 |
GDUT_TodayWidget.js |
桌面小组件,显示今日课表 | 否 | 否 | 否 |
GDUT_WriteCalendar.js |
将课程写入 Apple 日历“GDUT课表” | 否 | 否 | 写入 gdut_calendar_status.json |
GDUT_ScheduleNotifications.js |
安排课前、上课开始、下课结束通知 | 否 | 否 | 写入 gdut_notification_status.json |
GDUT_RunSummary.js |
汇总显示一键更新后的关键信息 | 否 | 否 | 否 |
需要:
- iPhone
- Scriptable
- 快捷指令 App
- Apple 日历 App
- 电脑浏览器,用于登录教务系统并复制 JSESSIONID
- 可选:Git / GitHub,用于备份和维护项目
- 将
scripts目录中的 JS 文件复制到 Scriptable。 - 登录教务系统。
- 在浏览器 Network 中找到课表接口请求。
- 复制 JSESSIONID。
- 运行
GDUT_SetCookie。 - 运行
GDUT_SyncTimetable。 - 添加 Scriptable 小组件,选择
GDUT_TodayWidget。 - 可选:运行
GDUT_WriteCalendar。 - 可选:运行
GDUT_ScheduleNotifications。 - 可选:配置快捷指令和自动化。
建议创建两个手动快捷指令。
动作顺序:
Run GDUT_CheckSession
Run GDUT_SyncTimetable
Run GDUT_WriteCalendar
Run GDUT_ScheduleNotifications
Run GDUT_RunSummary
显示结果
动作:
Run GDUT_SetCookie
建议创建两个自动化。
触发:
每天 07:00 或 08:00
动作:
Run GDUT_CheckSession
触发:
每周一 07:05,或每周日 22:00
动作:
Run GDUT_CheckSession
Run GDUT_SyncTimetable
Run GDUT_WriteCalendar
Run GDUT_ScheduleNotifications
自动化中不建议加入 GDUT_RunSummary 和“显示结果”,避免打断自动化。
Scriptable 小组件刷新由 iOS 控制,refreshAfterDate 只是建议刷新时间,不保证准时。项目通过课前提醒、上课开始通知、下课结束通知来弥补准时性。
重新登录教务系统,复制新的 JSESSIONID,运行“更新GDUT登录态”,然后运行“一键更新GDUT课表”。
正常情况下使用 GDUT_EVENT_ID 去重,不应重复。如果手动改过事件备注或清理过状态,可能影响去重。
Scriptable 在快捷指令/Siri 环境中不支持 Alert,所以脚本在快捷指令中使用 Script.setShortcutOutput() 输出结果。
可能是网络、代理、认证 token、远程仓库已有提交等问题。建议检查代理、GitHub token、git pull --rebase 后再 push。
可以,但必须确保没有上传 JSESSIONID、Cookie、课表缓存、Network 截图、curl、HAR 等敏感内容。
- 本项目不保存教务系统账号和密码。
- JSESSIONID 只应该保存在 Scriptable Keychain。
- 不要把 JSESSIONID 写入代码、README、截图或 GitHub。
- 不要上传课表缓存、认证状态、通知状态、curl、HAR、Cookie 文件。
- 如果误上传 JSESSIONID,应立即重新登录教务系统使旧 JSESSIONID 失效,并清理 Git 历史。
- 本项目仅供个人学习和个人课表查看。
- 请遵守学校教务系统使用规范。
- 不要绕过验证码、统一认证或访问控制。
- 不要高频请求接口。
- 作者不对误用造成的后果负责。