-
Notifications
You must be signed in to change notification settings - Fork 0
/
api.py
126 lines (102 loc) · 4.47 KB
/
api.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import os
import sys
import logging
import datetime
import requests
import flask
import waitress
import yaml
from feedgen.feed import FeedGenerator
import zjuintl_assistant
app = flask.Flask(__name__)
assist: zjuintl_assistant.Assistant = None
# middleware for logging request info
@app.after_request
def log_request_info(response):
timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
app.logger.info(f"{timestamp} {flask.request.method} {flask.request.url} {response.status}")
return response
@app.route('/rss/announcements', methods=['GET'])
def get_announcements():
fg = FeedGenerator()
fg.id("bb_announcements")
fg.title("Announcements")
fg.author({"name": "ZJUIntl Assistant"})
fg.link(href="https://learn.intl.edu.cn", rel="alternate")
fg.description("Announcements")
for item in assist.get_bb_announcements(50, full=True):
fe = fg.add_entry()
html_content = item.html_content
if html_content is not None:
html_content = html_content.replace("https://learn.intl.zju.edu.cn", f"{flask.request.url_root}proxybb/https://learn.intl.zju.edu.cn")
if (html_content is None):
html_content = ""
fe.id("{} {}-{}".format(item.title, item.get_event_message(), item.course))
fe.title("{} {} - {}".format(item.title, item.get_event_message(), item.course.split(":")[0]))
else:
fe.id("{}-{}".format(item.title, item.course))
fe.title("{} - {}".format(item.title, item.course.split(":")[0]))
fe.updated(item.date.replace(tzinfo=datetime.timezone(datetime.timedelta(hours=8))))
fe.content(html_content)
return fg.atom_str(), 200, {"Content-Type": "application/xml"}
@app.route('/rss/grades', methods=['GET'])
def get_grades():
fg = FeedGenerator()
fg.id("bb_grades")
fg.title("Grades")
fg.author({"name": "ZJUIntl Assistant"})
fg.link(href="https://learn.intl.zju.edu.cn", rel="alternate")
fg.description("Grades")
for item in assist.get_bb_grades(20):
fe = fg.add_entry()
fe.id(f"{item.title}-{item.course}")
fe.title("{} - {}".format(item.title, item.course.split(":")[0]))
fe.updated(item.date.replace(tzinfo=datetime.timezone(datetime.timedelta(hours=8))))
fe.content(f"{item.grade} / {item.pointsPossible}")
return fg.atom_str(), 200, {"Content-Type": "application/xml"}
@app.route('/rss/myzjunotices', methods=['GET'])
def get_myZJU_notices():
fg = FeedGenerator()
fg.id("myzju_notices")
fg.title("myZJU Notices")
fg.author({"name": "ZJUIntl Assistant"})
fg.link(href="https://www.intl.zju.edu.cn/my-zju/zh-hans/students", rel="alternate")
for item in assist.get_myZJU_notices(20, False, True):
fe = fg.add_entry()
fe.id(item.title)
fe.title(item.title)
fe.link(href=item.link, rel="alternate")
fe.updated(item.date.replace(tzinfo=datetime.timezone(datetime.timedelta(hours=8))))
fe.content(item.content)
return fg.atom_str(), 200, {"Content-Type": "application/xml"}
@app.route('/proxybb/<path:path>', methods=['GET'])
def proxy_bb(path):
if "learn.intl.zju.edu.cn" not in path:
return "Invalid path", 400
session = requests.Session()
session.cookies = assist.get_cookie_jar("login_blackboard")
response = session.get(path)
return response.content, response.status_code, response.headers.items()
if __name__ == '__main__':
logging.basicConfig(level=logging.INFO)
if os.environ.get("DEBUG"):
logging.getLogger("zjuintl_assistant.zjuintl_assistant.assistant").setLevel(logging.DEBUG)
if not os.path.exists("config.yaml"):
with open("config.yaml", "w") as f:
f.write("username: \npassword: \n")
print("Please fill in your username and password in config.yaml")
input("Press Enter to exit ...")
sys.exit(0)
with open("config.yaml", "r") as f:
config = yaml.safe_load(f)
try:
if not config["username"] or not config["password"]:
print("Please fill in your username and password in config.yaml")
input("Press Enter to exit ...")
sys.exit(0)
except KeyError:
print("Please fill in your username and password in config.yaml")
input("Press Enter to exit ...")
sys.exit(0)
assist = zjuintl_assistant.Assistant(config["username"], config["password"])
waitress.serve(app, host='0.0.0.0', port=5000)