Python 实现自动健康打卡(Ubuntu-20.04)
my 实现环境
- Ubuntu-20.04
- python-3.8.8
- FireFox 浏览器(Chrome 的插件没找到适用于 Ubuntu-20.04 版本的)
一、环境准备
1. python 环境准备(缺省的自己 pip 下载)
- selenium --用于帮助我们操作浏览器 --核心
- random --用于生成随机体温
- time --用于延时
> pip install selenium
> pip install random
> pip install time
2. 浏览器插件安装
FireFox 浏览器 --geckodriver 插件
- 安装地址: https://github.com/mozilla/geckodriver/releases
- 选择版本: geckodriver-v0.29.1-linux64.tar.gz
- 安装,命令行执行 tar -zxvf geckodriver-v0.29.1-linux64.tar.gz 解压
- sudo su 获取 super user 权限后,将 geckodriver 文件移动到 /usr/local/bin/ 目录下
二、开始写代码
a. 引入包
from selenium import webdriver
import random
from time import sleep
b. 进入登录页面
driver = webdriver.Firefox()
driver.get("http://my.just.edu.cn/_s2/students_sy/main.psp")
now_handle = driver.current_window_handle
driver.switch_to.window(now_handle)
driver.find_element_by_id("username").clear()
driver.find_element_by_id("password").clear()
driver.find_element_by_id("username").send_keys("19********")
driver.find_element_by_id("password").send_keys("**********")
sleep(2)
这里的 find_element_by_id 函数就是利用网页 html 中的 id 来定位不同的元素,关键是找到页面元素的 id。按 F12 查看一下网页的html源码。
鼠标放在 html代码 上会与页面内容实时对应,可以很方便的找到账号密码输入栏的html代码:
<input id="username" name="username" tabindex="1" accesskey="" value="" autocomplete="off" type="text" placeholder="账号 Username">
<input id="password" name="password" tabindex="2" accesskey="" value="" autocomplete="off" type="password" class="wordpass" placeholder="密码 Password">
id 用于命名页面元素,与元素唯一对应,因此可以用 “username” 和 “password” 来指向账号密码输入栏的位置。
c. 跳转主页
这里我遇到过一个问题,学校的网页加载较慢,而网页加载不完python脚本会卡住不往下执行。为了快速完成打卡,采用下面的解决方法:
driver.set_page_load_timeout(5)
driver.set_script_timeout(5)
try:
driver.find_element_by_id("passbutton").click()
except:
driver.execute_script("window.stop()")
这样便可以不需要等待页面完全加载成功,就继续执行下面的操作。
d. 选择主页上的健康信息填报
到这里其实可以发现操作的方法大同小异,无非就是通过特殊标志定位页面元素、进行点击或者是输入操作。
windows = driver.window_handles
driver.switch_to.window(windows[-1])
driver.find_element_by_xpath("/html/body/div/div[2]/div[1]/div/div/div/div/div/div/ul/li[2]/div/div").click()
sleep(2)
windows = driver.window_handles
driver.switch_to.window(windows[-1])
每次打开一个新的页面都需要转换操作窗口:
windows = driver.window_handles
driver.switch_to.window(windows[-1])
find_element_by_xpath 是第二种定位页面元素的方式,很多时候一个页面元素既没有id,也没有css,就不得不使用绝对路径来定位。下面看一下 html 绝对路径的快速查找方式:
- 按 F12 进入源代码界面
- 找到与元素对应的语句,右键
- copy 后面选择 XPath,去脚本里面粘贴即可
e. 表格填报
如果今天已经提交过,我的表格会出现一个弹窗: 一招吃遍天,通过查询html源码,我发现他也是一个页面元素。试试通过查找弹窗的绝对路径、如果有就点击是再次填写、再次提交(为了方便我调试代码哈哈哈),如果没有就选中体温输入框、输入随机数,点击提交。
try:
print("search")
driver.find_element_by_xpath('//*[@id="layui-layer100002"]')
driver.find_element_by_xpath("/html/body/div[8]/div[3]/a[1]").click()
print("fill")
driver.find_element_by_id("input_tw").send_keys('%.1f' %random.uniform(36.0, 36.6))
driver.find_element_by_id("input_zwtw").send_keys('%.1f' % random.uniform(36.0, 36.6))
driver.find_element_by_id("post").click()
print("done")
sleep(3)
driver.find_element_by_xpath("/html/body/div[8]/div[3]/a").click()
except:
print("fill")
driver.find_element_by_id("input_tw").send_keys('%.1f' %random.uniform(36.0, 36.6))
driver.find_element_by_id("input_zwtw").send_keys('%.1f' % random.uniform(36.0, 36.6))
driver.find_element_by_id("post").click()
print("done")
sleep(2)
driver.find_element_by_xpath("/html/body/div[8]/div[3]/a").click()
三、 开机自动运行
在 /etc/profile 这个文件中,添加 punch-2.py 脚本文件路径,例如:
/home/chorgy/Desktop/punch/punch-2.py
在开机时就会自动执行 /etc/profile中的代码
|