利用Python实现校园网自动登录(部署在树莓派)
项目场景:
在实验室的时候,每天的第一个苦恼就是面对不自动弹窗的校园网登录,且一个账号仅支持两个设备。
实验室使用了路由器,多个设备使用同一个账号上网,但是校园网又增加了新的防治手段——不定时监察mac地址,一旦发现多个设备使用,账号就会封禁十分钟,导致我们随时面临突然断网的局面,不得不一遍遍的重新登录。
于是,我想也许可以用脚本实现校园网网页自动登录,并随时检查掉网情况,掉网后立刻自动切换账号,这样三个账号就足以支持实验室十三个人的设备使用了。最终代码部署在树莓派上,二十四小时运行中~
解决方案:
我们选择用Python代码实现,主要使用request库。
网页自动登录
为了实现自动登录,我们先尝试找到校园网登陆认证的方式,进入浏览器的开发者工具页面(按键盘 F12 进入),使用Network进行一次嗅探。
勾选Preserve log,输入学号密码,点击连接看看会发生什么。
账号登录成功后,可以看见出现了日志文件,其中第一条是InterFace.do?method=login,可以确定这与我们登录事件相关。
点击InterFace.do?method=login查看详情,看见Headers数据中注明了Request Method为POST,于是需要用到post请求,我们记下这里URL很重要。
将URL写入代码:
import requests
import os
import time
se = requests.Session()
url = 'http://aaa.cqust.edu/eportal/InterFace.do?method=login'
接着我们复制下Request Headers里的内容,作为post请求中的headers
headers = {
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Connection': 'keep-alive',
'Content-Length': '691',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Cookie': 'EPORTAL_COOKIE_OPERATORPWD=; EPORTAL_AUTO_LAND=; EPORTAL_COOKIE_USERNAME=; EPORTAL_COOKIE_PASSWORD=; EPORTAL_COOKIE_SERVER=; EPORTAL_COOKIE_SERVER_NAME=; EPORTAL_COOKIE_DOMAIN=; EPORTAL_COOKIE_SAVEPASSWORD=false; EPORTAL_USER_GROUP=%E5%AD%A6%E7%94%9F%E7%94%A8%E6%88%B7%E7%BB%84; JSESSIONID=1CB3A057D3F6148CE60211697127F211',
'Host': 'aaa.cqust.edu',
'Origin': 'http://aaa.cqust.edu',
'Referer': 'http://aaa.cqust.edu/eportal/index.jsp?wlanuserip=b08a505e4edcf1de4f8d6def9300c813&wlanacname=fb99a169a691df67bf3dfe91e74c64e0&ssid=&nasip=f580e0fe31542da59fd3d5169d1170d2&snmpagentip=&mac=52d64b6ffe66f664589982b889188f08&t=wireless-v2&url=8766fb8b39ca7a8c9d2d32580b0e86c3418fca276674bcd1&apmac=&nasid=fb99a169a691df67bf3dfe91e74c64e0&vid=389c39dd8d6ff719&port=b310883cc19dee12&nasportid=5ebaebec10e8f9d5008b93f3a4e115691464686918b8e78eec758e130264eccbc78f57f55c1b1828',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36'
}
接着我们查看Payload数据,可以看见我们的学号和密码明文出现在这里,
我们复制下Form Data里的内容,作为post请求中的data
data = {
"userId": "*****", # 填入你自己的学号
"password": "*****", # 填入你自己的密码
"service": "%E4%BA%92%E8%81%94%E7%BD%91",
"queryString": "wlanuserip%3D70add5ad03acb6bea3fbb9b4f89eaf87%26wlanacname%3Dfb99a169a691df67bf3dfe91e74c64e0%26ssid%3D%26nasip%3Df580e0fe31542da59fd3d5169d1170d2%26snmpagentip%3D%26mac%3Df267ac2c5ac13186ca4b89b43264cf83%26t%3Dwireless-v2%26url%3D8766fb8b39ca7a8c9d2d32580b0e86c3418fca276674bcd1%26apmac%3D%26nasid%3Dfb99a169a691df67bf3dfe91e74c64e0%26vid%3D0078d882ca634259%26port%3Dabdb062e34878ee0%26nasportid%3D5ebaebec10e8f9d5008b93f3a4e115699ccba3f613d6144229ea6a57aadb75b2f6f4e45cac13c61b",
"operatorUserId": "",
"validcode": "",
"passwordEncrypt": "false"
}
加上post请求:
content = se.post(url, data=data, headers=headers)
print(content.text
到此自动登录的脚本已经大功告成了,附上自动网页登录的完整代码:
import requests
se = requests.Session()
url = 'http://aaa.cqust.edu/eportal/InterFace.do?method=login'
headers = {
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Connection': 'keep-alive',
'Content-Length': '691',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Cookie': 'EPORTAL_COOKIE_OPERATORPWD=; EPORTAL_AUTO_LAND=; EPORTAL_COOKIE_USERNAME=; EPORTAL_COOKIE_PASSWORD=; EPORTAL_COOKIE_SERVER=; EPORTAL_COOKIE_SERVER_NAME=; EPORTAL_COOKIE_DOMAIN=; EPORTAL_COOKIE_SAVEPASSWORD=false; EPORTAL_USER_GROUP=%E5%AD%A6%E7%94%9F%E7%94%A8%E6%88%B7%E7%BB%84; JSESSIONID=1CB3A057D3F6148CE60211697127F211',
'Host': 'aaa.cqust.edu',
'Origin': 'http://aaa.cqust.edu',
'Referer': 'http://aaa.cqust.edu/eportal/index.jsp?wlanuserip=b08a505e4edcf1de4f8d6def9300c813&wlanacname=fb99a169a691df67bf3dfe91e74c64e0&ssid=&nasip=f580e0fe31542da59fd3d5169d1170d2&snmpagentip=&mac=52d64b6ffe66f664589982b889188f08&t=wireless-v2&url=8766fb8b39ca7a8c9d2d32580b0e86c3418fca276674bcd1&apmac=&nasid=fb99a169a691df67bf3dfe91e74c64e0&vid=389c39dd8d6ff719&port=b310883cc19dee12&nasportid=5ebaebec10e8f9d5008b93f3a4e115691464686918b8e78eec758e130264eccbc78f57f55c1b1828',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36'
}
data = {
"userId": "202222222", # 填入你自己的学号
"password": "202222222", # 填入你自己的密码
"service": "%E4%BA%92%E8%81%94%E7%BD%91",
"queryString": "wlanuserip%3D70add5ad03acb6bea3fbb9b4f89eaf87%26wlanacname%3Dfb99a169a691df67bf3dfe91e74c64e0%26ssid%3D%26nasip%3Df580e0fe31542da59fd3d5169d1170d2%26snmpagentip%3D%26mac%3Df267ac2c5ac13186ca4b89b43264cf83%26t%3Dwireless-v2%26url%3D8766fb8b39ca7a8c9d2d32580b0e86c3418fca276674bcd1%26apmac%3D%26nasid%3Dfb99a169a691df67bf3dfe91e74c64e0%26vid%3D0078d882ca634259%26port%3Dabdb062e34878ee0%26nasportid%3D5ebaebec10e8f9d5008b93f3a4e115699ccba3f613d6144229ea6a57aadb75b2f6f4e45cac13c61b",
"operatorUserId": "",
"validcode": "",
"passwordEncrypt": "false"
}
content = se.post(url, data=data, headers=headers)
print(content.text)
自动换号重连
首先为了检测当前联网情况,我们需要使用ping百度的ip地址来查看,如果网络不通就换账号重连,
附上我们的主函数,其中data1,data2,data3分别是三位用户的账号:
def autowifi():
global url
global headers
global person
global data1
global data2
global data3
datas = [data1, data2, data3]
while (True):
result = os.system(u"ping baidu -c 5 -W 1")
if result != 0:
for data in datas:
content = se.post(url, data=data, headers=headers)
if content.json().get('result') == 'success':
print("online")
break
print("wait 30s")
time.sleep(30)
最后将三个用户的data填入即可,附上完整代码,供大家使用~
import requests
import os
import time
se = requests.Session()
url = 'http://aaa.cqust.edu/eportal/InterFace.do?method=login'
data1 = {
"userId": "202222222", # 填入data1的学号
"password": "202222222", # 填入data1密码
"service": "%E4%BA%92%E8%81%94%E7%BD%91",
"queryString": "wlanuserip%3D70add5ad03acb6bea3fbb9b4f89eaf87%26wlanacname%3Dfb99a169a691df67bf3dfe91e74c64e0%26ssid%3D%26nasip%3Df580e0fe31542da59fd3d5169d1170d2%26snmpagentip%3D%26mac%3Df267ac2c5ac13186ca4b89b43264cf83%26t%3Dwireless-v2%26url%3D8766fb8b39ca7a8c9d2d32580b0e86c3418fca276674bcd1%26apmac%3D%26nasid%3Dfb99a169a691df67bf3dfe91e74c64e0%26vid%3D0078d882ca634259%26port%3Dabdb062e34878ee0%26nasportid%3D5ebaebec10e8f9d5008b93f3a4e115699ccba3f613d6144229ea6a57aadb75b2f6f4e45cac13c61b",
"operatorUserId": "",
"validcode": "",
"passwordEncrypt": "false"
}
data2 = {
"userId": "202222222", # 填入data2的学号
"password": "202222222", # 填入data2的密码
"service": "%E4%BA%92%E8%81%94%E7%BD%91",
"queryString": "wlanuserip%3D70add5ad03acb6bea3fbb9b4f89eaf87%26wlanacname%3Dfb99a169a691df67bf3dfe91e74c64e0%26ssid%3D%26nasip%3Df580e0fe31542da59fd3d5169d1170d2%26snmpagentip%3D%26mac%3Df267ac2c5ac13186ca4b89b43264cf83%26t%3Dwireless-v2%26url%3D8766fb8b39ca7a8c9d2d32580b0e86c3418fca276674bcd1%26apmac%3D%26nasid%3Dfb99a169a691df67bf3dfe91e74c64e0%26vid%3D0078d882ca634259%26port%3Dabdb062e34878ee0%26nasportid%3D5ebaebec10e8f9d5008b93f3a4e115699ccba3f613d6144229ea6a57aadb75b2f6f4e45cac13c61b",
"operatorUserId": "",
"validcode": "",
"passwordEncrypt": "false"
}
data3 = {
"userId": "202222222", # 填入data3的学号
"password": "202222222", # 填入data3的密码
"service": "%E4%BA%92%E8%81%94%E7%BD%91",
"queryString": "wlanuserip%3D70add5ad03acb6bea3fbb9b4f89eaf87%26wlanacname%3Dfb99a169a691df67bf3dfe91e74c64e0%26ssid%3D%26nasip%3Df580e0fe31542da59fd3d5169d1170d2%26snmpagentip%3D%26mac%3Df267ac2c5ac13186ca4b89b43264cf83%26t%3Dwireless-v2%26url%3D8766fb8b39ca7a8c9d2d32580b0e86c3418fca276674bcd1%26apmac%3D%26nasid%3Dfb99a169a691df67bf3dfe91e74c64e0%26vid%3D0078d882ca634259%26port%3Dabdb062e34878ee0%26nasportid%3D5ebaebec10e8f9d5008b93f3a4e115699ccba3f613d6144229ea6a57aadb75b2f6f4e45cac13c61b",
"operatorUserId": "",
"validcode": "",
"passwordEncrypt": "false"
}
headers = {
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Connection': 'keep-alive',
'Content-Length': '691',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Cookie': 'EPORTAL_COOKIE_OPERATORPWD=; EPORTAL_AUTO_LAND=; EPORTAL_COOKIE_USERNAME=; EPORTAL_COOKIE_PASSWORD=; EPORTAL_COOKIE_SERVER=; EPORTAL_COOKIE_SERVER_NAME=; EPORTAL_COOKIE_DOMAIN=; EPORTAL_COOKIE_SAVEPASSWORD=false; EPORTAL_USER_GROUP=%E5%AD%A6%E7%94%9F%E7%94%A8%E6%88%B7%E7%BB%84; JSESSIONID=1CB3A057D3F6148CE60211697127F211',
'Host': 'aaa.cqust.edu',
'Origin': 'http://aaa.cqust.edu',
'Referer': 'http://aaa.cqust.edu/eportal/index.jsp?wlanuserip=b08a505e4edcf1de4f8d6def9300c813&wlanacname=fb99a169a691df67bf3dfe91e74c64e0&ssid=&nasip=f580e0fe31542da59fd3d5169d1170d2&snmpagentip=&mac=52d64b6ffe66f664589982b889188f08&t=wireless-v2&url=8766fb8b39ca7a8c9d2d32580b0e86c3418fca276674bcd1&apmac=&nasid=fb99a169a691df67bf3dfe91e74c64e0&vid=389c39dd8d6ff719&port=b310883cc19dee12&nasportid=5ebaebec10e8f9d5008b93f3a4e115691464686918b8e78eec758e130264eccbc78f57f55c1b1828',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36'
}
def autowifi():
global url
global headers
global person
global data1
global data2
global data3
datas = [data1, data2, data3]
while (True):
result = os.system(u"ping baidu -c 5 -W 1")
if result != 0:
for data in datas:
content = se.post(url, data=data, headers=headers)
if content.json().get('result') == 'success':
print("online")
break
print("wait 30s")
time.sleep(30)
autowifi()
树莓派
最后我们将代码部署在树莓派上,通过一根网线连接路由器,实现了实验室所有设备的网络覆盖,二十四小时运行~
更多推荐
利用Python实现校园网自动登录(部署在树莓派)
发布评论