Bill Chen
Coder & Composer.
Bill Chen's Blog
ECNU-class2ics - 一个将课程表数据转换成 ics 日历的工具

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

https://billc.io/wp-content/uploads/2019/05/image-1600x1297.png
导出效果

What’s this

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

Why we made this

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

Where is this

https://github.com/Flento/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。

https://billc.io/wp-content/uploads/2019/05/image-1-1600x1390.png
运行效果

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

1+
Last Updated:
本文链接:https://billc.io/2019/05/ecnu-class2ics/
若无特殊声明,站点所有文章均遵循 CC-BY-NC-SA 4.0 协议。
首页      星标文章      ECNU-class2ics - 一个将课程表数据转换成 ics 日历的工具

发表评论

textsms
account_circle
email

  • https://secure.gravatar.com/avatar/4e6806b9d5c5cdfd5e4f1effdbb84175?s=80&d=retro&r=g
    Safford

    main.py中的 setClassTime()函数无法读取conf_classTime.json

    3月前回复
    • https://secure.gravatar.com/avatar/c59c062d98b6ed907c479cdc73a86039?s=80&d=retro&r=g
      Bill博主

      @Safford: 我这里刚刚clone了一份,没有遇到这个问题诶,可以麻烦您在GitHub的Issue页面详细描述一下你的问题吗?

      2月前回复

Bill Chen's Blog

ECNU-class2ics - 一个将课程表数据转换成 ics 日历的工具
把公共数据库上的课程表变成我们都喜欢的 ics 文件。
扫描二维码继续阅读
2019-05-06
Tags
文章归档
近期评论
仪表盘
  • 0
  • 26
  • 1,974
  • 117,401
  • 30
  • 2019年12月3日
关注

输入您的电子邮件地址订阅此博客,并通过电子邮件接收博客更新通知。