写在前面:
使用非图形化的Linux发行版登录校园网,属实有点让人头疼的,我在网上找到了通过wget发送数据包的方法来登录校园网,但是个方法在我的学校行不通,我学校的校园网不支持发送数据包来登录的,于是我去找“校园网管理中心”的人对线,得到的却是“你不会开热点吗?”这个及其下头的回答。。。。。。
所以,我觉定自己动手,丰衣足食。
我选择了一个比较“蠢笨”的做法,其实现原理基本和正常登录网页靠手点和键盘输入一样,虽然短时间的性能开销是比较大的,但是经过我一段时间的使用,没有出过问题,其可靠性还是比较高的。
接下来,我们统一一下软件:
1.系统:Debian11,我是用的是Debian,Linux系统大差不差。
2.网络管理软件是:Network Manager
如果你本来就是这个管理软件,那就不用下面的命令进行安装了。
哦对咯,这边还是建议你连一下热点来下载软件。。。。。。
Debian & Ubuntu 命令:
sudo apt install network-manager
3.Python3和pip:不会有人Linux上不装python吧?
Debian & Ubuntu 命令:
sudo apt update
sudo apt install python3 pip
如果下载慢,请自行搜索 "linux换源"
4.selenium:Python插件,用于控制浏览器
pip install selenium
如果下载慢,请自行搜索 "pip换源"
5.chromium和chromium-driver:
Debian & Ubuntu 命令:
sudo apt install chromium chromium-driver
软件要求就是这些。
Python脚本:
直接上代码:
import os
import time
import datetime
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
from 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()
# 校园网登录URL
LoginPageUrl = "http://10.51.3.40/srun_portal_pc?ac_id=2&theme=basic1"
# 网络运营商 "@cmcc":移动 "@cuc":联通 "@dianxin":电信 "@jifang":机房 "@studentfree":爱心免费网络 "@teacher":办公
NetType = "@cmcc"
# 账号
account = "你的账号"
# 密码
password = "你的密码"
# 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-WLAN
def CntWifi() :
# 校园WiFi没有连接,日志写入 “连接校园网”
log.write("Connecting JHC-WLAN\n")
# 使用系统命令连接校园网
os.system("nmcli device wifi connect JHC-WLAN password 12345678")
# 登录这个愚蠢的校园网
def LoginSBXYW() :
# 日志写入 “校园网没有登录,登录校园网”
log.write("Logging into SBXYW\n")
# 打开登录校园网界面
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 connected\n")
# 连接校园WiFi
CntWifi()
# 如果已经连接校园WiFi之后依然没网络,则尝试登录校园网
if PingTest() != 0 :
# 日志写入 “SB校园网没有登录”
log.write("SBXYW not logged\n")
# 登录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 PASS\n")
# 尝试连接网络并存入返回值
rtword_fromTry = tryCntNet()
else :
# 有网
log.write("PingTest OKay\n")
# 如果尝试连接网络的返回值不为0,说明网络连接失败,写入日志之后退出程序
if rtword_fromTry != 0 :
# 联网失败
log.write("Failed\n")
# 如果不是早上6点,晚安~
else :
log.write("Nighty night~~~\n")
# 关闭日志
log.close()
Python脚本的注释就算是讲解,登录的校园网是以JHC为例的,脚本的部分内容因学校而异,JHC的同学在软件相同的情况下几乎可以照搬,非JHC的同学,注意修改LoginSBXYW()中通过XPATH找到对应网页元素,并操作数据的代码,关于如何通过XPATH找到对应网页元素,很简单的,自己网上找一下吧。。。。。。代码里的时间判断和日志写入,主要用于crontab自动化,可以直接忽略这个部分。
还有,需要注意的是如果你给你的Linux安装Network Manager,可能会和原来的网络管理软件冲突,这个需要注意,但我个人觉得这个软件是比较好用的。
写在最后:
本人并没有专心学过Python,老师教的Python知识也是非常基础的,完全不够写这个脚本用,所以,我是现学现做的这个Python脚本,如果有什么代码上的问题,可以直接喷我;JHC用的校园网管理系统是深澜,如果你有更好的登录校园网的方法,也欢迎直接砸我脸上。文章来源:https://www.toymoban.com/news/detail-768758.html
补充:
我发现日志写入(文件读写),在函数内似乎没有产生效果,原来是在有返回值(或者以return结束)的函数内没有生效,也就是那块内存在返回时就被“释放”了,这。。。。。。需要注意哈。文章来源地址https://www.toymoban.com/news/detail-768758.html
到了这里,关于非图形化Linux发行版登录校园网方法——使用python3,selenium,chromium,chromium-driver。的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!