Python实现校园网断开自动重连
背景
最近实验室服务器的校园网总是掉线,严重影响服务器的使用。网络上有基于锐捷客户端实现的MentoHUST工具,该工具可以在电脑上直接连接校园网正常实现自动重连,但是通过连接路由器转发网络时无法验证服务器。同样还有基于软路由实现的openwrt,但是这需要一台闲置的电脑作为软路由系统。因此特地基于校园网模拟登录写了一个实现校园网自动重连的Python脚本。
登录页面
通过分析发现校园网登录页面下,主要包含用户名、密码两个输入框已经登录连接按钮。通过分析源码,我们发现在输入密码前,真实密码输入框id="pwd"
是隐藏的,需要鼠标点击id="pwd_tip"
输入框后真实密码输入框才会显示出来。
<!--> 用户名输入框 <-->
<input class="input_tip" name="username_tip" id="username_tip" readonly="readonly" value="用户名"
style="font-size: 16px; color: rgba(0, 0, 0, 0.54); border: none; display: block;">
<!--> 密码输入前需点击该输入框 <-->
<input class="input_tip" name="pwd_tip" id="pwd_tip" readonly="readonly" value="密码"
style="font-size: 16px; color: rgba(0, 0, 0, 0.54); border: none; display: block;">
<!--> 密码输入框 <-->
<input name="pwd" class="input" id="pwd" type="password"
style="border: none; display: none; float: left; width: 240px;"
tabindex="0" tipinfo="Password" value="">
<!--> 登录按钮 <-->
<div id="loginLink_div"></div>
编写代码
思路: 每隔10分钟ping一次百度,如果无法ping通则自动重新认证校园网。
-
配置log文件
import logging logging.basicConfig(filename='./network_reconnect.log', level=logging.INFO, # 定义输出log的类型 format='%(asctime)s %(filename)s : %(levelname)s %(message)s', # 定义输出log的格式 datefmt='%Y-%m-%d %A %H:%M:%S', filemode='w')
-
Ping网络判断当前网络是否可以上网(百度+校园网)
def ping_network(self, ip_or_domain): """ Input: ip_or_domain, ip地址或者域名 return: True or False, 网络连通性, True表示网络可连通 """ ping_cmd = 'ping %s -n 1' % ip_or_domain backinfo = subprocess.call(ping_cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) # 0: 网络可连通, 1: 网络不可达 ret = True if backinfo == 0 else False return ret
-
重新连接校园网(采用webdriver+chromedriver模拟登录:首先下载chromedriver驱动,解压后将chromedriver.exe放在主程序文件夹下)
import time from selenium import webdriver from selenium.webdriver.chrome.options import Options def reconnect_network(self): campus_network_url = "http://192.168.50.3:8080/" # 校园网登录页面 chromedriver = "./chromedriver.exe" # chromedriver.exe文件所在位置 os.environ["webdriver.chrome.driver"] = chromedriver options = Options() # 取消DevTools listening on ws://127.0.0.1...提示 options.add_experimental_option('excludeSwitches', ['enable-logging']) options.add_argument("--headless") # 以无窗口模式运行chromedriver程序 browser = webdriver.Chrome(chromedriver, options=options) # 模拟打开浏览器 browser.get(campus_network_url) # 打开校园网登录页面 browser.find_element_by_id("username").send_keys(self.userId) # 输入账号 time.sleep(1) browser.find_element_by_id("pwd_tip").click() # 点击登录显示隐藏密码输入框 time.sleep(1) browser.find_element_by_id("pwd").send_keys(self.password) # 输入密码 time.sleep(1) browser.find_element_by_id("loginLink_div").click() # 点击连接按钮 time.sleep(2) reconnect_res = browser.title == "登录成功" browser.quit() return reconnect_res
-
每十分钟判断一次
def __call__(self): self.run_loop() # 第一次执行 # 十分钟后判断是否需要重连 schedule.every(10).minutes.do(self.run_loop) while True: schedule.run_pending()
-
循环判断主程序
def run_loop(self): ping_baidu = 'www.baidu.com' # 百 度 ping_campus = '192.168.50.3' # 校园网 if self.ping_network(ping_baidu): print("校园网连接正常.") # logging.info("校园网连接正常") else: print("校园网未登录, 尝试重连中...") logging.info("校园网未登录, 尝试重连中...") if self.ping_network(ping_campus): reconnect_res = self.reconnect_network() if reconnect_res and self.ping_network(ping_baidu): print("校园网已使用账户%s重新登录." % self.userId) logging.info("校园网已使用账户%s重新登录." % self.userId) else: print("校园网未登录成功, 请检查账号密码是否输入正确!") print("您输入的用户名是: %s 密码: %s" % (self.userId, self.password)) logging.info("校园网未登录成功, 请检查账号密码是否输入正确!") else: print("无法访问校园网登录页面, 请检查是否连接网络!")
完整源码
Github: https://github.com/kanchenhao/auto-reconnet-campus-network
Windows bat脚本命令
每次需要运行python命令,比较麻烦,所以写了自动运行的Windows bat脚本。切换到connect_campus_network.py文件目录下(我的目录为E:\CampusNetwork
),并运行python脚本:
::auto_connet_network.bat
start cmd /k "echo Check campus network connection:&&cd /d E:\CampusNetwork&&python connect_campus_network.py"