前言
之前一直尝试实现模拟登陆广工统一认证系统,但是都未能取得成功。最近在同学的帮助下,终于实现了这一目标。
一直失败的原因:URL的错误选择
错误URL:http://authserver.gdut.edu.cn/authserver/loginservice=http%3A%2F%2Fjxfw.gdut.edu.cn%2Fnew%2FssoLogin
正确的URL(可以从html里得到):
http://authserver.gdut.edu.cn/authserver/login;
cookie
?service=http%3A%2F%2Fjxfw.gdut.edu.cn%2Fnew%2FssoLogin
疑惑
我把cookie放在headers里面,无法登陆。而只有放在URL里才能正常登陆,确实让我很疑惑。
代码
"""
author victory
date 2020/1/12
"""
import http
import re
import ssl
from http import cookiejar
from urllib import request, parse
from urllib.request import HTTPCookieProcessor
# 取消全局证书,这一步必须,教务系统升级后出现的问题
ssl._create_default_https_context = ssl._create_unverified_context
# 相当于CookieStore,用于管理cookie
cj = http.cookiejar.MozillaCookieJar()
pc = HTTPCookieProcessor(cj) # cookie处理器
opener = request.build_opener(pc) # 创建URL打开器
res = opener.open(
'http://authserver.gdut.edu.cn/authserver/login?service=http%3A%2F%2Fjxfw.gdut.edu.cn%2Fnew%2FssoLogin')
res_str = res.read().decode()
# 抓取登陆链接
login_str = re.findall('/authserver/login;.+\?service=http%3A%2F%2Fjxfw.gdut.edu.cn%2Fnew%2FssoLogin', res_str)[0]
# 抓取表单数据之一
lt = re.findall('<input type="hidden" name="lt" value=".+"/>', res_str)
lt = re.findall('value=".+"', lt[0])
lt = lt[0][7:len(lt[0]) - 1]
# cookie 已经在链接里面了,所以不需要把cookie放在headers里,
# 否则无法登陆,
# 原因未知
'''
for e in cj:
print(e)
headers = {
'Cookie': e.name + '=' + e.value,
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4003.0 Safari/537.36 Edg/81.0.381.0'
}
print(headers)
'''
# 表单数据
data = {
'username': 'xxxxx',
'password': 'xxx',
'dllt': 'userNamePasswordLogin',
'execution': 'e1s1',
'_eventId': 'submit',
'rmShown': '1',
'lt': lt
}
# 登陆链接
login_url = 'http://authserver.gdut.edu.cn' + login_str
req = request.Request(login_url,
data=parse.urlencode(data).encode()
)
res = opener.open(req)
# 这里要注意,一共有3个cookie,
# 因为登陆行为发生了3次重定向,
# 只需要取教务系统的cookie即可,
# 这里是最后一个
for e in cj:
headers = {
'Cookie': e.name + '=' + e.value
}
# 抓取成绩
req = request.Request(
'https://jxfw.gdut.edu.cn/xskccjxx!getDataList.action?xnxqdm=201901&page=1&rows=50&sort=xnxqdm&order=asc',
headers=headers
)
res = opener.open(req)
print(res.read().decode())