Created
October 3, 2017 17:38
-
-
Save splitline/b4bab66a08eac96762dea45e4d53bbfb to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
from __future__ import unicode_literals | |
from django.shortcuts import render | |
from django.http import JsonResponse, HttpResponse | |
import requests | |
from requests_toolbelt import SSLAdapter | |
from OpenSSL import SSL | |
from subprocess import check_output | |
import shutil | |
import tempfile | |
import re | |
from bs4 import BeautifulSoup | |
import json | |
from data.models import Courses | |
from requests.packages.urllib3.exceptions import InsecureRequestWarning | |
from django.views.decorators.csrf import csrf_exempt | |
requests.packages.urllib3.disable_warnings(InsecureRequestWarning) | |
req = requests.Session() | |
req.mount('https://', SSLAdapter('TLSv1')) | |
@csrf_exempt | |
def login(request): | |
if request.method!="POST": | |
return HttpResponse("Wtf r u doing, QQ") | |
data = json.loads(request.body) | |
retry = True | |
while retry: | |
vcode = req.get('https://stu255.ntust.edu.tw/ntust_stu/VCode.aspx',verify=False, stream=True) | |
cookie = vcode.cookies | |
tf = tempfile.NamedTemporaryFile() | |
with open(tf.name, 'rb+') as image_file: | |
a = shutil.copyfileobj(vcode.raw, image_file) | |
code = check_output(["tesseract", tf.name, "stdout","--user-patterns", "./user-pattern.txt", "quiet"]).decode("utf-8").strip() | |
code = re.sub(r'([^A-Z0-9])',"", code) | |
header = { | |
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:55.0) Gecko/20100101 Firefox/55.0', | |
} | |
payload = { | |
'__EVENTTARGET': '', | |
'__EVENTARGUMENT': '', | |
'__VIEWSTATE': 'dDw2OTg5NDEwODI7dDw7bDxpPDE+Oz47bDx0PDtsPGk8NTc+O2k8NTk+O2k8NjE+O2k8OTE+O2k8OTM+O2k8OTU+O2k8OTc+Oz47bDx0PHA8cDxsPFRleHQ7Rm9yZUNvbG9yO18hU0I7QmFja0NvbG9yOz47bDzpgbjoqrLmnJ/plpPvvIzns7vntbHlj6/og73mnIPlm6DkuIrnt5rkurrmlbjpgY7lpJrvvIzlj43mh4nmmYLplpPmnIPorormhaLvvIzoq4vlkITkvY3lkIzlrbjlj6/ku6XlpJroqablub7mrKHmiJbnqI3lvozlho3nmbvlhaXns7vntbHvvIzpgLLooYzpgbjoqrLjgII7MjxXaGl0ZT47aTwxMj47MjxSZWQ+Oz4+Oz47Oz47dDxwPHA8bDxUZXh0O0ZvcmVDb2xvcjtfIVNCO0JhY2tDb2xvcjs+O2w855uu5YmN6YG46Kqy5Lq65pW46LaF6YGO5Yqg6YCA6YG45Lq65pW46ZmQ5Yi25Y6f5Zug4oaS5Y6f5ZugMTrns7vkuIrmiJboqrLli5nntYToqK3lrprvvJvljp/lm6Dkuow66IiK55Sf5pa85q2j5byP6YG46Kqy5Lq65pW45LiN6Kit6ZmQ5pmC6YG45LiK44CCOzI8V2hpdGU+O2k8MTI+OzI8Qmx1ZT47Pj47Pjs7Pjt0PHA8cDxsPFRleHQ7PjtsPFvpgbjoqrLkuYvlgpnoqLvoi6XmnInpmaTvvLjppJjvvLnnmoToqqrmmI7vvIzkv4LmjIflrbjomZ/lvozlhannorzpmaTvvLjppJjvvLnjgIJdOz4+Oz47Oz47dDxwPHA8bDxUZXh0Oz47bDzjgIDngI/opr3lmajjgIDvvJpOZXRzY2FwZeOAgDUuMDs+Pjs+Ozs+O3Q8cDxwPGw8VGV4dDs+O2w844CASVDjgIDjgIDjgIDvvJoxNDAuMTEyLjIzOC4yMTYoaXAyMzgtMjE2LndpZmkuY2MubnR1LmVkdS50dyk7Pj47Pjs7Pjt0PHA8cDxsPFRleHQ7PjtsPOOAgOeZu+WFpeaZgumWk++8mjIwMTcvOS8xMyDkuIvljYggMDU6NTg6MjE7Pj47Pjs7Pjt0PHA8cDxsPFRleHQ7PjtsPOOAgOaTjeS9nOW5s+WPsO+8mlVua25vd247Pj47Pjs7Pjs+Pjs+Pjs+Uw0u1IgLHvIvzJlbCmFz1tD28YQ=', | |
'__VIEWSTATEGENERATOR': '7D63B901', | |
'studentno': data['studentno'], | |
'idcard': data['idcard'], | |
'birthday': data['birthday'], | |
'password': data['password'], | |
'code_box': code, | |
'Button1': "" | |
} | |
login_page = req.post('https://stu255.ntust.edu.tw/ntust_stu/stu.aspx',headers=header,cookies=cookie,data=payload,verify=False) | |
soup = BeautifulSoup(login_page.text, 'html.parser') | |
error_msg_re = re.search(r"alert\('([^)]+)'\)",login_page.text) | |
logininfo = { | |
"Success":True, | |
"Message":"登入成功!", | |
"Student":{ | |
"StuName": "", | |
"StuInfo": "" | |
} | |
} | |
if error_msg_re: | |
if "檢核碼" in error_msg_re.group(1): | |
continue | |
else: | |
retry = False | |
logininfo['Success']=False | |
logininfo['Message']="登入失敗!\n"+(error_msg_re.group(1)) | |
if data['studentno'] not in login_page.text: | |
logininfo['Success']=False | |
logininfo['Message']="登入失敗!" | |
if logininfo['Success']: | |
retry = False | |
logininfo['Student']['StuName'] = (soup.find('span', id="studentname").text) | |
logininfo['Student']['StuInfo'] = (soup.find('span', id="studentno").text) + "・" + (soup.find('span', id="educode").text).strip() | |
# return HttpResponse(login_page.text) | |
return JsonResponse(logininfo) | |
def schedule(request): | |
header = { | |
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:55.0) Gecko/20100101 Firefox/55.0', | |
} | |
payload = { | |
'__EVENTTARGET': '', | |
'__EVENTARGUMENT': '', | |
'__VIEWSTATE': 'dDw5MTQ3MDA5NTE7dDw7bDxpPDE+Oz47bDx0PDtsPGk8Mz47aTw1PjtpPDc+O2k8OT47aTw2MD47PjtsPHQ8cDxwPGw8VGV4dDs+O2w85pel5pyf77yaMTA25bm0MTDmnIgy5pelOz4+Oz47Oz47dDxwPHA8bDxUZXh0Oz47bDxCMTA1MzAwMjc7Pj47Pjs7Pjt0PHA8cDxsPFRleHQ7PjtsPOm7g+W/l+S7gTs+Pjs+Ozs+O3Q8cDxwPGw8VGV4dDs+O2w85Zub6LOH5bel5LqM55SyICAgICAgICAgIDs+Pjs+Ozs+O3Q8cDxwPGw8VGV4dDtCYWNrQ29sb3I7Rm9yZUNvbG9yO18hU0I7PjtsPDEwNSDlrbjlubTluqYgMiDlrbjmnJ8g5bCO5bir54K677ya5rKI5Lit5a6J6ICB5bir44CB5pu+5aCv5a6j6ICB5birXDxiclw+MTA2IOWtuOW5tOW6piAxIOWtuOacnyDlsI7luKvngrrvvJrprpHoiIjlnIvogIHluKtcPGJyXD47MjxZZWxsb3c+OzI8Qmx1ZT47aTwxMj47Pj47Pjs7Pjs+Pjs+Pjs+RonNXg4y4zX5Pd9O8nDTCBR0eos=', | |
'__VIEWSTATEGENERATOR': '772D720D', | |
'Button19': "" | |
} | |
schedule_page = req.post('https://stu255.ntust.edu.tw/ntust_stu/stu_menu.aspx',headers=header,data=payload,verify=False) | |
courses_list = {'courses':[]} | |
if "目前選課內容:" in schedule_page.text: | |
soup = BeautifulSoup(schedule_page.text,'html.parser') | |
html_course_list = soup.find(id="Table7") | |
for course_id in html_course_list.find_all('tr'): | |
course_obj = Courses.objects.get(course_id=course_id.td.string.strip()) | |
course = { | |
"semester": course_obj.semester, | |
"course_id": course_obj.course_id, | |
"ge_type": course_obj.ge_type, | |
"name": course_obj.name, | |
"outline_link": course_obj.outline_link, | |
"credit": course_obj.credit, | |
"required_subject": course_obj.required_subject, | |
"lecturer": course_obj.lecturer, | |
"classroom": course_obj.classroom, | |
"periods": json.loads(course_obj.periods) | |
} | |
courses_list['courses'].append(course) | |
print(json.dumps(courses_list)) | |
return JsonResponse(courses_list, safe=False) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment