起因
由于校园网采用网页端认证方式,自从宿舍里放上树莓派,每天都需要手动连接键盘鼠标显示器来让pi登陆。为了更方便的摸鱼,决定写一个自动登录校园网的脚本,每天在树莓派上定时运行。
分析
校园网登陆采用锐捷的解决方案,应该是国内大学使用率比较高的一个系统。首先考虑使用python Selenium写一个自动化脚本,几经尝试,总是无法成功提交表单。同时考虑selenium依赖于浏览器驱动,不具有普适性,所以放弃这一方法。在使用Chrome的网络调试工具对登陆过程进行抓包后,发现该系统将用户输入在前端输入的表单POST到后端,而且没有加密(?所以决定用python requests库模拟该过程。
第一次尝试,将请求体内的载荷写成一个字典data,使用requests.post
方法提交到抓包得到的login URL上,结果失败。分析是因为没有携带请求头,导致认证服务器发现端倪。
第二次尝试,将请求头写成一个字典,与data一并提交,依旧失败。检查后发现操作失误导致两次登陆使用了不同的Referer,认证服务器识别到这一点,返回失败值。
最后一次,纠正了headers和data两个字典中不匹配的内容,再次post,返回success。
实现
抓包
使用Chrome抓取登陆按钮点击后日志中的/InterFace.do?method=login
内容,查看URL,请求头和请求体(载荷)
python代码
import requests
url='http://www.example.com/eportal/InterFace.do?method=login' #在此处替换抓包得到的登陆报文URL
#<------将抓包得到的headers内容填写到键值对中------>
headers={
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9',
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36',
'Cache-Control':'no-cache',
'Connection':'keep-alive',
'Content-Length':'', #填写抓包得到的值
'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8',
'Cookie': '', #填写抓包得到的cookie
'Host':'', #填写抓包得到的host
'Origin':'', #填写抓包得到的origin
'Pragma':'no-cache',
'Referer':'' #填写抓包得到的referer
}
#<------headers结束------>
#<------将抓包得到的载荷内容填写到键值对中------>
data={
'userId':'', #填写抓包得到的userId
'password':'', #填写抓包得到的password
'service':'', #填写抓包得到的service
'queryString':'',
'operatorPwd':'',
'operatorUserId':'',
'validcode':'',
'passwordEncrypt':'false' #填写抓包得到的passwordEncrypt
}
#<------载荷结束------>
respond = requests.post(url=url, data=data, headers=headers) #调用requests的post方法请求URL
#输出必要的信息,响应正文中出现success代表登陆成功
print(data)
print('状态码:', respond.status_code)
print('响应头信息:', respond.headers)
print('响应正文:', respond.text)
使用抓包内容替代上述代码中的内容,如有冲突以抓包结果为准。
优化
之后就是让代码在Linux里开机自动执行,不想写具体方法了(摆!
以上思路适用于iOS和macOS的快捷指令,不想写具体方法了(摆!
以上
Comments | 2 条评论
博主 misaka10201
虽然但是,**联通🤬😇
博主 Astrophel
@misaka10201 乐