Last active
March 5, 2021 10:50
-
-
Save InJeCTrL/3b1052f83371cfd81e56bbe5924cb698 to your computer and use it in GitHub Desktop.
北邮研究生自动选课
This file contains 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
import bs4 | |
import requests | |
import time | |
import random | |
def login(username, password): | |
header_prelogin = { | |
"Host": "auth.bupt.edu.cn", | |
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0", | |
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", | |
"Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2", | |
"Accept-Encoding": "gzip, deflate, br", | |
"Connection": "keep-alive" | |
} | |
url_login = "https://auth.bupt.edu.cn/authserver/login?service=http%3A%2F%2Fmy.bupt.edu.cn%2Flogin.portal" | |
with requests.get(url_login, headers = header_prelogin) as response: | |
str_loginpage = response.text | |
cookie_JSessionID = response.headers["Set-Cookie"] | |
cookie_JSessionID = cookie_JSessionID[:cookie_JSessionID.index(";")] | |
page_login = bs4.BeautifulSoup(str_loginpage, "html.parser") | |
lt = page_login.find("input", attrs = {"name": "lt"}).get("value") | |
execution = page_login.find("input", attrs = {"name": "execution"}).get("value") | |
_eventId = page_login.find("input", attrs = {"name": "_eventId"}).get("value") | |
rmShown = page_login.find("input", attrs = {"name": "rmShown"}).get("value") | |
payload = { | |
"username": str(username), | |
"password": str(password), | |
"lt": lt, | |
"execution": execution, | |
"_eventId": _eventId, | |
"rmShown": rmShown | |
} | |
header_login = { | |
"Host": "auth.bupt.edu.cn", | |
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0", | |
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", | |
"Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2", | |
"Accept-Encoding": "gzip, deflate, br", | |
"Content-Type": "application/x-www-form-urlencoded", | |
"Connection": "keep-alive", | |
"Referer": url_login, | |
"Cache-Control": "no-cache", | |
"Cookie": cookie_JSessionID | |
} | |
with requests.post(url_login, data = payload, headers = header_login, allow_redirects = False) as response: | |
str_ret = response.text | |
# 200: wrong password | |
# 302: right password | |
if str_ret.find("用户名或者密码有误") != -1: | |
flag_login = False | |
cookie_ASP = "" | |
else: | |
flag_login = True | |
cookie_CASTGC = response.headers["Set-Cookie"] | |
cookie_CASTGC = cookie_CASTGC[cookie_CASTGC.index("CASTGC="):] | |
cookie_CASTGC = cookie_CASTGC[:cookie_CASTGC.index(";")] | |
if flag_login: | |
header_yjxt = { | |
"Host": "auth.bupt.edu.cn", | |
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0", | |
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", | |
"Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2", | |
"Accept-Encoding": "gzip, deflate, br", | |
"Connection": "keep-alive", | |
"Referer": "http://my.bupt.edu.cn/index.portal", | |
"Cookie": cookie_JSessionID + "; " + cookie_CASTGC + ";" | |
} | |
url_yjxtLogin = "http://auth.bupt.edu.cn/authserver/login?service=http%3a%2f%2fyjxt.bupt.edu.cn%2fULogin.aspx" | |
with requests.get(url_yjxtLogin, headers = header_yjxt, allow_redirects = False) as response: | |
url_ULogin = response.headers["Location"] | |
header_ULogin = { | |
"Host": "yjxt.bupt.edu.cn", | |
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0", | |
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", | |
"Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2", | |
"Accept-Encoding": "gzip, deflate, br", | |
"Connection": "keep-alive", | |
"Referer": "http://my.bupt.edu.cn/index.portal", | |
} | |
with requests.get(url_ULogin, headers = header_ULogin, allow_redirects = False) as response: | |
cookie_ASP = response.headers["Set-Cookie"] | |
cookie_ASP = cookie_ASP[:cookie_ASP.index(";")] | |
return [flag_login, cookie_ASP] | |
def getCourseListPage(cookie_ASP): | |
url_ChooseSystem = "http://yjxt.bupt.edu.cn/Gstudent/Default.aspx" | |
header = { | |
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", | |
"Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2", | |
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko", | |
"Referer": "http://my.bupt.edu.cn/index.portal", | |
"Accept-Encoding": "gzip, deflate", | |
"Connection": "keep-alive", | |
"Cookie": cookie_ASP | |
} | |
""" dont select server randomly by reading server list | |
with requests.get(url_enter, headers = header) as response: | |
str_ret = response.text | |
page_enter = bs4.BeautifulSoup(str_ret, "html.parser") | |
tail = page_enter.find("a").get("href")[2:] | |
url_selectserver = "http://yjxt.bupt.edu.cn" + tail | |
with requests.get(url_selectserver, headers = header) as response: | |
str_selectserver = response.text | |
page_selectserver = bs4.BeautifulSoup(str_selectserver, "html.parser") | |
list_server = page_selectserver.find_all("a") | |
i_select = random.randint(0, len(list_server) - 1) | |
url_server = list_server[i_select].get("href") | |
url_course = url_server[:url_server.index("/Signin")] + "/PlanCourseOnlineSel.aspx" | |
url_coursesel = url_server[:url_server.index("/Lesson")] + "/Gstudent/Course/PlanSelClass.aspx" | |
""" | |
for i_server in range(4): | |
url_SelectCourse = "http://10.3.255.3" + str(i_server) + "/Lesson/PlanCourseOnlineSel.aspx" | |
url_SelectClass = "http://10.3.255.3" + str(i_server) + "/Gstudent/Course/PlanSelClass.aspx" | |
with requests.get(url_SelectCourse, headers = header) as response: | |
str_courselist = response.text | |
if str_courselist.find("ReLogin.aspx") != -1: | |
flag = False | |
page_courselist = "" | |
else: | |
flag = True | |
page_courselist = bs4.BeautifulSoup(str_courselist, 'html.parser') | |
break | |
return [flag, page_courselist, url_SelectClass] | |
def selectCourse(page_courselist, cookie_ASP, url_SelectClass, list_course): | |
header_ClassList = { | |
"Accept-Language": "zh-CN", | |
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko", | |
"Accept-Encoding": "gzip, deflate", | |
"Connection": "Keep-Alive", | |
"Pragma": "no-cache", | |
"Host": "yjxt.bupt.edu.cn", | |
"Cookie": cookie_ASP | |
} | |
header_ChooseClass = { | |
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0", | |
"Accept": "*/*", | |
"Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2", | |
"Accept-Encoding": "gzip, deflate", | |
"X-Requested-With": "XMLHttpRequest", | |
"X-MicrosoftAjax": "Delta=true", | |
"Cache-Control": "no-cache", | |
"Content-Type": "application/x-www-form-urlencoded; charset=utf-8", | |
"Connection": "keep-alive", | |
"Referer": "", | |
"Cookie": cookie_ASP | |
} | |
list_result = [] | |
for trTag in page_courselist.find_all('tr'): | |
list_td = trTag.find_all("td") | |
if len(list_td) == 11 and list_td[7].get_text().replace(" ", "").replace("\n", "") == "选择上课班级": | |
coursename = list_td[1].get_text().replace(" ", "").replace("\n", "").replace("\r", "") | |
if coursename in list_course: | |
# print("\n%s" % coursename) | |
payload = list_td[7].find("a").get("onclick") | |
payload = payload[10:-14] | |
url_course = url_SelectClass + payload | |
with requests.get(url_course, headers = header_ClassList) as response: | |
str_course = response.text | |
page_course = bs4.BeautifulSoup(str_course, 'html.parser') | |
for trTag in page_course.find_all('tr'): | |
list_td = trTag.find_all("td") | |
if len(list_td) in [6, 7]: | |
str_partctl00 = list_td[len(list_td) - 1].find("input").get("name") | |
ctl00 = str_partctl00[:str_partctl00.index("$dgData")] + \ | |
"$UpdatePanel2|ctl00$contentParent" + \ | |
str_partctl00[str_partctl00.index("$dgData"):] | |
__VIEWSTATE = page_course.find("input", attrs = {"name": "__VIEWSTATE"}).get("value") | |
__VIEWSTATEGENERATOR = page_course.find("input", attrs = {"name": "__VIEWSTATEGENERATOR"}).get("value") | |
__EVENTVALIDATION = page_course.find("input", attrs = {"name": "__EVENTVALIDATION"}).get("value") | |
payload = { | |
"ctl00$ScriptManager1": ctl00, | |
"__EVENTTARGET": "", | |
"__EVENTARGUMENT": "", | |
"__LASTFOCUS": "", | |
"__VIEWSTATE": __VIEWSTATE, | |
"__VIEWSTATEGENERATOR": __VIEWSTATEGENERATOR, | |
"__VIEWSTATEENCRYPTED": "", | |
"__EVENTVALIDATION": __EVENTVALIDATION, | |
"ctl00$contentParent$drpXqu$drpXqu": "", | |
"__ASYNCPOST": "true", | |
str_partctl00 + ".x": random.randint(1,15), | |
str_partctl00 + ".y": random.randint(1,15) | |
} | |
header_ChooseClass["Referer"] = url_course | |
with requests.post(url_course, headers = header_ChooseClass, data = payload) as response: | |
str_sel = response.text | |
if str_sel.find("上课时间冲突") != -1: | |
list_result.append({"result": False, | |
"course": coursename, | |
"class": list_td[2].get_text().replace(" ", "").replace("\n", "").replace("\r", "") if len(list_td) == 7 else list_td[1].get_text().replace(" ", "").replace("\n", "").replace("\r", "")}) | |
else: | |
list_result.append({"result": True, | |
"course": coursename, | |
"class": list_td[2].get_text().replace(" ", "").replace("\n", "").replace("\r", "") if len(list_td) == 7 else list_td[1].get_text().replace(" ", "").replace("\n", "").replace("\r", "")}) | |
break | |
return list_result | |
def go(username, password, list_course): | |
while True: | |
flag_login, cookie = login(username, password) | |
if flag_login: | |
while True: | |
print("\rcheck %d" % (time.time()), end = "") | |
flag_page, page, url_sel = getCourseListPage(cookie) | |
if not flag_page: | |
print("\nbad request") | |
break | |
list_result = selectCourse(page, cookie, url_sel, list_course) | |
for result in list_result: | |
print("\n%s" % result["class"]) | |
if result["result"]: | |
print("OK") | |
list_course.remove(result["course"]) | |
else: | |
print("Fail") | |
else: | |
print("login failed!") | |
break | |
username = "2020xxxxxx" | |
password = "xxxxxxxx" | |
list_course = ["自然辩证法概论", "面向对象技术与C++编程"] | |
go(username, password, list_course) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment