Skip to content

Instantly share code, notes, and snippets.

@Mech0n
Last active February 14, 2023 07:05
Show Gist options
  • Save Mech0n/66910cdd7443dbe44a615c6fc5d6093d to your computer and use it in GitHub Desktop.
Save Mech0n/66910cdd7443dbe44a615c6fc5d6093d to your computer and use it in GitHub Desktop.
FDU 研究生课程表 生成 ics 导入到手机
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