Advertisement
Guest User

Untitled

a guest
Aug 3rd, 2016
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 32.85 KB | None | 0 0
  1. __author__ = 'George Thayamkery'
  2. '''
  3. Scraper script for graded scraping Home Access Center
  4. Created by George Thayamkery
  5. its pretty ugly tho jkjljl
  6. 3/1/15
  7. '''
  8. import json
  9. import requests
  10. import time
  11. import traceback
  12.  
  13. from bs4 import BeautifulSoup
  14.  
  15. g_url = ''
  16. g_src = ''
  17. g_username = ''
  18. done = []
  19. def getuser(username="", password="", url="", skip="", device="", only="", debug="", dbID=None,gpa=False):
  20. if device is None:
  21. device = 'n/a'
  22. try:
  23. return process(username, password, url, skip, device, only, debug,dbID, gpa)
  24. except Exception as e:
  25. trace = str(traceback.format_exc())
  26. onerror(e, device, trace)
  27. raise e
  28.  
  29. def getmp(username, password, url, mp, dbID,gpa=False):
  30. try:
  31. return markingPeriod(username, password, url, mp, dbID,gpa)
  32. except Exception as e:
  33. trace = str(traceback.format_exc())
  34. print(trace)
  35. onmperror(e, '', trace, g_src)
  36. raise e
  37. def onrequesterror():
  38. print('Request Failed')
  39. def isUser(username, password, url):
  40. isthere = {
  41. 'isAuth':'',
  42. 'dbID': ''
  43. }
  44.  
  45. session = requests.Session()
  46. getDatabase = session.get(url)
  47. findDb = BeautifulSoup(getDatabase.text,'html.parser')
  48. dbID = findDb.find(id='Database')['value']
  49. isthere['dbID'] = dbID
  50. a = session.post(
  51. url +'/Account/LogOn?'+dbID+'&LogOnDetails.UserName='+username+'&LogOnDetails.Password='+password
  52. )
  53. logIn = BeautifulSoup(a.text, 'html.parser')
  54. if logIn.find(class_='sg-logon-button') is None:
  55. isthere['isAuth'] = 'true'
  56. else:
  57. isthere['isAuth'] = 'false'
  58.  
  59. return json.dumps(isthere)
  60.  
  61.  
  62. def getdbID(session,url):
  63. dbID = ''
  64. try:
  65. getDatabase = session.get(url, timeout=5)
  66. except requests.exceptions.ConnectTimeout:
  67. # http handler
  68. url = url.replace('http:','https:')
  69. getDatabase = session.get(url, timeout=5)
  70.  
  71. findDb = BeautifulSoup(getDatabase.text,'html.parser')
  72.  
  73. # GET dB
  74. try:
  75. dbID = findDb.find(id='Database')
  76. if dbID.find('option') is None:
  77. dbID = dbID['value']
  78. else:
  79. dbID = dbID.find('option')['value']
  80. except AttributeError:
  81. # TODO: make work with multiple dBID (district dropdown)
  82. url = url.replace('http:','https:')
  83. getDatabase = session.get(url, timeout=5)
  84. findDb = BeautifulSoup(getDatabase.text,'html.parser')
  85. dbID = findDb.find(id='Database')
  86. if dbID.find('option') is None:
  87. dbID = dbID['value']
  88. else:
  89. dbID = dbID.find('option')['value']
  90. return dbID
  91. def progressReport(session,User,url,progressreport):
  92. print('Started RP')
  93. #PROGRESS REPORT/REPORT CARD SCRAPER
  94. # print('(RP) Sending GET')
  95. # progressreport = session.get(url +'/Content/Student/InterimProgress.aspx', verify=False)
  96. # print('(RP) Got GET')
  97. pr = BeautifulSoup(str(progressreport.text), "html.parser")
  98. try:
  99. if pr.find(id='plnMain_lblMessage') is None:
  100. if pr.find(id='plnMain_lblTitle').get_text() is not None:
  101. User['reportcard']['ipr']['name'] = pr.find(id='plnMain_lblTitle').get_text()
  102. else:
  103. User['reportcard']['ipr']['name'] = 'Progress Report'
  104. headers = pr.find(class_='sg-asp-table-header-row').find_all('td')
  105. listofheaders = []
  106. for header in headers:
  107. if header.get_text() is not None:
  108. listofheaders.append(header.get_text())
  109. else:
  110. listofheaders.append('')
  111. User['reportcard']['ipr']['format'] = listofheaders
  112. items = pr.find_all(class_='sg-asp-table-data-row')
  113. listofitems = []
  114. for item in items:
  115. listofitems.append(item)
  116. listofcourses = []
  117. for td in listofitems:
  118. course = td.find_all('td')
  119. coursevals = []
  120. for val in course:
  121. coursevals.append(val.get_text().replace('\u00a0','-').replace('\n','').strip())
  122. listofcourses.append(coursevals)
  123. User['reportcard']['ipr']['courses'] = listofcourses
  124. else:
  125. User['reportcard']['ipr']['message'] = 'No Progress Report'
  126. done.append('scraped ipr')
  127. except Exception as e:
  128. print(e)
  129. User['reportcard']['ipr']['message'] = 'Failed to get IPR'
  130.  
  131. def reportCard(session,User,url,reportcard):
  132. #REPORT CARD SCRAPER
  133. # print('(RP) Sending GET (2)')
  134. # reportcard = session.get(url +'/Content/Student/ReportCards.aspx', verify=False)
  135. # print('(RP) GOT GET (2)')
  136. rp = BeautifulSoup(str(reportcard.text), "html.parser")
  137. try:
  138. if rp.find(id='plnMain_lblMessage') is None:
  139. User['reportcard']['rpc']['name'] = rp.find(id='plnMain_lblTitle').get_text()
  140. headers = rp.find(class_='sg-asp-table-header-row').find_all('td')
  141. listofheaders = []
  142. for header in headers:
  143. listofheaders.append(header.get_text())
  144. User['reportcard']['rpc']['format'] = listofheaders
  145. items = rp.find_all(class_='sg-asp-table-data-row')
  146. listofitems = []
  147. for item in items:
  148. listofitems.append(item)
  149. listofcourses = []
  150. for td in listofitems:
  151. course = td.find_all('td')
  152. coursevals = []
  153. for val in course:
  154. coursevals.append(val.get_text().replace('\u00a0','-').replace('\n','').strip())
  155. listofcourses.append(coursevals)
  156. User['reportcard']['rpc']['courses'] = listofcourses
  157. else:
  158. User['reportcard']['rpc']['message'] = 'No Report Card'
  159. done.append('scraped rpc')
  160. except Exception as e:
  161. print(e)
  162. User['reportcard']['rpc']['message'] = 'Failed to get Report Card'
  163.  
  164. def profile(session,User,url,profile):
  165. print('Started P')
  166. try:
  167. # print('(P) Sending GET')
  168. # profile = session.get(url +'/Content/Student/Registration.aspx', verify=False)
  169. # print('(P) GOT GET')
  170. profileSoup = BeautifulSoup(str(profile.text), "html.parser")
  171. if profileSoup.find(id = 'plnMain_lblRegStudentName') is not None:
  172. fullname = profileSoup.find(id = 'plnMain_lblRegStudentName').get_text()
  173. User['profile']['fullname'] = fullname
  174.  
  175. if profileSoup.find(id = 'plnMain_lblCounselor') is not None:
  176. counselor = profileSoup.find(id = 'plnMain_lblCounselor').get_text()
  177. User['profile']['counselor'] = counselor
  178.  
  179. if profileSoup.find(id = 'plnMain_lblCounselor').find('a') is not None:
  180. counselor_email = profileSoup.find(id = 'plnMain_lblCounselor').find('a').get('href').replace('mailto:',"")
  181. User['profile']['counselor_email'] = counselor_email
  182.  
  183. if profileSoup.find(id = 'plnMain_lblBuildingName') is not None:
  184. school = profileSoup.find(id = 'plnMain_lblBuildingName').get_text()
  185. User['profile']['school'] = school
  186.  
  187. if profileSoup.find(id = 'plnMain_lblHomeroom') is not None:
  188. homeroom = profileSoup.find(id = 'plnMain_lblHomeroom').get_text()
  189. User['profile']['homeroom'] = homeroom
  190.  
  191. if profileSoup.find(id = 'plnMain_lblGrade') is not None:
  192. grade = profileSoup.find(id = 'plnMain_lblGrade').get_text()
  193. User['profile']['grade'] = grade
  194.  
  195. if profileSoup.find(id = 'plnMain_lblHomeroomTeacher') is not None:
  196. homeroom_teacher = profileSoup.find(id = 'plnMain_lblHomeroomTeacher').get_text()
  197. User['profile']['homeroom_teacher'] = homeroom_teacher
  198.  
  199. if profileSoup.find(id = 'plnMain_lblHomeroomTeacher').find('a') is not None:
  200. homeroom_teacher_email = profileSoup.find(id = 'plnMain_lblHomeroomTeacher').find('a').get('href').replace('mailto:',"")
  201. User['profile']['homeroom_teacher_email'] = homeroom_teacher_email
  202. done.append('scraped profile')
  203. except Exception as e:
  204. print(e)
  205.  
  206. def schedule(session,User,schedFrmt,url,sched):
  207. print('Started S')
  208. # print('(S) Sending GET')
  209. # sched = session.get(url + '/Content/Student/Classes.aspx', verify=False)
  210. # print('(S) GOT GET')
  211. schedule = BeautifulSoup(str(sched.text), "html.parser")
  212. try:
  213. if schedule.find(class_='sg-asp-table') is not None:
  214. table = schedule.find(class_='sg-asp-table')
  215. head = table.find(class_ = 'sg-asp-table-header-row')
  216. if head is not None:
  217. things = head.find_all('td')
  218. for thing in things:
  219. schedFrmt.append(thing.get_text().strip())
  220.  
  221. if table.find(class_ = 'sg-asp-table-data-row') is not None:
  222. body = table.find_all(class_ = 'sg-asp-table-data-row')
  223. for item in body:
  224. currentItem = []
  225. for i in item:
  226. if i.find('a') is None:
  227. currentItem.append(i.get_text().strip())
  228. elif i.find('a') != -1:
  229. currentItem.append(i.find('a').get_text().strip())
  230.  
  231. User['schedule']['values'].append(currentItem)
  232. done.append('scraped sched')
  233. except Exception as e:
  234. print(e)
  235. User['schedule']['values'].append([])
  236. def assignments(session,User,url,classNames,classGrade,work,frmat,classes,b):
  237. global done
  238. print('Started A')
  239. try:
  240. # print('(A) Sending GET')
  241. # b = session.get(url +'/Content/Student/Assignments.aspx', verify=False)
  242. # print('(A) GOT GET')
  243. h = b.text
  244. ascii_encoded = h.encode('ascii', 'ignore')
  245. decoded_text = ascii_encoded.decode("utf-8")
  246. d = BeautifulSoup(decoded_text, "html.parser")
  247. runs = d.find('select',id='plnMain_ddlReportCardRuns')
  248. options = runs.find_all('option')
  249. mps = []
  250. for o in options:
  251. try:
  252. if o['selected'] == 'selected':
  253. User['current_run'] = o.get_text(strip=True)
  254. except KeyError as e:
  255. print(e)
  256. mps.append(o.get_text(strip=True))
  257. User['runs'] = mps
  258. assignments = d.find_all(class_="AssignmentClass")
  259. names = d.find_all(class_="sg-header sg-header-square")
  260. g1 = d.find_all('td',style="text-align: right")
  261. for classes in assignments:
  262. grd = classes.find('td',style="text-align: right")
  263. if grd == None:
  264. a = '0.0'
  265. else:
  266. a = grd.find('span').get_text(strip=True)
  267. classGrade.append(a)
  268. for c in names:
  269. i = c.find('a').get_text(strip=True)
  270. classNames.append(i.replace("\r\n\t\t\t\t\t", "").replace("\r\n\t\t\t\t",""))
  271.  
  272. for x in classNames:
  273. User['classes'][x] = {}
  274. User['classes'][x]['name'] = x
  275. classes.append(x)
  276. count = 0
  277. avgGPA = 0.0
  278. collegeGPA = 0.0
  279. unweightedGPA = 0.0
  280. numOfGrades = 0
  281. for v in classGrade:
  282. User['classes'][classNames[count]]['avggrade'] = v.replace("Student Average","")
  283. grade = float(User['classes'][classNames[count]]['avggrade'].replace('%',''))
  284. gpa = 0.0
  285. secondDigit = 0.0
  286. if User['classes'][classNames[count]]['avggrade'] != "0.0":
  287. if 'PAP' in classNames[count] or 'AP' in classNames[count]:
  288. if grade >= 100:
  289. gpa = 6.0
  290. secondDigit = 0.0
  291. elif grade >= 90:
  292. gpa = 5.0
  293. secondDigit = float(int(str(int(grade*10))[1])/10)
  294. elif grade >= 80:
  295. gpa = 4.0
  296. secondDigit = float(int(str(int(grade*10))[1])/10)
  297. elif grade >= 70:
  298. gpa = 3.0
  299. secondDigit = float(int(str(int(grade*10))[1])/10)
  300. else:
  301. gpa = 0.0
  302. secondDigit = 0.0
  303. gpa += secondDigit
  304. User['classes'][classNames[count]]["weightedGPA"] = gpa
  305. else:
  306. if grade >= 100:
  307. gpa = 5.0
  308. secondDigit = 0.0
  309. elif grade >= 90:
  310. gpa = 4.0
  311. secondDigit = float(int(str(int(grade*10))[1])/10)
  312. elif grade >= 80:
  313. gpa = 3.0
  314. secondDigit = float(int(str(int(grade*10))[1])/10)
  315. elif grade >= 70:
  316. gpa = 2.0
  317. secondDigit = float(int(str(int(grade*10))[1])/10)
  318. else:
  319. gpa = 0.0
  320. secondDigit = 0.0
  321. gpa += secondDigit
  322. User['classes'][classNames[count]]["weightedGPA"] = gpa
  323. avgGPA += gpa
  324. numOfGrades += 1
  325. if grade >= 93:
  326. gpa = 4.0
  327. elif grade >= 90:
  328. gpa = 3.7
  329. elif grade >= 87:
  330. gpa = 3.3
  331. elif grade >= 83:
  332. gpa = 3.0
  333. elif grade >= 80:
  334. gpa = 2.7
  335. elif grade >= 77:
  336. gpa = 2.3
  337. elif grade >= 73:
  338. gpa = 2.0
  339. elif grade >= 70:
  340. gpa = 1.7
  341. elif grade >= 67:
  342. gpa = 1.3
  343. elif grade >= 65:
  344. gpa = 1.0
  345. else:
  346. gpa = 0.0
  347. collegeGPA += gpa
  348. User['classes'][classNames[count]]["collegeGPA"] = gpa
  349. if grade >= 100:
  350. gpa = 5.0
  351. secondDigit = 0.0
  352. elif grade >= 90:
  353. gpa = 4.0
  354. secondDigit = float(int(str(int(grade*10))[1])/10)
  355. elif grade >= 80:
  356. gpa = 3.0
  357. secondDigit = float(int(str(int(grade*10))[1])/10)
  358. elif grade >= 70:
  359. gpa = 2.0
  360. secondDigit = float(int(str(int(grade*10))[1])/10)
  361. else:
  362. gpa = 0.0
  363. secondDigit = 0.0
  364. gpa += secondDigit
  365. unweightedGPA += gpa
  366. User['classes'][classNames[count]]["unweightedGPA"] = gpa
  367. if grade >= 95.0:
  368. User['classes'][classNames[count]]['lettergrade'] = 'A+'
  369. User['classes'][classNames[count]]['nopluslettergrade'] = 'A'
  370. elif grade >= 90.0:
  371. User['classes'][classNames[count]]['lettergrade'] = 'A'
  372. User['classes'][classNames[count]]['nopluslettergrade'] = 'A'
  373. elif grade >= 85.0:
  374. User['classes'][classNames[count]]['lettergrade'] = 'B+'
  375. User['classes'][classNames[count]]['nopluslettergrade'] = 'B'
  376. User['classes'][classNames[count]]['lettergrade'] = 'B'
  377. User['classes'][classNames[count]]['nopluslettergrade'] = 'B'
  378. elif grade >= 80.0:
  379. User['classes'][classNames[count]]['lettergrade'] = 'B'
  380. User['classes'][classNames[count]]['nopluslettergrade'] = 'B'
  381. User['classes'][classNames[count]]['lettergrade'] = 'B'
  382. User['classes'][classNames[count]]['nopluslettergrade'] = 'B'
  383. elif grade >= 75.0:
  384. User['classes'][classNames[count]]['lettergrade'] = 'C+'
  385. User['classes'][classNames[count]]['nopluslettergrade'] = 'C'
  386. elif grade >= 70.0:
  387. User['classes'][classNames[count]]['lettergrade'] = 'C'
  388. User['classes'][classNames[count]]['nopluslettergrade'] = 'C'
  389. elif grade < 70.0:
  390. User['classes'][classNames[count]]['lettergrade'] = 'F'
  391. User['classes'][classNames[count]]['nopluslettergrade'] = 'F'
  392. count += 1
  393.  
  394. if numOfGrades != 0.0:
  395. avgGPA = round(avgGPA/numOfGrades,2)
  396. unweightedGPA = round(unweightedGPA/numOfGrades,2)
  397. collegeGPA = round(collegeGPA/numOfGrades,2)
  398.  
  399. User['weightedGPA'] = avgGPA
  400. User['unweightedGPA'] = unweightedGPA
  401. User['collegeGPA'] = collegeGPA
  402. avgGrades = []
  403. for v in assignments:
  404. a = []
  405. gradesSchema = {
  406. "itms":{},
  407. "titles":[]
  408. }
  409. if v.find('table') is None:
  410. work.append(a)
  411. else:
  412. c = v.find('table').find_all('tr')
  413. if len(v.find_all('table')) > 1:
  414. gradeTable = v.find_all('table')[1].find_all('tr', class_="sg-asp-table-data-row")
  415. for line in gradeTable:
  416. averages = line.find_all("td")
  417. gradesSchema["itms"][averages[0].get_text()] = averages[3].get_text()
  418. gradesSchema["titles"].append(averages[0].get_text())
  419. else:
  420. gradesSchema["N/A"] = ""
  421. for val in c:
  422. a.append(val.find_all('td'))
  423. for thing in a:
  424. count = 0
  425. for m in thing:
  426. if str(type(m)) == "<class 'bs4.element.Tag'>":
  427. if m.find("label") != None:
  428. m.find("label").replaceWith("")
  429. m = m.get_text(strip=True)
  430.  
  431. thing[count] = str(m)
  432. thing[count] = thing[count].replace('<td>','')
  433. thing[count] = thing[count].replace('\u00a0','-')
  434. thing[count] = thing[count].replace('</td>','')
  435. thing[count] = thing[count].replace('\n\r\n\t\t\t\t\t\t\t\t\t','')
  436. thing[count] = thing[count].replace('\r\n\t\t\t\t\t\t\t\t\n*\n','')
  437. thing[count] = thing[count].replace('<td class="sg-view-quick">','')
  438. count += 1
  439. work.append(a)
  440. avgGrades.append(gradesSchema)
  441. count = 0
  442. for assign in work:
  443. if assign:
  444. if count == 0:
  445. frmat.append(assign[0])
  446. count = 1
  447.  
  448. del assign[0]
  449. count = 0
  450. for name in classNames:
  451. User['classes'][name]['classwork'] = work[count]
  452. User['classes'][name]['averages'] = avgGrades[count]
  453. count += 1
  454. done.append('scraped assignment')
  455. except Exception as e:
  456. raise e
  457. def gpa(User,a):
  458. User["transcriptFound"] = "hide"
  459. transcript = BeautifulSoup(a.text,"html.parser")
  460. try:
  461. User["HAC_GPA_Data"] = []
  462. table = transcript.find(id = "plnMain_rpTranscriptGroup_tblCumGPAInfo")
  463. headtr = table.find(class_="sg-asp-table-header-row")
  464. headers = []
  465. data = []
  466. td = headtr.find_all("td")
  467. count = 0
  468. indexOfFIN = 0
  469. numOfSemesters = 0
  470. weightedGPA = 0.00001
  471. unweightedGPA = 0.00001
  472. for d in td:
  473. headers.append(d.get_text())
  474. count += 1
  475. User["HAC_GPA_Headers"] = headers
  476. tr = table.find_all("tr",class_="sg-asp-table-data-row")
  477. for t in tr:
  478. data = []
  479. td = t.find_all("td")
  480. for d in td:
  481. data.append(d.get_text())
  482. User["HAC_GPA_Data"].append(data)
  483.  
  484. for row in User["HAC_GPA_Data"]:
  485. if row[0] == "Weighted GPA":
  486. weightedGPA = float(row[1])
  487. elif row[0] == "4.0 College GPA":
  488. unweightedGPA = float(row[1])
  489.  
  490. years = transcript.find_all(class_="sg-transcript-group")
  491. for transcriptBoxes in years:
  492. tbls = transcriptBoxes.find("tr",class_="sg-asp-table-data-row")
  493. tds = tbls.find_all("td")
  494. if tds[5].get_text() == "0.5000":
  495. numOfSemesters += 1
  496. else:
  497. numOfSemesters += 2
  498. print(numOfSemesters, tds[5])
  499. w = weightedGPA * numOfSemesters
  500. newWeighted = (w + User["weightedGPA"])/(numOfSemesters + 1)
  501.  
  502. u = unweightedGPA * numOfSemesters
  503. newUnweighted = (u + User["collegeGPA"])/(numOfSemesters + 1)
  504. print(newWeighted,newUnweighted)
  505.  
  506. User["overall_weightedGPA"] = round(newWeighted,2)
  507. User["overall_collegeGPA"] = round(newUnweighted,2)
  508. if unweightedGPA == 0.00001:
  509. User["overall_collegeGPA"] = "N/A"
  510. if weightedGPA == 0.00001:
  511. User["overall_weightedGPA"] = "N/A"
  512. User["numOfSemesters"] = numOfSemesters
  513. User["transcriptFound"] = ""
  514. if newUnweighted == 0.0 or newWeighted == 0.0:
  515. User["transcriptFound"] = "hide"
  516. except Exception as e:
  517. User["transcriptFound"] = "hide"
  518.  
  519. def process(username, password, url, skip, device,only, debug,dbID,gpa):
  520.  
  521. global done
  522. global g_url
  523. global g_username
  524.  
  525. '''
  526. String formating
  527. '''
  528. url = url.lower().replace('account/logon?returnurl=/homeaccess','').replace('account/logon?returnurl=/homeaccess/','')
  529. if 'https://' not in url:
  530. if 'http://' not in url:
  531. url = 'http://'+url
  532. print(url.find('/homeaccess'))
  533. pos = url.find('/homeaccess')
  534. if pos > 7:
  535. url = url[:pos+11]
  536. print(url)
  537.  
  538.  
  539. print(username,password,url)
  540. timStart = time.time()
  541. g_url = url
  542. g_username = username
  543. classNames = []
  544. classGrade = []
  545. schedFrmt = []
  546. frmat = []
  547. classes = []
  548. work = []
  549. User = {
  550. 'status':'success',
  551. 'profile':{
  552. 'fullname': "",
  553. 'name':'',
  554. 'counselor':"",
  555. 'counselor_email':"",
  556. 'school':"",
  557. 'homeroom':"",
  558. 'grade':"",
  559. 'homeroom_teacher':"",
  560. 'homeroom_teacher_email':""
  561. },
  562. 'classes':{
  563.  
  564. },
  565. 'reportcard':{
  566. 'ipr':{
  567. 'name':'',
  568. 'message':''
  569. },
  570. 'rpc':{
  571. 'name':'',
  572. 'message':''
  573. }
  574. },
  575. 'schedule':{
  576. 'values':[],
  577. 'format':schedFrmt
  578. },
  579. 'time': str(time.strftime("%I:%M")),
  580. 'format': frmat,
  581. 'current_run': "",
  582. 'dbID':"",
  583.  
  584. }
  585. session = requests.Session()
  586. try:
  587. getDatabase = session.get(url, timeout=5)
  588. except requests.exceptions.ConnectTimeout:
  589. #http handler
  590. url = url.replace('http:','https:')
  591. getDatabase = session.get(url, timeout=5)
  592.  
  593. findDb = BeautifulSoup(getDatabase.text,'html.parser')
  594.  
  595. #GET dB
  596. if dbID is None:
  597. try:
  598. dbID = findDb.find(id='Database')
  599. if(dbID.find('option') is None):
  600. dbID = dbID['value']
  601. else:
  602. dbID = dbID.find('option')['value']
  603. except AttributeError:
  604. #TODO: make work with multiple dBID (district dropdown)
  605. url = url.replace('http:','https:')
  606. getDatabase = session.get(url, timeout=5)
  607. findDb = BeautifulSoup(getDatabase.text,'html.parser')
  608. dbID = findDb.find(id='Database')
  609. if dbID.find('option') is None:
  610. dbID = dbID['value']
  611. else:
  612. dbID = dbID.find('option')['value']
  613.  
  614. User['dbID'] = dbID
  615. a = session.post(
  616. url +'/Account/LogOn?Database='+ dbID + '&LogOnDetails.UserName='+username+'&LogOnDetails.Password='+password, verify= False)
  617.  
  618.  
  619.  
  620. logIn = BeautifulSoup(a.text, 'html.parser')
  621. done.append('Got dBid')
  622. #AUTH hac-nav-menu
  623.  
  624. if logIn.find(class_='sg-button sg-logon-button') is None or logIn.find(id='hac-nav-menu') is not None:
  625. done.append('authenticated')
  626. try:
  627. User['profile']['name'] = logIn.find(class_='sg-menu-element-identity').find('span').get_text()
  628. except Exception:
  629. User['profile']['name'] = ''
  630.  
  631. if only == 'grades' or only == '':
  632. a = session.get(url + '/Content/Student/InterimProgress.aspx')
  633. reportCard(session,User,url,a)
  634. a = session.get(url + '/Content/Student/InterimProgress.aspx')
  635. progressReport(session,User,url,a)
  636. if only == 'profile' or only == '':
  637. a = session.get(url + '/Content/Student/Registration.aspx')
  638. profile(session,User,url,a)
  639. if only == 'schedule' or only == '':
  640. a = session.get(url + '/Content/Student/Classes.aspx')
  641. schedule(session,User,schedFrmt,url,a)
  642. if only == 'assignments' or only == '':
  643. a = session.get(url + '/Content/Student/Assignments.aspx')
  644. done.append("got Assignments HTTP")
  645. assignments(session,User,url,classNames,classGrade,work,frmat,classes,a)
  646. if gpa:
  647. a = session.get(url + '/Content/Student/Transcript.aspx')
  648. print(str(time.time() - timStart))
  649. User['processTime'] = round(time.time() - timStart,1)
  650. success = {
  651. "username": username.lower(),
  652. "district_url": url,
  653. "school": User['profile']['school'],
  654. "date": time.strftime("%d/%m/%Y"),
  655. "device": device,
  656. "processTime": round(time.time() - timStart,1)
  657. }
  658.  
  659. headers = {'content-type': 'application/json'}
  660. if only == '' or only == 'assignments':
  661. # Keen IO Stuff goes here
  662.  
  663. print(str(time.time() - timStart))
  664. print(done)
  665. done = []
  666. else:
  667. print(a.text)
  668. User['status'] = 'failed'
  669. return json.dumps(User)
  670.  
  671. def userexists(username, password, url, dbID = None):
  672.  
  673. global done
  674. global g_url
  675. global g_username
  676.  
  677. '''
  678. String formating
  679. '''
  680.  
  681. try:
  682. User = {
  683. 'profile':{
  684. 'fullname': "",
  685. 'name':'',
  686. 'counselor':"",
  687. 'counselor_email':"",
  688. 'school':"",
  689. 'homeroom':"",
  690. 'grade':"",
  691. 'homeroom_teacher':"",
  692. 'homeroom_teacher_email':""
  693. }
  694. }
  695. bug = "Failed: Make sure you are using a valid URL"
  696. url = url.lower().replace('account/logon?returnurl=/homeaccess','').replace('account/logon?returnurl=/homeaccess/','')
  697. if 'https://' not in url:
  698. if 'http://' not in url:
  699. url = 'http://'+url
  700. pos = url.find('/homeaccess')
  701. if pos > 7 and pos is not None:
  702. url = url[:pos+11]
  703. print(url)
  704.  
  705. g_url = url
  706. g_username = username
  707.  
  708. session = requests.Session()
  709. bug = "Failed 150: Your district is unsupported or you gave an Invalid URL"
  710. if not dbID:
  711. try:
  712. getDatabase = session.get(url, timeout=5)
  713. except requests.exceptions.ConnectTimeout:
  714. #http handler
  715. url = url.replace('http:','https:')
  716. getDatabase = session.get(url, timeout=5)
  717. findDb = BeautifulSoup(getDatabase.text,'html.parser')
  718.  
  719. #GET dB
  720. try:
  721. dbID = findDb.find(id='Database')
  722. if(dbID.find('option') is None):
  723. dbID = dbID['value']
  724. else:
  725. dbID = dbID.find('option')['value']
  726. except AttributeError:
  727. #TODO: make work with multiple dBID (district dropdown)
  728. url = url.replace('http:','https:')
  729. getDatabase = session.get(url, timeout=5)
  730. findDb = BeautifulSoup(getDatabase.text,'html.parser')
  731. dbID = findDb.find(id='Database')
  732. if dbID.find('option') is None:
  733. dbID = dbID['value']
  734. else:
  735. dbID = dbID.find('option')['value']
  736. bug = "Failed 200: Couldn't log you into HAC"
  737. a = session.post(
  738. url +'/Account/LogOn?Database='+ dbID + '&LogOnDetails.UserName='+username+'&LogOnDetails.Password='+password, verify= False)
  739.  
  740. bug = "Failed 250: Couldn't load HAC page."
  741. logIn = BeautifulSoup(a.text, 'html.parser')
  742. done.append('Got dBid')
  743. #AUTH
  744. if logIn.find(class_='sg-button sg-logon-button') is None or logIn.find(id='hac-nav-menu') is not None:
  745. try:
  746. User['profile']['name'] = logIn.find(class_='sg-menu-element-identity').find('span').get_text()
  747. except Exception:
  748. User['profile']['name'] = ''
  749. User["success"] = True
  750. User["dbID"] = dbID
  751. User["url"] = url
  752. User["error"] = ""
  753. prof = session.get(url + '/Content/Student/Registration.aspx')
  754. profile(session,User,url,prof)
  755. else:
  756. User["success"] = False
  757. User["dbID"] = dbID
  758. User["url"] = url
  759. User["error"] = "Invalid Login"
  760. except Exception as e:
  761. User = {
  762. 'success': False,
  763. 'dbID': dbID,
  764. 'url': url,
  765. "error": bug,
  766. "err_info": str(e)
  767. }
  768. return json.dumps(User)
  769. def onerror(e, device, trace):
  770. global done
  771. print('Uh Oh!')
  772. err = {
  773. "username":g_username.lower(),
  774. "district_url":g_url,
  775. "date": time.strftime("%d/%m/%Y"),
  776. "error": str(e),
  777. "device": device,
  778. "events":done,
  779. "traceback":trace
  780. }
  781. headers = {'content-type': 'application/json'}
  782. # Keen Stuff goes here
  783. done = []
  784. def onmperror(e, device, trace,src):
  785. global done
  786. print('Uh Oh!')
  787. err = {
  788. "username":g_username.lower(),
  789. "district_url":g_url,
  790. "date": time.strftime("%d/%m/%Y"),
  791. "error": str(e),
  792. "device": device,
  793. "events":done,
  794. "traceback":trace,
  795. 'html':src
  796. }
  797. headers = {'content-type': 'application/json'}
  798. # Keen Stuff goes
  799. done = []
  800. def markingPeriod(username, password, url, period, dbID,gpaBool):
  801. classNames = []
  802. classGrade = []
  803. frmat = []
  804. classes = []
  805. work = []
  806. sendBack = {
  807. 'current_run':period,
  808. 'classes':{},
  809. 'status':''
  810. }
  811. global g_src
  812. url = url.lower().replace('account/logon?returnurl=/homeaccess','').replace('account/logon?returnurl=/homeaccess/','')
  813. if 'https://' not in url:
  814. if 'http://' not in url:
  815. url = 'http://'+url
  816. print(url.find('/homeaccess'))
  817. pos = url.find('/homeaccess')
  818. if pos > 7:
  819. url = url[:pos+11]
  820. print(url)
  821.  
  822. session = requests.Session()
  823. if dbID is None:
  824. dbID = getdbID(session,url)
  825. a = session.post(
  826. url +'/Account/LogOn?Database='+ dbID + '&LogOnDetails.UserName='+username+'&LogOnDetails.Password='+password, verify= False)
  827. logIn = BeautifulSoup(a.text, 'html.parser')
  828. if logIn.find(class_='sg-button sg-logon-button') is None or logIn.find(id='hac-nav-menu') is not None:
  829. c = session.get(url + '/Content/Student/Assignments.aspx')
  830. mrk = BeautifulSoup(c.text,"html.parser")
  831. g_src = c.text
  832. viewState = mrk.find(id='__VIEWSTATE')['value']
  833. eventVal = mrk.find(id='__EVENTVALIDATION')['value']
  834. eventTarget = 'ctl00$plnMain$btnRefreshView'
  835.  
  836. values = {
  837. '__EVENTTARGET':eventTarget,
  838. '__EVENTARGUMENT':'',
  839. '__VIEWSTATE':viewState,
  840. '__EVENTVALIDATION':eventVal,
  841. 'ctl00$plnMain$ddlReportCardRuns': str(period)
  842. }
  843. b = session.post(
  844. url +'/Content/Student/Assignments.aspx', verify= True,headers={"Content-Type":"application/x-www-form-urlencoded"}, data=values)
  845.  
  846. assignments(session,sendBack,url,classNames,classGrade,work,frmat,classes,b)
  847. if gpaBool:
  848. a = session.get(url + '/Content/Student/Transcript.aspx')
  849. gpa(sendBack,a)
  850. print("stuff", classGrade,classNames,frmat)
  851. else:
  852. sendBack['status'] = 'failed'
  853. g_src =''
  854. return json.dumps(sendBack)
  855.  
  856.  
  857.  
  858. if __name__ == "__main__":
  859. #f = open('test.json','w')
  860. out = userexists(username="", password="", url="", dbID=None)
  861. print(out)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement