-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathexam_class.py
More file actions
80 lines (69 loc) · 2.43 KB
/
Copy pathexam_class.py
File metadata and controls
80 lines (69 loc) · 2.43 KB
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
from urllib.parse import urlparse
import streamlit as st
from scraper import Scraper, gen_usn, roll_range
class ExamScraper(Scraper):
def __init__(self, url="https://exam.msrit.edu/"):
self.URL = url + ("/" if url[-1] != "/" else "")
super(ExamScraper, self).__init__()
def get_post_body(self, payload):
soup = self.get_soap(self.URL, "POST", payload)
body = soup.body
try:
_ = body.find_all("h3")[0].text
return body
except IndexError:
return
def get_stats(self, payload) -> dict[str, str]:
body = self.get_post_body(payload)
if body is None: return {}
url = urlparse(self.URL)
return {
"usn": payload["usn"],
"name": body.find_all("h3")[0].text,
"sgpa": body.find_all("p")[3].text,
"photo": f"{url[0]}://{url[1]}" + body.find_all("img")[1]['src'],
}
def get_dept(self, head: str, year: str, dept: str, tolerate: int = 5):
payload = gen_payload()
tol = tolerate
if tol <= 0: return
payload["usn"] = gen_usn(year, dept, roll, head)
stats = self.get_stats(payload)
if not stats:
tol -= 1
tol = tolerate
yield stats
def gen_payload() -> dict[str, str]:
return {
"usn": "",
"osolCatchaTxt": "",
"osolCatchaTxtInst": "0",
"option": "com_examresult",
"task": "getResult"
}
def micro(head: str, year: str, dept: str, rollnum):
with ExamScraper("https://exam.msrit.edu/eresultseven/") as EXAM:
for stat in EXAM.get_dept(head, year, dept, rollnum):
write = \
f"{stat['usn']:{len(head + year + dept) + 3 + 5}}," \
f"{stat['name']:64}," \
f"{stat['sgpa']:5}," \
f"{stat['photo']}," \
f""
print(write)
profile_image = f"{stat['photo']}"
st.image(profile_image, caption=stat['name'], use_column_width=True)
st.subheader(f'CGPA: {stat["sgpa"]}')
if __name__ == '__main__':
HEAD = "1MS"
st.title("Find Anyone's CGPA just using USN")
usn = st.text_input("Enter your USN")
check = False
if len(usn) == 10:
check = True
btn = st.button("Check CGPA")
if check or btn:
roll = int(usn[7:10])
DEPT = usn[5:7].upper()
YEAR = usn[3:5]
micro(HEAD, YEAR, DEPT, roll)