写在前面:
大约两个月以前,我入手了一块Linux开发板,香橙派;板子刚到手,很开心,又有新玩具了;但是怎么让这玩意儿登录上校园网,属实让我头疼了,我在网上找到了通过wget发送数据包的方法来登录校园网,但是个方法在我的学校行不通;于是我去找“校园网管理中心”的人对线,得到的却是“你不会开热点吗?”这个及其下头的回答。。。。。。
所以,我觉定自己动手,丰衣足食。
我选择了一个比较“笨”的做法,其实现原理基本和正常登录网页靠手点和键盘输入一样,虽然短时间的性能开销是比较大的,但是经过我一个多月的使用,没有出过问题,其可靠性还是比较高的。
接下来,我们统一一下软件:
1.系统:Debian,我是用的是Debian,Linux系统大差不差。
2.网络管理软件是:Network Manager
sudo apt install network-manager
3.Python3和pip:不会有人Linux上不装python吧?
Debian & Ubuntu:
sudo apt updatesudo apt install python3 pip
如果下载慢,请自行搜索linux换源
4.selenium:Python插件,用于控制浏览器
pip install selenium
如果下载慢,请自行搜索pip换源
5.chromium和chromium-driver:
sudo apt install chromium chromium-driver
软件要求就是这些。
Python脚本:
直接上代码:
import osimport timeimport datetimefrom selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.select import Selectfrom selenium.webdriver.chrome.options import Options# 使用系统命令写入日志时间os.system("date >> /root/Mylogs/Services.log")# 打开日志文件log = open("/root/Mylogs/Services.log", 'a')# 设置chrome参数option = Options()option.add_argument('--headless')option.add_argument('--disable-gpu')option.add_argument('--no-sandbox')# 获取当前时间ntime = datetime.datetime.now()# 校园网登录URLLoginPageUrl = "http://10.51.3.40/srun_portal_pc?ac_id=2&theme=basic1"# 网络运营商 "@cmcc":移动 "@cuc":联通 "@dianxin":电信 "@jifang":机房 "@studentfree":爱心免费网络 "@teacher":办公NetType = "@cmcc"# 账号account = "202110701530011"# 密码password = "233332"# ConnectTest 通过nmcli命令返回值,获取有没有连接校园网def CntTest() : return os.system('nmcli dev | grep "JHC-WLAN"')# Ping测试获取有无网络def PingTest() : return os.system("ping -c 2 -w 3 baidu.com") # 要求两个数据包,限时3秒# 连接 JHC-WLANdef CntWifi() : # 日志写入 “校园WiFi没有连接,连接校园网” log.write("Connecting JHC-WLANn") # 使用系统命令连接校园网 os.system("nmcli device wifi connect JHC-WLAN password 12345678")# 登录这个愚蠢的校园网def LoginSBXYW() : # 日志写入 “校园网没有登录,登录校园网” log.write("Logging into SBXYWn") # 打开登录校园网界面 driver = webdriver.Chrome(options=option) driver.get(LoginPageUrl) time.sleep(5) # 输入账号 driver.find_element(By.XPATH, '//*[@id="username"]').send_keys(account) # 下拉框选择 “移动” elem = driver.find_element(By.XPATH, '//*[@id="domain"]') Select(elem).select_by_value(NetType) # 输入密码 driver.find_element(By.XPATH, '//*[@id="password"]').send_keys(password) # 点击登录 driver.find_element(By.XPATH, '//*[@id="login-account"]').click() # 给浏览器时间反应一会儿 time.sleep(2)# TryConnectNet 尝试连接网络def tryCntNet() : # 如果没有连接校园WiFi if CntTest() != 0 : # 日志写入 “校园WiFi未连接” log.write("JHC-WLAN not connectedn") # 连接校园WiFi CntWifi() # 如果已经连接校园WiFi之后依然没网络,则尝试登录校园网 if PingTest() != 0 : # 日志写入 “SB校园网没有登录” log.write("SBXYW not loggedn") # 登录SB校园网 LoginSBXYW() # 说明已经有网络了,直接返回 int 0 else : return 0 # 校园WiFi已经连接,尝试登录校园网 else : LoginSBXYW() # 返回Ping测试值 return PingTest()if __name__ == '__main__' : # 在早上6点开始,执行网络检测 if ntime.hour >= 6 : # 用于存储尝试连接网络的返回值 rtword_fromTry = 0 # 如果Ping测试没有通过,说明没有网络 if PingTest() != 0 : # 日志写入 “Ping测试没有通过” log.write("PingTest NOT PASSn") # 尝试连接网络并存入返回值 rtword_fromTry = tryCntNet() else : # 有网 log.write("PingTest OKayn") # 如果尝试连接网络的返回值不为0,说明网络连接失败,写入日志之后退出程序 if rtword_fromTry != 0 : # 联网失败 log.write("Failedn") # 如果不是早上6点,晚安~ else : log.write("Nighty night~~~n")# 关闭日志log.close()
本Python脚本的注释就算是讲解,登录的校园网是以JHC为例的,脚本的部分内容因学校而异,JHC的同学在软件相同的情况下几乎可以照搬,非JHC的同学,注意修改LoginSBXYW()中通过XPATH找到对应网页元素,并操作数据的代码,关于如何通过XPATH找到对应网页元素,很简单的,自己网上找一下吧。。。。。。代码里的时间判断和日志写入,主要用于crontab自动化,可以直接忽略这个部分。
写在最后:
本人并没有专心学过Python,老师教的Python知识也是非常基础的,完全不够写这个脚本用,所以,我是现学现做的这个Python脚本,如果有什么代码上的问题,欢迎直接喷我;JHC用的校园网管理系统是深澜,如果你有更好的登录校园网的方法,也欢迎直接砸我脸上。
补充:
我发现日志写入(文件读写),在函数内似乎没有产生效果,原来是在有返回值(或者以return结束)的函数内没有生效,也就是那块内存在返回时就被“释放”了,这。。。。。。