[TOC]
一、前言
马上放寒假了,放假在家可能也会需要用到实验室的电脑,但是使用校园网每一到两天会自动断,所以想着写一个脚本来自动连接校园网。
目前仅实现windows(windows11)以及ubuntu系统(ubuntu20.04)
二、必要准备
浏览器:chrome-google
需要安装chromedriver.exe(windows),或者chromedriver(ubuntu)
下载地址:https://googlechromelabs.github.io/chrome-for-testing/ (120版本及以上)
CNPM Binaries Mirror (npmmirror.com)(较低版本)
查看版本方法:在浏览器地址栏输入:chrome://version/
三、校园网必要信息获取
大部分高校的校园网连接以get或者post方式连接,他们都是http请求方法。本文以河海大学校园网为基础,河海大学校园网为post方式。更多的想要了解它们有什么不同可以看这里。
河海大学校园网网页(未登录):
河海大学校园网网页(已登录):
我们需要获取一些登录界面的关键字用于代码自动连接时去检测,可以在登录界面按F12,以获取登录名为例,我们可以按途中方式获取username,其余每一个方框信息获取方式类似。
四、代码编写
有了校园网的信息,我们就可以开始写代码了。
4.1、判断不同平台
if platform.system().lower() == "linux":
service = Service(executable_path="ubuntu下载的chromedriver绝对地址")
else:
service = Service(executable_path="windows下载的chromedriver.exe绝对地址")
4.2、创建浏览器设置
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_options.add_argument('--ignore-certificate-errors-spki-list')
chrome_options.add_argument('--ignore-certificate-errors')
chrome_options.add_argument('--ignore-ssl-errors')
# 创建浏览器
driver = webdriver.Chrome(service=service, options=chrome_options)
# 设置窗口大小
driver.set_window_size(1920, 1080)
其中
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
这里的三行在windows下可以不加,但我的ubuntu不加会报错。
selenium.common.exceptions.SessionNotCreatedException: Message: session not created: Chrome failed to start: exited normally.
(session not created: DevToolsActivePort file doesn't exist)
(The process started from chrome location /opt/google/chrome/chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
4.3.判断是否连接网络
try: # 判断当前的页面中是否是已经登录的界面,如果有找到tologout证明已经登录了
driver.implicitly_wait(5)
driver.find_element(By.XPATH, "//*[@id='toLogOut']")
print("find tologout!")
4.4.未连接
except NoSuchElementException:
print("开始连接学校网络……")
# 下面的id信息可以在源码中找到,账户、密码
driver.implicitly_wait(5)
username_input = driver.find_element(By.XPATH, "//*[@id='username']")
password_input = driver.find_element(By.XPATH, "//*[@id='pwd']")
# 选择网络服务选项
select_service = driver.find_element(By.XPATH, "//*[@id='selectDisname']")
# _service_0:校园网(Campus NET)
# _service_1:中国移动(CMCC NET)
# _service_2:中国电信-常州(CTCC NET-CZ)
# _service_3: 中国联通-常州(CUCC NET-CZ)
services = driver.find_element(By.XPATH, "//*[@id='_service_1']")
# 这个地方,有些学校可能不一样,有的就是loginLink,需要仔细查看
login_button = driver.find_element(By.XPATH, "//*[@id='loginLink_div']")
print("网页加载完毕")
# # 传入相关参数,密码、账户、输入框需单击激活后才可输入↓,id名称上述方法同理
username_input.send_keys(username)
driver.find_element(By.XPATH, "//*[@id='pwd_tip']").click()
password_input.send_keys(password)
select_service.click()
services.click()
login_button.click()
print("连接成功")
# driver.close()
这里面的”//*[@id=’loginLink_div’]”用于定位打开的浏览器窗口中的各个部分。本质上这种方式还是模仿了一个浏览器的操作。
4.5.已连接
else:
print("已登录")
# f = input("已登录,要退出吗?(Y/N)\n")
# if f.lower() == "y":
# driver.find_element(By.XPATH, "//*[@id='toLogOut']").click()
# driver.find_element(By.XPATH, "//*[@id='sure']").click()
# print("已退出登录")
# # driver.close()
# else:
# print("程序结束")
# driver.close()
这里注释部分打开可以用于手动退出,不过本来就是为了登录所以没有必要打开。
完整部分代码可以在这里下载:
AutoLoginCampusNetwork/ at main · ThreeStones1029/AutoLoginCampusNetwork (github.com)
五、windows自动连接设置
按住win+R,输入compmgmt.msc,确定,进入计算机管理界面,创建一个基本任务。
具体的触发条件可以自己改改。
六、ubuntu自动登录设置
有了代码后,我们就需要像windows一样去设置任务计划,在ubuntu下我们可以使用cron来帮我们实现。
命令行输入:
crontab -e
第一次输入会需要选择编辑器,选你熟悉的就行
然后在最后一行填入要执行的命令
0 */4 * * * /home/user/anaconda3/bin/python /home/user/Desktop/AutoLoginCampusNetwork/auto_login_webdriver.py >> /home/user/Desktop/AutoLoginCampusNetwork/auto_login_webdriver.log 2>&1
解释:
0 */4 * * * 表示每4个小时运行一次,每一个位置从左到右代表分钟、小时、天、月、周。具体解释可以看[这里](https://zhuanlan.zhihu.com/p/350671948)
/home/user/anaconda3/bin/python: 带有selenium等库的python环境路径
/home/user/Desktop/AutoLoginCampusNetwork/auto_login_webdriver.py: python脚本路径
/home/user/Desktop/AutoLoginCampusNetwork/auto_login_webdriver.log 2>&1:脚本运行的终端输出会保存到此。
运行后大致会生成这样的信息。我这里为了测试是每分钟运行一次脚本。