今年上半年我曾写过一篇博客介绍使用 Google 日历制作课程表来管理日程,但是又一个最大的问题就是需要手动录入课程信息来制作课程表,工作量巨大又繁琐不说,还可能由于粗心而录入错误。今天我就写了一个脚本来自动生成 ics 日历。
GitHub 项目地址:NPUMD_URP_classs_schedule
获取课程信息
首先登录教务系统,找到选课结果的页面,具体登录的过程我已经在前一篇博客写过,在这里就不重复了。
这个页面有两张表,一个是按照日程时间生成的课程表格,一个每个课程的详细信息表。很明显,第二张表更容易爬取我们需要的内容。
使用 BeautifulSoup 来解析这个页面。因为它在一张大表格中,所以搜索 tr
标签就可以很轻松地筛选出来,再从课程中筛选出每个 td
标签,就是每个方格中的信息了。需要注意的是有些课一周有两节或以上,需要特殊处理。
我们需要从其中得到这些信息:课程名称、周次、星期、节次、节数、地点。获取到课程之后,就可以制作日历了。
制作 ics 日历
我导出了之前制作的课程表,观察其结构来模仿制作。
可以看到 ics 文件包含这两个部分。
BEGIN:VCALENDAR
PRODID:-//Google Inc//Google Calendar 70.9054//EN
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:PUBLISH
X-WR-CALNAME:日历标题
X-WR-TIMEZONE:Asia/Shanghai
X-WR-CALDESC:日历简介
BEGIN:VTIMEZONE
TZID:Asia/Shanghai
X-LIC-LOCATION:Asia/Shanghai
BEGIN:STANDARD
TZOFFSETFROM:+0800
TZOFFSETTO:+0800
TZNAME:CST
DTSTART:19700101T000000
END:STANDARD
END:VTIMEZONE
开头部分,包含了这个日历文件的标题、简介、时区等,还有一些 Google 日历特有的版本号、ID 等信息,对于不必要的信息,就可以舍弃不用添加。
重点是下面的内容,由 BEGIN:VEVENT
开始,由 END:VEVENT
结束,这就是每一个日程的信息了,我们需要按照这个格式,为每一个课程来生成对应信息。
BEGIN:VEVENT
DTSTART;TZID=Asia/Shanghai:20190826T083000
DTEND;TZID=Asia/Shanghai:20190826T120500
RRULE:FREQ=WEEKLY;WKST=MO;COUNT=4;BYDAY=FR,MO
DTSTAMP:20191121T124147Z
UID:0e5cika7s6cs7xxxxxsg96@google.com
CREATED:20190825T144659Z
DESCRIPTION:
LAST-MODIFIED:20190825T144914Z
LOCATION:实践教学大楼明理楼 318
SEQUENCE:1
STATUS:CONFIRMED
SUMMARY:电子工艺装配 1
TRANSP:OPAQUE
END:VEVENT
DTSTART
和 DTEND
为该日程第一次的开始和结束时间。
开始日期由开头填写的第一周周一加上周次和星期得到。
还有开始时间,这里我定义了一个包含每节课开始时间的元组 startTime
,将节次作为下标就可以获取上课时间。
RRULE
为该日程的循环信息,其中 FREQ=WEEKLY
为按周循环,WKST=MO
为每周开始的星期,COUNT
是循环次数,BYDAY
为日程所在的星期。
这里用的是星期的前两个字母缩写,我也将其放在一个元组中,直接通过下标调用对应星期。
需要注意的是,如果该日程不是每周循环,而是隔周循环,比如两周一次,这里就会再多一个参数 INTERVAL
,意思是间隔数,比如 INTERVAL=2
就是隔一周循环一次。
LOCATION
是日程地点,可以设置为该课程所在的教室地点。
SUMMARY
就是日程名称了,设置为课程名称即可。
其它参数我们暂时用不到可以忽略它。
按照以上格式,我们新建一个 ics 文件然后依次写入每一门课程的信息,一个课程表就制作完成了,添加到我们的日历中并开启同步,enjoy it!