import time import datetime import requests import threading import json def load_pass(path): with open(path) as file: return json.load(file) class Edu: def __init__(self, web_addr: str, acc_name: str, acc_pass: str, enable_threading=True): if enable_threading: self.thread = threading.Thread(target=self.run) self.thread.daemon = False self.thread.start() self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0"} self.account = {"username": acc_name, "password": acc_pass} self.edupage_address = web_addr self.name = acc_name self.password = acc_pass self.days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'] self.session = requests.session() self.session.post(self.edupage_address + "login/edubarLogin.php", data=self.account, headers=self.headers) self.gsh = self.session.get("https://spspb.edupage.org/timeline/" , headers=self.headers).text.split("\n")[60].split('"')[1] self.substitutions = None def run(self): time.sleep(1) while True: self.substitutions = self.get_substitutions() time.sleep(5) def get_substitutions(self): substitutions = self.session.post(self.edupage_address + "substitution/server/viewer.js?__func" "=getSubstViewerDayDataHtml", data='{"__args":[null,{"date":"2021-06-22","mode":"classes"}],"__gsh": "' + self.gsh + '"}') list_parsed = substitutions.json()["r"].split("""""") del list_parsed[0] for position, line in enumerate(list_parsed): list_parsed[position] = line.split("")[0] chybajuci_uc = list_parsed[0] del list_parsed[0] if list_parsed[1] == "Na tento deň nie sú zadané žiadne suplovania.": return {"chybajuci": "Nikto", "info": list_parsed[1]} else: list_triedy = {} trieda = "info" for position, line in enumerate(list_parsed): if len(line) < 7: try: int(line) except: if "(" and ")" not in line: trieda = line list_triedy[line] = {} if trieda == None: raise LookupError("Invalid substitution data") if len(line) > 7 and line != "celý deň": if line == 'Chýba': list_triedy[trieda][list_parsed[position - 1]] = "Chýba" else: list_triedy[trieda][list_parsed[position - 1]] = line list_triedy["chybajuci"] = chybajuci_uc return list_triedy def get_timetable(self): r = self.session.post(f"{self.edupage_address}timetable/server/currenttt.js?__func=curentttGetData", data='{"__args":[null,{"year":2021,"datefrom":"2021-09-06","dateto":"2021-09-12","table":"classes","id":"562840","showColors":true,"showIgroupsInClasses":false,"showOrig":true}],"__gsh":"' + self.gsh + '"}') print(r.json()["r"]["ttitems"]) # for period in r.json()["r"]["ttitems"]: # print(f'hodina {period["uniperiod"]} {self.days[datetime.datetime.strptime(period["date"].replace("-", " "), "%Y %m %d").weekday()]} začína o {period["starttime"]} a končí o {period["endtime"]}') for period in r.json()["r"]["ttitems"]: print( f'{period["uniperiod"]}: {self.subjects[period["subjectid"]]["name"]} - {self.teachers[period["teacherids"][0]]["firstname"]} {self.teachers[period["teacherids"][0]]["lastname"]}') def get_id(self): r = self.session.post(f"{self.edupage_address}rpr/server/maindbi.js?__func=mainDBIAccessor", data='{"__args":[null,2021,{"vt_filter":{"datefrom":"2021-09-16","dateto":"2021-09-22"}},{"op":"fetch","tables":[],"columns":[],"needed_part":{"teachers":["__name","cb_hidden","expired","firstname","lastname","short"],"classes":["__name","classroomid"],"classrooms":["__name","name","short"],"students":["__name","classid"],"subjects":["__name","name","short"]},"needed_combos":{},"client_filter":{},"info_tables":[],"info_columns":[]}],"__gsh":"' + self.gsh + '"}') self.teachers = {} for data in r.json()["r"]["tables"][0]["data_rows"]: self.teachers[data["id"]] = data self.subjects = {} for data in r.json()["r"]["tables"][1]["data_rows"]: self.subjects[data["id"]] = data # hardcoded anj and nej self.subjects["*2"] = {'id': '*2', 'name': 'anglický jazyk', 'short': 'ANJ', 'subname': ''} self.subjects["*3"] = {'id': '*3', 'name': 'nemecký jazyk', 'short': 'NEJ', 'subname': ''} if __name__ == '__main__': login_data = load_pass("") edu = Edu("https://spspb.edupage.org/", login_data["username"], login_data["password"], enable_threading=False) edu.get_id() edu.get_timetable() pass