Skip to content

Instantly share code, notes, and snippets.

@splitline
Created October 3, 2017 17:38
Show Gist options
  • Save splitline/b4bab66a08eac96762dea45e4d53bbfb to your computer and use it in GitHub Desktop.
Save splitline/b4bab66a08eac96762dea45e4d53bbfb to your computer and use it in GitHub Desktop.
# -*- 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