起因

由于校园网采用网页端认证方式,自从宿舍里放上树莓派,每天都需要手动连接键盘鼠标显示器来让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的快捷指令,不想写具体方法了(摆!

以上


“好久不见,Handler One”