Jmu校园网
集美大学校园网使用锐捷认证,虽然现在已经可以开启无感认证,但是还是需要打开浏览器才能自动认证,由于在宿舍有一台Ubuntu服务器,也在GitHub上并没有找到适合Linux的认证脚本,本着自动化的想法,心血来潮写了一个很粗糙的python脚本来实现认证
环境准备
1.一台能运行python的电脑 2.selenium包 3.认证成功的url 4.自己的账号与密码 5(可选).自动化执行(需要设备持续在线)6.chrome浏览器
大致流程
1.使用selenium来模仿浏览器操作
Selenium是一个自动化测试工具,主要用于自动化测试网站/网页应用。它可以模拟浏览器操作来自动完成一些重复性的工作,常用来做功能测试、性能测试和回归测试等。支持主流浏览器:如Chrome、Firefox、Safari、Edge等,这里使用的是chrome浏览器,如果需要更改成别的浏览器,请自行学习selenium的webdriver类
如果没有安装,使用pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple
安装selenium包
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep #sleep函数的作用防止运行太快出现问题
2.访问集美大学认证网站
driver.get("http://10.8.2.2")
3.获取需要输入的元素id/Xpath并输入数据
在网络认证界面进行网页元素分析,得到两个输入框与下拉框的元素,发现需要点击输入框才能进行输入操作,通过模仿点击点击操作,可以得到下面的代码
driver.find_element(By.ID, 'username').send_keys('username')
driver.find_element(By.XPATH, '//*[@id="pwd_tip"]').click()
driver.find_element(By.XPATH, '//*[@id="pwd"]').send_keys('password')
driver.find_element(By.XPATH, '//*[@id="xiala"]').click()
driver.find_element(By.XPATH, '//*[@id="bch_service_2"]/div').click()
driver.find_element(By.XPATH, '//*[@id="loginLink_div"]').click()
4.判断认证是否成功
通过判断跳转页面是否与认证成功的页面相同来判断认证是否成功
if success_url in driver.current_url:
print('Auth Success!')
else:
print('Auth Failed!')
5.自动化部署
部署自动化需要加上以下额外设置来后台运行
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--disable-dev-shm-usage')
要实现Selenium脚本每天早上6点自动执行,可以使用任务调度工具来进行调度。常用的任务调度工具有:
- Windows Task Scheduler:Windows自带的任务计划工具,可以用于Windows环境下的任务调度。
- cron:Unix/Linux系统下的任务调度工具,可以用于Linux服务器上部署的Selenium脚本调度。
- Jenkins:持续集成工具,包含任务构建与触发功能,可以用于任何平台的Selenium脚本调度。
- Python crontab:基于cron实现的Python任务调度库,可以直接在Python中定义调度表达式,实现Selenium脚本调度。
ubuntu下的脚本部署
1.将py文件转为脚本文件
由于我的设备是Ubuntu服务器,这里就以cron为例
1.在文件头部添加 interpretable 的 shebang 行,指定运行该脚本的Python解释器路径:
#!/usr/bin/env python
- 给文件添加可执行权限。可以使用chmod命令:
chmod +x your_script.py
- 测试脚本是否可执行。可以使用:
./your_script.py
运行该命令,如果脚本可以正常执行,则说明配置成功。
4. (可选)重命名文件为your_script并移除.py扩展名。使文件名更像标准的可执行文件。
这样,一个Python .py文件就变成了一个可执行的脚本文件,可以像标准的脚本一样直接运行。
注意:
5. shebang行指定的Python路径需指向您的环境中Python可执行文件的路径。
6. 文件头部的shebang行有严格的语法要求,必须在文件的第一行或第二行,且前面不能有空行。
7. 添加可执行权限的命令需根据实际的文件系统和用户权限进行相应修改。
8. 运行脚本的命令中不要包含.py扩展名,直接使用配置好的文件名。
9. 修改文件名可选,主要用于更好的可执行脚本使用体验,文件内容和运行结果不受影响。
2.配置cron
- 编辑crontab文件:
bash
crontab -e
这会打开一个文本编辑器供您编辑crontab文件。
2. 在文件末尾添加以下cron表达式:
0 6 * * * /path/to/your_script.py
表示每天6点(0 6)执行/path/to/your_script.py这个脚本。
3. 保存退出编辑器。
4. 验证cron设置是否正确。可以使用:
crontab -l
查看当前的cron任务列表,如果出现0 6 * * * /path/to/your_script.py即配置成功
6.完整实现
这个代码很粗糙,单纯的能跑起来,有能力的大佬可以自己优化
运行出现问题可以参考这位大佬的文章
> https://blog.csdn.net/blueheart20/article/details/81566903?spm=1001.2014.3001.5506
#!/usr/bin/env python
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
options = webdriver.ChromeOptions()
options.page_load_timeout = 30 # 设置超时时间
success_url = 'http://10.8.2.2/eportal/success.jsp?userIndex=unknown' # 登录成功后跳转URL改成你自己的
driver = webdriver.Chrome(options=options)
driver.set_window_size(800, 400)
#访问10.8.2.2网站, 此时认证尚未完成
driver.get("http://10.8.2.2")
# 防止重复认证
if success_url in driver.current_url:
print('Already log in!')
driver.quit()
exit(0)
sleep(5) #防止网页未加载完成就被关闭 可以自己调成合适的值
# 执行认证操作, 如输入用户名密码并点击登录,账号与密码需要改成自己的
driver.find_element(By.ID, 'username').send_keys('username')
driver.find_element(By.XPATH, '//*[@id="pwd_tip"]').click()
driver.find_element(By.XPATH, '//*[@id="pwd"]').send_keys('password')
driver.find_element(By.XPATH, '//*[@id="xiala"]').click()
driver.find_element(By.XPATH, '//*[@id="bch_service_2"]/div').click()
driver.find_element(By.XPATH, '//*[@id="loginLink_div"]').click()
# 判断driver.current_url 是否改变
sleep(5) # 防止跳转过快,误判认证失败
if success_url in driver.current_url:
print('Auth Success!')
else:
print('Auth Failed!')
driver.quit()