更新于 2020 年 3 月

现在,你可以直接访问 👉https://class2ics.billc.io 来获取你的课程表了。


一直都有一个做一个类似工具的想法,但想到流程的复杂迟迟没有动手。直到两个月前看到 xiejiadong 做的 Make-timetable-.ics ( http://xiejiadong.com/?p=419 ),可以手动输入课程配置到 excel 中,生成 ics 文件,直接就实现了这个工具的一大部分。但可惜无法自动获取课程数据,需要比较麻烦地手动录入。正好最近爬虫做的比较多,就 fork 了过来研究了一下华东师范大学的公共数据库的登陆流程,实现了从网站上自动获取课程数据的功能。

导出效果

What's this

ics 是最流行的日历文件之一,受到几乎所有日历软件的支持。这个小工具能根据指定的提醒策略,将高校的课程表信息生成一个可以导入到各个日历软件的 ics 文件。

Why we made this

  • 使用日历软件管理课程表可以让你不再把丑陋的课程表设置成桌面壁纸。
  • 每节课上课前都会收到关于下一节课的提醒通知(美观程度取决于系统和日历软件)。
  • 对于 iOS 和 macOS,系统会自动为你查找上课地点并接入苹果地图。
  • 不想每学期都手动添加。(懒)

Where is this

https://github.com/BillChen2K/ECNU-class2ics

How to use this

首先,运行需 Python 3 环境,依赖以下你可能没有安装的运行库:

lxml, request, pyexecjs

如果运行的时候还发现缺了什么,请 pip 上。

  • 对于华东师范大学的学生,程序可以根据输入的用户名、密码和验证码,自行登陆公共数据库获取本学期的课表信息。请先后运行 crawller.py (用于获取课程 json)和 main.py (用于生成 ics 文件)。
  • 对于其他高校的学生,请先在**conf_classTime.json**中配置每节课的启示时间,然后手动填写**classinfo.xlsx,再运行 main.py。** 具体操作可以参照 xiejiadong 的官方文档 http://xiejiadong.com/?p=419

如果没有出什么差错,生成的文件为同目录下的 class.ics。

运行效果

How it works

华东师范大学的公共数据库使用 des 加密,用户名和密码不是以明文 post 上去的。而含有三个密钥的核心文件 login4.js 又经过了 eval 加密,没有可读性。好在这些加密都是可逆的,所以探索了一番后可以登录进公共数据库。这一部分如果有空的话我打算专门开一篇 blog。

登录之后便可以获取到用户在 eams 系统独一的 ids,用这个 ids 结合 semester.id(学期 id)去 post 课程表的 js,就可以得到一大堆含有所有课程信息的 JavaScript 语句。这一部分再经过一些不艰深但繁琐的正则表达式提取出信息,略加处理就可以得到一个符合 xjd 标准的 json 文件了。

从 json 文件到 ics 文件部分我没有深入研究,直接使用了 Xiejiadong 的脚本。

下一步可能可以免去验证码输入这一步,因为 ECNU 的验证码似乎不算难认。semester.id 应该也可以根据系统时间自行计算,而不是依靠人工更新从一个并不算快的网站上获取。

About this

Based on Make-timetable-.ics by Xiejiadong
(https://github.com/Xiejiadong/Make-Timetable-.ics-)

ContributorWebsite
Bill Chenhttps://billc.io
Xiejiadonghttp://xiejiadong.com

Old Doc by Xiejiadong:

Want to know how to make the timetable?
http://xiejiadong.com/?p=419

Released: 2019.5.5