-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.py
123 lines (96 loc) · 4.09 KB
/
app.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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import requests
from bs4 import BeautifulSoup, SoupStrainer
import concurrent.futures
from flask import Flask, request, render_template
from flask import jsonify
from attendance import *
import time
MAIN = {}
app = Flask(__name__)
def generate_course_links(request_object, huid, passw):
course_links = []
Only_parse = SoupStrainer('script', attrs={'language': 'JavaScript'})
totalcourses_soup = BeautifulSoup(request_object, 'lxml', parse_only=Only_parse)
for x in totalcourses_soup.find_all('script',language='JavaScript'):
if 'var PFieldList_win4' in str(x):
TOTAL_COURSES = str(x)
break
TOTAL_COURSES = int(TOTAL_COURSES[TOTAL_COURSES.find('DESCR1')+8:len(TOTAL_COURSES)-79])
For_Codes = SoupStrainer('a',class_='PSHYPERLINK')
code_soup = BeautifulSoup(request_object, 'lxml', parse_only=For_Codes)
for link in range(TOTAL_COURSES):
code = code_soup.find('a',class_='PSHYPERLINK',id='SELECT$'+str(link)).get_text()
url = "https://pscs.habib.edu.pk/psc/ps_4/EMPLOYEE/PSFT_HR/c/MANAGE_ACADEMIC_RECORDS.STDNT_ATTENDANCE.GBL?Page=STDNT_ATTND_SRCH&Action=U&ACAD_CAREER=UGRD&CLASS_NBR="+code+"&DESCR=HCPPALL&EMPLID="+huid[2:]+"&INSTITUTION=HUNIV&STRM=2211&TargetFrameName=None"
course_links.append(url)
return course_links
def Info_and_Courses(url, huid, passw):
main_dict = {}
login_data = {'userid':huid, 'pwd':passw}
request_return = requests.post(url, data=login_data, verify=False).text
Parse_only = SoupStrainer(class_=['PSEDITBOX_DISPONLY'])
name_soup = BeautifulSoup(request_return, 'lxml', parse_only=Parse_only)
Name = name_soup.find('span',class_='PSEDITBOX_DISPONLY',id='PERSONAL_DTSAVW_NAME').get_text()
# print(Name)
main_dict['username'] = Name
main_dict['id'] = huid
# print(main_dict)
links = generate_course_links(request_return, huid, passw)
main_dict['coursedata'] = multithreading(links, huid, passw)
main_dict['last_updated'] = time.time()
return main_dict
@app.route("/")
def greetings():
return "Hazir HU API"
@app.route('/logincheck')
def login_check():
ID = request.args.get('id')
PASS = request.args.get('pwd')
URL = 'https://pscs.habib.edu.pk/psc/ps_4/EMPLOYEE/PSFT_HR/c/X_ATTEND_TRACKING.STDNT_ATTEND_TERM.GBL?Page=STDNT_ATTDNCE1&Action=U&EMPLID='+ID[2:]+'&INSTITUTION=HUNIV&STRM=2011&TargetFrameName=None'
login_data = {'userid':ID, 'pwd':PASS}
print(login_data)
r = requests.post(URL, data=login_data, verify=False)
if r.status_code == 200:
request_return = r.text
Parse_only = SoupStrainer(class_=['PSEDITBOX_DISPONLY'])
try:
name_soup = BeautifulSoup(request_return, 'lxml', parse_only=Parse_only)
Name = name_soup.find('span',class_='PSEDITBOX_DISPONLY',id='PERSONAL_DTSAVW_NAME').get_text()
if ',' in Name:
first_name = Name.split(',')[1]
else:
first_name = Name
return jsonify(
status = "success",
name = first_name)
except Exception as e:
print(e)
return jsonify(
status = 'invalid credentials')
else:
return jsonify(
status = 'network error')
@app.route("/login")
def login():
ID = request.args.get('id')
PASS = request.args.get('pwd')
print(ID, PASS)
if isinstance(ID, str) == False or isinstance(PASS, str) == False:
return jsonify(
status = "null id or password"
)
if ID[2:].isdigit() == False:
return jsonify(
status = "incorrect id"
)
URL = 'https://pscs.habib.edu.pk/psc/ps_4/EMPLOYEE/PSFT_HR/c/X_ATTEND_TRACKING.STDNT_ATTEND_TERM.GBL?Page=STDNT_ATTDNCE1&Action=U&EMPLID='+ID[2:]+'&INSTITUTION=HUNIV&STRM=2011&TargetFrameName=None'
try:
return_main = Info_and_Courses(URL, ID, PASS)
except Exception as e:
print(e)
return jsonify(
status = "network error"
)
return jsonify(return_main)
if __name__ == '__main__':
app.run(debug=False)
app.run('0.0.0.0',80)