Python 大学生课表 iCalendar (.ics) 生成

Python 生成 ics 格式的大学生课表,支持自定义课程周数和其他信息,支持定义教室 GPS}

Python 其它杂项

访问GitHub主页

共11Star

详细介绍

Python 大学生课表 iCalendar (.ics) 生成

效果图

简介

大一新生第一次接触大学生课表,在有 Mac、iPhone 和 Apple Watch 设备的情况下希望能将自己的课表导入内置日历应用,以更方便的随时查看课表和规划行程。由于没有找到比较合适的 app 故自己写了这一代码。推荐使用 Python 3 运行。

[限定] 重庆邮电大学学生

重庆邮电大学限定

如果你是重庆邮电大学学生,直接使用 timetable_cqupt_automatic.py,就可以自动获取并生成来自教务在线的课表和考试安排

如果将代码配合 crontab 任务,即可在你的服务器上创建 ics 订阅,随时获得最新的包含调停课(部分)的课表和考试安排。

直接修改代码中的学号,并修改代码最后的 ics 文件保存位置即可,课表和考试安排数据由重庆邮电大学红岩网校所开发掌上重邮 app (cyxbsmobile) 提供。

功能

  • 支持录入课程名称,教师,必修/选修,学分,上课地点,星期几,周数和第几节课及一个附加信息
  • 支持单独周数,范围周数,奇偶周数,如 "第2周,5-11单数周,13-17 周"
  • 支持 Apple Maps GPS 信息(需手动补充,后续说明),在日历中添加教室位置,并可利用 iOS 的 Siri 分析功能在多个 App 中获得附加功能
  • 你可以获得 Apple 软件中的特别功能:例如向 Siri 问:我今天有什么事情?我下周五有什么安排?例如在 Apple Watch 表盘上获得下节课的时间和地点…… 添加 GPS 信息后,你还可以获得 Apple Maps 出发时间提醒,Siri 与搜索自动联想等功能。

使用

请调整代码中的以下内容以适配自己的课表:

  1. maxWeek 为本学期最大周数,有 20 周即写 20 周,为了方便后续代码将自动 +1,也可以去掉代码中的 maxWeek += 1,然后填写已经 + 1 后的周数。

  2. classTime 为每节课的上课时间,以元组形保存。为了方便后续第 n 节课直接为[n],预留了第 0 项为None,可以不做修改。直接填写每节课的 24 小时制上课时间:例如 8:00 上课,则录入(8, 0);下午 7:50 上课,则录入(19, 50)

  3. 修改 starterDay 为本学期第一周星期一的日期。

  4. 修改 classes 中的课程信息,由于不同学校课表可能含有不同信息,请参考源代码中的课表填写,并直接在后续定义中作出相应修改:

for Class in classes: 后,定义了不同的变量,均可进行自定义。最终,Title变量为日历项的标题,Description变量为日历项的备注,均可根据自己喜好修改。您只需要一点点 Python 基础即可看懂源代码并作出修改。

如何设置周数? 单独周:请改为数组形式,例如 [2]; 范围周:请使用rgWeek,例如 rgWeek(3, 7) 代表第三周到第七周; 奇数周:请使用oeWeek,例如 oeWeek(2, 9, 1) 代表第二周到第九周的单数周,将 1 改为 0 即为偶数周。

如何设置课程节数? 一节课:请改为数组形式,例如 [2]; 范围课,请使用rgWeek,例如 rgWeek(3, 7) 代表第三节一直上到第七节;

如果周数、节数是由多项组成,请使用加法。例如,第2周,5-11单数周,13-17 周,则为:

[2] + oeWeek(5, 11, 1) + rgWeek(13, 17)
  1. classEndTime.append行末尾将 "+ 45" 修改为加每节课的时长,一节课 40 分钟则为 "+ 40"。

  2. 更改 jWrite 中的文件目录为合适的位置以便输出最终结果

库中的 timetable_cqupt.py 是重庆邮电大学同学的一个版本,timetable_cqu.py 是重庆大学同学的一个版本,供你参考两种不同的 classes 和 Class 的变量内容。

添加 Apple Maps GEO

这一功能仅在 Apple 设备上进行测试,在 iCalendar 标准中,似乎定义 GEO 项并输入坐标即可确定位置,但在 iOS 和 macOS 上验证不通过。

Apple 日历使用了X-APPLE-STRUCTURED-LOCATIONX-APPLE-MAPKIT-HANDLE来记录 Apple Maps 位置信息,这一项包含位置文字和坐标。一个样例内容如下:

LOCATION:重庆邮电大学综合实验大楼\n南山路新力村
X-APPLE-STRUCTURED-LOCATION;VALUE=URI;X-APPLE-MAPKIT-HANDLE=;X-APPLE-RADIUS=500;X-TITLE=重庆邮电大学综合实验大楼\\n南山路新力村:geo:29.524289,106.605595

其中,LOCATIONX-TITLE中的地址必须一字不差的和 Apple Maps 结果对应,不得修改。geo 项则为坐标。

为了保证可用性,这一段文本只能手动创建日历项并导出提取。

导出方法

  1. 打开 macOS 日历 app,创建一个空白日历项(请尽量在一个没有太多日历项的日历中创建,因为稍后需要导出整个日历),并输入想要添加的位置保存。

  2. 点击日历 -> 文件 -> 导出 -> 导出,保存 ics 文件。

  3. 用文本编辑器打开 ics 文件,找到BEGIN:VEVENT中你刚刚建立的包含位置的 VEVENT 项目。

  4. 你将可找到类似以下两个文段:

LOCATION:重庆大学虎溪校区\n大学城南路55号    
X-APPLE-STRUCTURED-LOCATION;VALUE=URI;X-APPLE-MAPKITHANDLE=一大串文字;X-APPLE-RADIUS=925.4324489259043;X-TITLE=重庆大学虎溪校区\\n大学城南路5号:geo:29.592566,106.299150

直接将 <一大串文字> 全部去掉,注意不要删除后面的分号,RADIUS 可以不修改,TITLE 中的文字请勿修改。

最后,将这一段文字替换代码中的 customGEO(代码中有重庆大学虎溪校区和重庆邮电大学部分楼栋信息作为参考,你也可以以这样的方式处理不同的教学楼)。注意在 Python 文段中保留 \n 需要多加一个斜线,保留双斜线 n 则需要四斜线。

联系作者

— 重庆邮电大学国际学院

推荐源码