临近考试周,要经常查资料,而山东大学软件园校区的无线网QLSC_STU总是每隔十几分钟就会断一次,于是就用python写了个自动重连的小程序。
python3.6
pycharm2107.1.3
提交的form data:
Client IP 是接入无线网后分配的客户端ip
StartTime:登录时间,登录的那一刻的时间戳,这个时间戳是13位的,精确到了毫秒
username:学号
password:密码
登陆的时候只要把form data 使用requests包的post方法传到http ://192.168.8.10/portal/login.jsp?Flag=0就可以了
获取ip是第一步,也是唯一有难度的一步,执行cmd命令ipconfig,可以看到无线局域网适配器中的IPv4地址正是我们需要的ip地址,将其取出即可。
然后设置一个循环检测时间,如果检测到断网就进行自动重连
# coding=utf-8
import requests
import time
import os
import subprocess
import re
class Reconnect:
# 初始化
def __init__(self):
# 检测间隔时间,单位为秒
self.every = 10
# 获取当前时间戳,13位
def getNowTime(self):
return str(int(time.time())) + "000"
# 获取ip
def get_ipconfig_ip(self):
ipconfig_result_list = os.popen('ipconfig').readlines() # 执行cmd命令ipconfig,并将结果存于ipconfig_result_list
for i in range(0, len(ipconfig_result_list)): # 逐行查找
if re.search(r'无线局域网适配器 WLAN', ipconfig_result_list[i]) != None:
for j in range(1, 8):
if re.search(r"IPv4 地址", ipconfig_result_list[i + j]) != None:
match_ip = re.search(r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}', ipconfig_result_list[i + j]).group(
0) # 由正则表达式获取ip地址
return match_ip
return None
# 模拟登录
def login(self):
print(self.getCurrentTime(), u"拼命连网中...")
url = "http://192.168.8.10/portal/login.jsp?Flag=0"
# 消息头
headers = {
'Host': "192.168.8.10",
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36",
'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
'Accept-Language': "zh-CN,zh;q=0.8",
'Accept-Encoding': "gzip, deflate",
'Referer': "http://192.168.8.10/portal/index_default.jsp?Language=Chinese",
'Upgrade - Insecure - Requests': '1',
'Cache - Control': 'max - age = 0',
'Connection': "keep-alive",
'Origin': 'http://192.168.8.10',
'Content-Type': "application/x-www-form-urlencoded",
'Content-Length': '360'
}
self.ip=self.get_ipconfig_ip()
# 提交的信息
data = {
'Language': 'Chinese',
'ClientIP': self.ip,
'timeoutvalue': '45',
'heartbeat': '240',
'fastwebornot': False,
'StartTime': self.getNowTime(),
'username': '201400210073',
'password': '',#输入密码
'shkOvertime': '720',
'strOldPrivateIP': self.ip,
'strOldPublicIP': self.ip,
'strPrivateIP': self.ip,
'PublicIP': self.ip,
'iIPCONFIG':0,
'sHttpPrefix': 'http://192.168.8.10'
}
try:
r = requests.post(url, headers=headers, data=data)
print(r.text)
print(self.ip)
print(self.getCurrentTime(), u'连上了...现在开始看连接是否正常')
except:
print("连接失败")
def canConnect(self):
fnull = open(os.devnull, 'w')
result = subprocess.call('ping www.baidu.com', shell=True, stdout=fnull, stderr=fnull)
fnull.close()
if result:
return False
else:
return True
# 获取当前时间
def getCurrentTime(self):
return time.strftime('[%Y-%m-%d %H:%M:%S]', time.localtime(time.time()))
# 主函数
def main(self):
print(self.getCurrentTime(), u"Hi,欢迎使用自动登陆系统")
while True:
self.login()
while True:
can_connect = self.canConnect()
if not can_connect:
print(self.getCurrentTime(), u"断网了...")
self.login()
else:
print(self.getCurrentTime(), u"一切正常...")
time.sleep(self.every)
time.sleep(self.every)
reconnect = Reconnect()
reconnect.main()