@@ -15,8 +15,9 @@ class NetSchoolAPI:
1515 esrn_sec : str = None
1616 user_id : int = None
1717 year_id : int = None
18+ logged_in = False
1819
19- session = httpx .Client ()
20+ session = httpx .AsyncClient ()
2021
2122 def __init__ (self , url ):
2223 self .url = url .rstrip ("/" )
@@ -26,53 +27,55 @@ async def get_form_data(self, for_: Optional[str] = "schools"):
2627 return list (map (lambda a : a ["name" ], (await login_data .login_form_data )[for_ ]))
2728
2829 async def login (self , login : str , password : str , school : str ):
29- await self .session .get (self .url )
30+ async with self .session :
31+ await self .session .get (self .url )
3032
31- resp = await self .session .post (self .url + "/webapi/auth/getdata" , data = b'' )
32- data = resp .json ()
33- lt , ver , salt = data ["lt" ], data ["ver" ], data ["salt" ]
33+ resp = await self .session .post (self .url + "/webapi/auth/getdata" , data = b' ' )
34+ data = resp .json ()
35+ lt , ver , salt = data ["lt" ], data ["ver" ], data ["salt" ]
3436
35- login_data = LoginForm (url = self .url )
36- await login_data .get_login_data (school = school )
37+ login_data = LoginForm (url = self .url )
38+ await login_data .get_login_data (school = school )
3739
38- pw2 = hashlib .new (
39- "md5" ,
40- salt .encode () + hashlib .new ("md5" , password .encode ()).hexdigest ().encode (),
41- ).hexdigest ()
42- pw = pw2 [: len (password )]
40+ pw2 = hashlib .new (
41+ "md5" ,
42+ salt .encode () + hashlib .new ("md5" , password .encode ()).hexdigest ().encode (),
43+ ).hexdigest ()
44+ pw = pw2 [: len (password )]
4345
44- data = {
45- "LoginType" : "1" ,
46- ** login_data .__dict__ ,
47- "UN" : login ,
48- "PW" : pw ,
49- "lt" : lt ,
50- "pw2" : pw2 ,
51- "ver" : ver ,
52- }
53- resp = await self .session .post (
54- self .url + "/webapi/login" ,
55- data = data ,
56- headers = {"Referer" : self .url + "/about.html" }, # Referer REQUIRED
57- )
58- try :
59- self .at = resp .json ()["at" ]
60- except KeyError as err :
61- error_message = resp .json ()["message" ]
62- # noinspection GrazieInspection
63- if "Следующая попытка может быть совершена не ранее чем" in error_message :
64- raise RateLimitingError ("Rate limited by the server. Try again later." ) from err
65- elif "Неправильный пароль" in error_message :
66- raise WrongCredentialsError ("Incorrect credentials provided." ) from err
67- else :
68- raise UnknownServerError ("message: " + error_message )
69- resp = await self .session .post (
70- self .url + "/angular/school/studentdiary/" , data = {"AT" : self .at , "VER" : ver }
71- )
72- self .user_id = (
73- int (re .search (r'userId = "(\d+)"' , resp .text , re .U ).group (1 )) - 2
74- ) # TODO: Investigate this
75- self .year_id = int (re .search (r'yearId = "(\d+)"' , resp .text , re .U ).group (1 ))
46+ data = {
47+ "LoginType" : "1" ,
48+ ** login_data .__dict__ ,
49+ "UN" : login ,
50+ "PW" : pw ,
51+ "lt" : lt ,
52+ "pw2" : pw2 ,
53+ "ver" : ver ,
54+ }
55+ resp = await self .session .post (
56+ self .url + "/webapi/login" ,
57+ data = data ,
58+ headers = {"Referer" : self .url + "/about.html" }, # Referer REQUIRED
59+ )
60+ try :
61+ self .at = resp .json ()["at" ]
62+ except KeyError as err :
63+ error_message = resp .json ()["message" ]
64+ # noinspection GrazieInspection
65+ if "Следующая попытка может быть совершена не ранее чем" in error_message :
66+ raise RateLimitingError ("Rate limited by the server. Try again later." ) from err
67+ elif "Неправильный пароль" in error_message :
68+ raise WrongCredentialsError ("Incorrect credentials provided." ) from err
69+ else :
70+ raise UnknownServerError ("message: " + error_message )
71+ resp = await self .session .post (
72+ self .url + "/angular/school/studentdiary/" , data = {"AT" : self .at , "VER" : ver }
73+ )
74+ self .user_id = (
75+ int (re .search (r'userId = "(\d+)"' , resp .text , re .U ).group (1 )) - 2
76+ ) # TODO: Investigate this
77+ self .year_id = int (re .search (r'yearId = "(\d+)"' , resp .text , re .U ).group (1 ))
78+ self .logged_in = True
7679
7780 async def get_diary (
7881 self , week_start : Optional [datetime ] = None , week_end : Optional [datetime ] = None
@@ -81,17 +84,18 @@ async def get_diary(
8184 week_start = datetime .now () - timedelta (days = 7 )
8285 if week_end is None :
8386 week_end = datetime .now ()
84- resp = await self .session .get (
85- self .url + "/webapi/student/diary" ,
86- params = {
87- "studentId" : self .user_id ,
88- "weekEnd" : week_end .isoformat (),
89- "weekStart" : week_start .isoformat (),
90- "withLaAssigns" : "true" ,
91- "yearId" : self .year_id ,
92- },
93- headers = {"at" : self .at },
94- )
87+ async with self .session :
88+ resp = await self .session .get (
89+ self .url + "/webapi/student/diary" ,
90+ params = {
91+ "studentId" : self .user_id ,
92+ "weekEnd" : week_end .isoformat (),
93+ "weekStart" : week_start .isoformat (),
94+ "withLaAssigns" : "true" ,
95+ "yearId" : self .year_id ,
96+ },
97+ headers = {"at" : self .at },
98+ )
9599 return [
96100 [Lesson ().create (lesson_data ) for lesson_data in day ["lessons" ]]
97101 for day in resp .json ()["weekDays" ]
0 commit comments