Last active
February 14, 2023 07:05
-
-
Save Mech0n/66910cdd7443dbe44a615c6fc5d6093d to your computer and use it in GitHub Desktop.
FDU 研究生课程表 生成 ics 导入到手机
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from datetime import datetime, timedelta | |
from json import load | |
from icalendar import Calendar, Event,Alarm | |
from pytz import UTC # timezone | |
""" | |
- pip3 install pytz icalendar | |
- 更改start_day的日期为开课的第一周 | |
- 首先从选课系统中打开已选课程 | |
- F12开发者模式, 选择网络窗口 | |
- 回到页面, 点击查看我的课表, 这时, 网络窗口中会出现名为loadKbxx.do的数据包 | |
- 将数据包中的响应部分的内容, 是一个json, 放入一个json文件中, 并命名为kc.json, 放到此脚本的目录下 | |
""" | |
course_time = { | |
800: (8, 00), | |
855: (8, 55), | |
955: (9, 55), | |
1050: (10, 50), | |
1145: (11, 45), | |
1330: (13, 30), | |
1425: (14, 25), | |
1525: (15, 25), | |
1620: (16, 20), | |
1715: (17, 15), | |
1830: (18, 30), | |
1925: (19, 25), | |
2020: (20, 20), | |
845: (8, 45), | |
940: (9, 40), | |
1040: (10, 40), | |
1135: (11, 35), | |
1230: (12, 30), | |
1415: (14, 15), | |
1510: (15, 10), | |
1610: (16, 10), | |
1705: (17, 5), | |
1800: (18, 00), | |
1915: (19, 15), | |
2010: (20, 10), | |
2105: (21, 5), | |
} | |
if __name__ == '__main__': | |
json_dict: dict = {} | |
with open("./kc.json", "r") as json_f: | |
json_dict = load(json_f, object_hook=dict) | |
# parse a course | |
pre_to_ics: dict = {} | |
for course in json_dict["results"]: | |
if course["XNXQDM"] == '20221': | |
continue | |
pre_to_ics[course["KCMC"]] = dict() | |
pre_to_ics[course["KCMC"]]["KSSJ"] = 20000 | |
pre_to_ics[course["KCMC"]]["JSSJ"] = 0 | |
pre_to_ics[course["KCMC"]]["DATE"] = 0 | |
for course in json_dict["results"]: | |
if course["XNXQDM"] == '20221': | |
continue | |
pre_to_ics[course["KCMC"]]["JASMC"] = course["JASMC"] | |
pre_to_ics[course["KCMC"]]["KCMC"] = course["KCMC"] | |
pre_to_ics[course["KCMC"]]["JSXM"] = course["JSXM"] # note | |
pre_to_ics[course["KCMC"]]["XQ"] = course["XQ"] | |
if course["KSSJ"] < pre_to_ics[course["KCMC"]]["KSSJ"]: | |
pre_to_ics[course["KCMC"]]["KSSJ"] = course["KSSJ"] | |
if course["JSSJ"] > pre_to_ics[course["KCMC"]]["JSSJ"]: | |
pre_to_ics[course["KCMC"]]["JSSJ"] = course["JSSJ"] | |
pre_to_ics[course["KCMC"]]["ZCMC"] = course["ZCMC"][:-1] # weeks : 1-16 / 1-8 | |
pre_to_ics[course["KCMC"]]["ZCMC"] = [int(x) for x in pre_to_ics[course["KCMC"]]["ZCMC"].split("-")] | |
# generate event | |
start_day = datetime(year=2023,month=2,day=20,hour=00,minute=00,second=00, tzinfo=UTC) # monday | |
to_ics = [] | |
for key, value in pre_to_ics.items(): | |
for i in range(value['ZCMC'][-1]): | |
elem = {} | |
elem['SUMMARY'] = value["KCMC"] | |
elem['DTSTART'] = start_day + timedelta(days=(i * 7 + value['XQ'] - 1), hours=course_time[value["KSSJ"]][0], minutes=course_time[value["KSSJ"]][1]) | |
elem['DTEND'] = start_day + timedelta(days=(i * 7 + value['XQ'] - 1), hours=course_time[value["JSSJ"]][0], minutes=course_time[value["JSSJ"]][1]) | |
elem['DESCRIPTION'] = value['JSXM'] | |
elem['LOCATION'] = value['JASMC'] | |
to_ics.append(elem) | |
# generate ics | |
cal = Calendar() | |
cal.add('VERSION','2.0') | |
cal.add('X-WR-CALNAME','FDU') | |
cal.add('X-APPLE-CALENDAR-COLOR','#540EB9') | |
cal.add('X-WR-TIMEZONE','Asia/Shanghai') | |
for elem in to_ics: | |
event=Event() | |
event.add('UID', elem['DTSTART'].strftime('%Y%m%dT%H%M%S')) | |
event.add('DTSTART;VALUE=DATE', elem['DTSTART'].strftime('%Y%m%dT%H%M%S')) | |
event.add('DTEND;VALUE=DATE', elem['DTEND'].strftime('%Y%m%dT%H%M%S')) | |
event.add('SUMMARY', elem['SUMMARY']) | |
event.add('SEQUENCE','0') | |
event.add('DESCRIPTION', elem['DESCRIPTION']) | |
event.add('LOCATION', elem['LOCATION']) | |
# alarm=Alarm() | |
# alarm.add('ACTION','NONE') | |
# alarm.add('TRIGGER;VALUE=DATE-TIME', (elem['DTSTART'] + timedelta(minutes=-30)).strftime('%Y%m%dT%H%M%S')) | |
# event.add_component(alarm) | |
cal.add_component(event) | |
with open('FDU.ics', 'wb') as f: | |
f.write(cal.to_ical()) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment