Skip to content

Instantly share code, notes, and snippets.

@InJeCTrL
Last active March 5, 2021 10:50
Show Gist options
  • Save InJeCTrL/3b1052f83371cfd81e56bbe5924cb698 to your computer and use it in GitHub Desktop.
Save InJeCTrL/3b1052f83371cfd81e56bbe5924cb698 to your computer and use it in GitHub Desktop.
北邮研究生自动选课
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 = "http://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 getCourseEntrance(cookie_ASP):
try:
url_LeftMenu = "http://yjxt.bupt.edu.cn/Gstudent/leftmenu.aspx"
header = {
"Host": "yjxt.bupt.edu.cn",
"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; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0",
"Referer": "http://yjxt.bupt.edu.cn/Gstudent/Default.aspx",
"Accept-Encoding": "gzip, deflate",
"Connection": "keep-alive",
"Cookie": cookie_ASP + "; DropDownListXqu=1; DropDownListYx_xsbh="
}
with requests.get(url_LeftMenu, headers = header) as response:
text_yjxt = response.text
pattern_start = "t:'课程网上选课管理',url:'"
url_SelectCourse = "http://yjxt.bupt.edu.cn/Gstudent/" + text_yjxt[text_yjxt.index(pattern_start) + len(pattern_start):]
pattern_end = "',"
url_SelectCourse = url_SelectCourse[:url_SelectCourse.index(pattern_end)]
return url_SelectCourse
except:
return ""
def getCourseListPage(cookie_ASP, url_entrance):
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://yjxt.bupt.edu.cn/Gstudent/leftmenu.aspx",
"Accept-Encoding": "gzip, deflate",
"Connection": "keep-alive",
"Cookie": cookie_ASP + "; OnlineSelXQ=36; DropDownListXqu=1; DropDownListYx_xsbh="
}
with requests.get(url_entrance, 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')
return [flag, page_courselist, url_entrance]
def selectCourse(page_courselist, cookie_ASP, url_SelectClass, list_course, list_class):
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 + "; OnlineSelXQ=36; DropDownListXqu=1; DropDownListYx_xsbh="
}
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",
"Origin": "http://yjxt.bupt.edu.cn",
"Referer": "",
"Cookie": cookie_ASP + "; OnlineSelXQ=36; DropDownListXqu=1; DropDownListYx_xsbh="
}
list_result = []
for trTag in page_courselist.find_all('tr'):
list_td = trTag.find_all("td")
if len(list_td) == 10 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 = "http://yjxt.bupt.edu.cn/Gstudent/Course/PlanSelClass.aspx" + 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]:
# classname = list_td[-5].text.replace(" ", "").replace("\n", "").replace("\r", "")
# if classname not in list_class:
# continue
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
print(str_sel)
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, list_class):
while True:
flag_login, cookie = login(username, password)
if flag_login:
while True:
print("\rcheck %d" % (time.time()), end = "")
url_entrance = getCourseEntrance(cookie)
if url_entrance == "":
break
flag_page, page, url_sel = getCourseListPage(cookie, url_entrance)
if not flag_page:
print("\nbad request")
break
list_result = selectCourse(page, cookie, url_sel, list_course, list_class)
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 = []
list_class = []
go(username, password, list_course, list_class)
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