记一次用python编写自动化连接校园网
事情的起因是这样的,这不到月底了流量用完了,花钱买又太贵了,但是在寝室手机没网络简直就是度日如年,正当我准备割肉买个流量包时,室友告诉我校园网不用购买校园卡也能用了,只是用7到8分钟需要切换服务,不然会没网,我心想这不来活了嘛。附校园网切换服务图:
我的思路是用python的requests模块进行post发包切换服务,然后使用一些代码进行网路联通判断,理论存在实践开始:
1,首先使用抓包工具burp抓取校园网认证包(左边是请求包右边是响应包这个包里包含博主本人的学号所以进行打码。):
分析请求包发现serviceName=%E4%B8%AD%E5%9B%BD%E7%94%B5%E4%BF%A1
对%E4%B8%AD%E5%9B%BD%E7%94%B5%E4%BF%A1进行url解码发现对应的便是上面切换服务的服务器名称,接下来使用python编写认证代码:
下面展示一些 内联代码片
。
import requests
import time
import os
import urllib3
#c是服务器下标
c = 0
#创建一个数组cc里面保存4个服务器名称
cc = ['%E4%B8%AD%E5%9B%BD%E7%94%B5%E4%BF%A1','%E4%B8%AD%E5%9B%BD%E8%81%94%E9%80%9A','%E4%B8%AD%E5%9B%BD%E7%A7%BB%E5%8A%A8','%E6%A0%A1%E5%86%85%E7%BD%91']
url = "http://10.100.1.27/eportal/InterFace.do?method=switchService"
headers = {
'User-Agent':'',
'Content-Type':'',
'Referer':'',
'Cookie':''
}
#使用循环认证
while True:
#一共4个服务器所以不能超过4个
if c==4:
c=0
data = {
'userIndex':'',
'serviceName':cc[c]
}
#进行认证
a = requests.post(url=url,headers=headers,data=data)
#返回响应包
print(a.text)
#进行第一次判断连通性,使用ping百度的方法
output = os.popen("ping www.baidu.com -n 1")
aa = output.read()
#判断是否丢包即是否连通
if aa.find('丢失 = 0') == -1:
print(str(c)+'ping失败')
#如果没有连通则此服务器不可用,服务器下标加1并跳出此次循环
c = c+1
continue
#进行第二次判断连通,使用记录下载一个图片所使用时间的方法:
#记录下载开始时间
start = time.time()
try:
#进行下载
aaa = requests.get('https://image.baidu.com/search/down?tn=download&word=download&ie=utf8&fr=detail&url=https%3A%2F%2Fgimg2.baidu.com%2Fimage_search%2Fsrc%3Dhttp%253A%252F%252Fsafe-img.xhscdn.com%252Fbw1%252Fcd1c311e-1a4f-4de9-b5e7-1b3fe8a7404d%253FimageView2%252F2%252Fw%252F1080%252Fformat%252Fjpg%26refer%3Dhttp%253A%252F%252Fsafe-img.xhscdn.com%26app%3D2002%26size%3Df9999%2C10000%26q%3Da80%26n%3D0%26g%3D0n%26fmt%3Dauto%3Fsec%3D1703785905%26t%3D43aa13a402dfe8896f3ff96cac5d2b00&thumburl=https%3A%2F%2Fimg1.baidu.com%2Fit%2Fu%3D1029371842%2C1989189904%26fm%3D253%26fmt%3Dauto%26app%3D138%26f%3DJPEG%3Fw%3D667%26h%3D500',timeout=(1, 1.5),stream=True)
#下面四条except是在下载途中会产生的错误,如果产生错误就说明无网络连通或超时等等,所以只要报错就退出此次循环并服务器下标加1
except requests.exceptions.ReadTimeout:
print(str('a')+'失败')
c = c+1
continue
except urllib3.exceptions.ReadTimeoutError:
print(str('b')+'失败')
c = c+1
continue
except AssertionError:
print(str('c')+'失败')
c = c+1
continue
except requests.exceptions.ConnectionError:
print(str('d')+'失败')
c = c+1
continue
#记录下载结束时间
end = time.time()
#两者一减得出下载时间
bbb = end - start
if 'aaa' not in globals():
print('无数据失败')
c = c+1
continue
#博主实测下载速度必须小于1秒左右要不然网络速度很满
#进行判断下载时间是否小于一秒,如果不则服务器下标加1,退出此次循环
if bbb>=1:
print(str(c)+'时间失败')
c = c+1
continue
print(str(c)+'成功,进行10秒待机')
#print(aaa.text)
print(bbb)
#os.system
#如果通过上述所有测试,就说明此服务器可用,则等待10秒后重新对此服务器进行测试
time.sleep(10)
最后也是可以一直上网了。