-
Notifications
You must be signed in to change notification settings - Fork 0
/
edufpmi_client.py
90 lines (67 loc) · 3.55 KB
/
edufpmi_client.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
import requests
import re
import logging
import sys
log_format = '%(asctime)s %(filename)s: %(message)s'
logging.basicConfig(format=log_format, datefmt='%Y-%m-%d %H:%M:%S', stream=sys.stdout, level=logging.INFO)
class EdufpmiClient:
LOGIN_URL = 'https://edufpmi.bsu.by/login/index.php'
ALL_DAY_ATTENDANCE_URL = 'https://edufpmi.bsu.by/calendar/view.php?view=day'
ATTENDANCE_URL = 'https://edufpmi.bsu.by/mod/attendance/attendance.php'
def __init__(self, username, password):
self.username = username
self.password = password
self.session = None
def login(self):
request_data = {'username': self.username,
'password': self.password,
'referer': EdufpmiClient.LOGIN_URL}
if self.session:
self.session.close()
self.session = requests.session()
page = self.session.get(EdufpmiClient.LOGIN_URL).text
token = re.search('logintoken".*value.*"(.*)"', page).group(1)
request_data['logintoken'] = token
logging.info(f'logging in with : username={self.username}, password={self.password}, csrf token: {token}')
response = self.session.post(EdufpmiClient.LOGIN_URL, request_data)
if 'loginerrors' in response.text:
raise RuntimeError('Cannot log in. Please re-check your username and password')
def get_attendance_urls(self):
page = self.session.get(EdufpmiClient.ALL_DAY_ATTENDANCE_URL).text
pattern = r'<a href="(https:\/\/edufpmi\.bsu\.by\/mod\/attendance\/view\.php\?id=\d+)" class="card-link">.*<\/a>'
attendance_urls = re.findall(pattern, page)
logging.info(f'successful get_attendance_urls: {attendance_urls}')
return attendance_urls
# except Exception:
# raise RuntimeError('get_attendance_url error: maybe you haven\'t log in')
def get_attendance_form_data(self, attendance_page_url):
page = self.session.get(attendance_page_url).text
pattern = r'<td class="statuscol cell c2 lastcol" style="text-align:center;width:\*;" colspan="3">' \
r'<a href="https:\/\/edufpmi\.bsu\.by\/mod\/attendance\/attendance\.php\?' \
r'sessid=(\d+)&sesskey=(.+)">Submit attendance<\/a><\/td>'
return re.findall(pattern, page)
def get_all_attendance_form_data(self):
all_forms = list()
for url in self.get_attendance_urls():
all_forms += self.get_attendance_form_data(url)
logging.info(f'all forms data: {all_forms}')
return all_forms
def post_attendance(self, session_id, session_key):
page_url = f'{EdufpmiClient.ATTENDANCE_URL}?sessid={session_id}&sesskey={session_key}'
form_page = self.session.get(page_url).text
pattern = r'<input.+?form-check-input.+?value="(.+?)".*?>'
radiobutton = re.findall(pattern, form_page, re.DOTALL)[0]
logging.info(f'radiobutton: {radiobutton}')
form_data = {'sessid': session_id,
'sesskey': session_key,
'_qf__mod_attendance_student_attendance_form': 1,
'mform_isexpanded_id_session': 1,
'status': radiobutton,
'submitbutton': 'Save changes'}
response = self.session.post(
EdufpmiClient.ATTENDANCE_URL, data=form_data)
logging.info(f'check_attendance: code={response.status_code}')
def check_all_attendance(self):
all_form_data = self.get_all_attendance_form_data()
for fd in all_form_data:
self.post_attendance(*fd)