目录
一、抓包检查请求信息
进入教务系统首先随便输一个号进行抓包,发现default2.axps包是使用post请求
在该文件下找到标头和负载信息
_VIEWSTATE:
txtUserName:学号信息
TextBox2:账号密码
txtSecretCode:验证码
RadioButtonList1:身份信息
Button1:
lbLanguage:
hidPdrs:
hidsc:
二、过程
准备获取cookies和_VIEWSTATE值做请求标头和负载的数据
构建post的提交表单和请求头
打印print(response.text)会得到返回的登陆成功的网络源码
三、总结
标头的构建
cookies获取
验证码识别
模拟提交数据
一、抓包检查请求信息
进入教务系统首先随便输一个号进行抓包,发现default2.axps包是使用post请求
需要注意的是,这个文件有两份,一个是get请求,一个是post请求。
post请求的文件需要你提交登录一下才会出现,你可以随便输入一个错误账号密码和验证码去登录刷新获得这个文件。
在该文件下找到标头和负载信息
_VIEWSTATE:
是在网页源代码中可以找到它的值vavle
txtUserName:学号信息
TextBox2:账号密码
txtSecretCode:验证码
RadioButtonList1:身份信息
Button1:
lbLanguage:
hidPdrs:
hidsc:
二、过程
准备获取cookies和_VIEWSTATE值做请求标头和负载的数据
import requests
import re
'''创建session环境'''
session = requests.session()
'''初次登录获取viewstste和cookies'''
url = '教务系统url'
r = session.get(url)
'''用正则表达式获取viewstste'''
viewstste = re.findall('<input type="hidden" name="__VIEWSTATE" value="(.*?)" />', r.text)
'''获取cookies值'''
'''获取cookies函数'''
def get_cookies(url,session):
cookies_1 = requests.utils.dict_from_cookiejar(session.cookies)#此处是从session中获取cookies,由于返回值是一个集合形式,所以在下方需要用字符串拼接方式获得完整的cookies
cookies = 'ASP.NET_SessionId=' + cookies_1['ASP.NET_SessionId']
print('自定义函数cookies:',cookies)#打印一下检查是否有问题
return cookies
cookies = get_cookies(url, session)
通过抓包可以得知checkcode.aspx是验证码获取的包,正方教务系统的验证码是随机的,点开该包的url会发现验证码会变化,跟显示的不一样,且每一次点击所显示的验证码都不同,所以获取验证码且保证验证码可以正常使用,该请求的cookie就要与提交的表单的cookies要统一
构建headers,将抓的包checkcode.aspx的请求标头复制下来
'''创建请求头'''
checkcode_headers={
'Accept': 'image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
'Connection': 'keep-alive',
'Cookie': cookies, #上方获取的cookies值
'Host': '根据实际情况获取',
'Referer': '根据实际情况获取',
'User-Agent': '根据实际情况获取'
}
这篇文章有介绍,可以阅读一下,此处只用了部分代码解决需求
from ddddocr import DdddOcr
'''创建ddddocr环境获取验证码'''
ocr = DdddOcr() #创建环境
checkcode_url = 'http://根据实际情况填写此行/CheckCode.aspx'
img = session.get(checkcode_url, headers=checkcode_headers)#发起请求获得验证码的图片
checkcode = ocr.classification(img.content)#识别验证码
构建post的提交表单和请求头
该post请求可以在
找到。
xh='你的教务系统账号'
pw='你的密码'
'''发起post请求初次登录'''
log = {
'__VIEWSTATE': viewstste[0],#viewstste为列表,此处需要值,则需要提取出第一个元素
'txtUserName': xh,
'TextBox2': pw,
'txtSecretCode': checkcode,
'RadioButtonList1': '%D1%A7%C9%FA',#身份的编码,此处编码意思为学生
'Button1': '',
'lbLanguage': '' ,
'hidPdrs': '',
'hidsc': '',
}
headers_post = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
'Cache-Control': 'max-age=0',
'Connection': 'keep-alive',
'Content-Length': '192',
'Content-Type': 'application/x-www-form-urlencoded',
'Cookie': cookies,
'Host': '根据实际情况填写',
'Origin': '根据实际情况填写',
'Referer': 'http://根据实际情况填写/default2.aspx',
'Upgrade-Insecure-Requests': '1',
'User-Agent': '根据实际情况填写'
}
post_url = 'http://根据实际情况填写/default2.aspx'
response = session.post(post_url, data=log, headers=headers_post)
打印print(response.text)会得到返回的登陆成功的网络源码
此时就已经模拟登录成功了
三、总结
标头的构建
cookies获取
验证码识别
模拟提交数据