Python 实现自动健康打卡(Windows-10)
my 实现环境
- windows-10
- python-3.6.6
- Chrome 浏览器
目录
- Python 实现自动健康打卡(Windows-10)
- 一、环境准备
- 1. python 环境准备(缺省的自己 pip 下载)
- 2. 浏览器插件安装
- 二、开始写代码
- # 完整代码(注意需要自行修改的部分,根据上述的教程修改)
- 三、 开机自动运行
一、环境准备
1. python 环境准备(缺省的自己 pip 下载)
- selenium --用于帮助我们操作浏览器 --核心
- random --用于生成随机体温
- time --用于延时
> pip install selenium
> pip install random
> pip install time
2. 浏览器插件安装
Google 浏览器 – Chrome-driver
- 查看版本: 每个人的Google版本不一定相同,在浏览器地址栏输入chrome://version 查看自己的版本。比如我的是92.0.4515.159
- 安装地址: https://chromedriver.storage.googleapis.com/index.html
- 选择版本: 必须保证前三个数字(92.0.4515)相同
- 安装chromedriver_win32.zip并解压,将其中的chromedriver.exe文件放在Chrome的安装目录下:
- 环境变量配置:
- 把Chrome的安装路径加进来:
- 一路确定即可
二、开始写代码
a. 引入包
from selenium import webdriver
import random
from time import sleep
b. 进入登录页面
# 选择Chrome浏览器
driver = webdriver.Chrome()
# 这是我学校的打卡网页,需自行修改
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("*********") # 账号
driver.find_element_by_id("password").send_keys("***********") # 密码
# 延时2秒
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脚本会卡住不往下执行。为了快速完成打卡,采用下面的解决方法:
# 如果过了5秒,页面还没加载完,发出error警告
driver.set_page_load_timeout(5)
driver.set_script_timeout(5)
# error的自动处理
try:
# 如果出现error,就试试看点击 id为passbutton 的页面元素,登录网站
# 因为调试bug时候发现我的代码会卡在这一句
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")
# 找到今天体温的文本框,send_keys()输入(36.0,36.6)之间的随机数
driver.find_element_by_id("input_tw").send_keys('%.1f' %random.uniform(36.0, 36.6))
# 找到昨晚体温的文本框,send_keys()输入(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()
except:
print("fill")
# 没有弹窗的话,直接找到今天体温的文本框,send_keys()输入(36.0,36.6)之间的随机数
driver.find_element_by_id("input_tw").send_keys('%.1f' %random.uniform(36.0, 36.6))
# 找到昨晚体温的文本框,send_keys()输入(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()
# 完整代码(注意需要自行修改的部分,根据上述的教程修改)
from selenium import webdriver
import random
from time import sleep
# 选择Chrome浏览器
driver = webdriver.Chrome()
# 这是我学校的打卡网页,需自行修改
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("***********") # 账号
driver.find_element_by_id("password").send_keys("**********") # 密码
# 延时2秒
# 如果过了5秒,页面还没加载完,发出error警告
driver.set_page_load_timeout(5)
driver.set_script_timeout(5)
# error的自动处理
try:
# 如果出现error,就试试看点击 id为passbutton 的页面元素,登录网站
# 因为调试bug时候发现我的代码会卡在这一句
driver.find_element_by_id("passbutton").click()
except:
# 尝试点击失败(卡住),停止加载页面
driver.execute_script("window.stop()")
# 当前打开的所有窗口
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])
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")
# 找到今天体温的文本框,send_keys()输入(36.0,36.6)之间的随机数
driver.find_element_by_id("input_tw").send_keys('%.1f' %random.uniform(36.0, 36.6))
# 找到昨晚体温的文本框,send_keys()输入(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()
except:
print("fill")
# 没有弹窗的话,直接找到今天体温的文本框,send_keys()输入(36.0,36.6)之间的随机数
driver.find_element_by_id("input_tw").send_keys('%.1f' %random.uniform(36.0, 36.6))
# 找到昨晚体温的文本框,send_keys()输入(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()
三、 开机自动运行
- 打开控制面板
- 寻找管理工具
- 选择任务计划程序
- 创建基本任务
- 任务命名
- 执行时间
- 操作
- 最后一步要注意! 程序或脚本要选择你的python环境:
添加参数填写你的punch.py文件位置,比如我的位置是放在桌面文件夹C:\Users\Chorgy\Desktop\punch\punch.py - 最后可以修改一些细节。
- 选择触发器,编辑
- 开机延时25秒启动程序,可自行调整。