Skip to content
This repository was archived by the owner on Sep 22, 2024. It is now read-only.

Commit 4484da4

Browse files
committed
fix: use httpx async client
1 parent abced4c commit 4484da4

3 files changed

Lines changed: 64 additions & 58 deletions

File tree

netschoolapi/client.py

Lines changed: 59 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -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"]

netschoolapi/data.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ class Lesson(NamedTuple):
1010
end_time: time = None
1111
subject_name: str = None
1212

13+
# noinspection PyProtectedMember
1314
@staticmethod
1415
def create(data):
1516
lesson = Lesson()

netschoolapi/utils.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,11 @@ def __init__(self, url):
1717

1818
@property
1919
async def login_form_data(self) -> dict:
20-
resp = await httpx.get(self.__url.rstrip("/") + "/webapi/prepareloginform")
21-
assert resp.status_code == 200
20+
async with httpx.AsyncClient() as client:
21+
resp = await client.get(self.__url.rstrip("/") + "/webapi/prepareloginform")
22+
assert resp.status_code == 200
2223

23-
return resp.json()
24+
return resp.json()
2425

2526
async def get_login_data(
2627
self,

0 commit comments

Comments
 (0)