Linux服务器登录校园网方法——使用python3,selenium,chromium,chromium-driver。

写在前面:

        大约两个月以前,我入手了一块Linux开发板,香橙派;板子刚到手,很开心,又有新玩具了;但是怎么让这玩意儿登录上校园网,属实让我头疼了,我在网上找到了通过wget发送数据包的方法来登录校园网,但是个方法在我的学校行不通;于是我去找“校园网管理中心”的人对线,得到的却是“你不会开热点吗?”这个及其下头的回答。。。。。。

        所以,我觉定自己动手,丰衣足食。

        我选择了一个比较“笨”的做法,其实现原理基本和正常登录网页靠手点和键盘输入一样,虽然短时间的性能开销是比较大的,但是经过我一个多月的使用,没有出过问题,其可靠性还是比较高的。

接下来,我们统一一下软件:

1.系统:Debian,我是用的是Debian,Linux系统大差不差。

2.网络管理软件是:Network Manager

sudo apt install network-manager

3.Python3pip:不会有人Linux上不装python吧?

Debian & Ubuntu

sudo apt update
sudo apt install python3 pip

如果下载慢,请自行搜索linux换源

4.selenium:Python插件,用于控制浏览器

pip install selenium

如果下载慢,请自行搜索pip换源

5.chromiumchromium-driver

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 = "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-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自动化,可以直接忽略这个部分。

写在最后:

本人并没有专心学过Python,老师教的Python知识也是非常基础的,完全不够写这个脚本用,所以,我是现学现做的这个Python脚本,如果有什么代码上的问题,欢迎直接喷我;JHC用的校园网管理系统是深澜,如果你有更好的登录校园网的方法,也欢迎直接砸我脸上。

补充:

我发现日志写入(文件读写),在函数内似乎没有产生效果,原来是在有返回值(或者以return结束)的函数内没有生效,也就是那块内存在返回时就被“释放”了,这。。。。。。

你可能感兴趣的:(Linux学习,python,selenium,网络)