Python 实现自动健康打卡(Windows-10)

Python 实现自动健康打卡(Windows-10)


my 实现环境

  • windows-10
  • python-3.6.6
  • Chrome 浏览器

Ubuntu-20.04实现环境传送门

一、环境准备

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秒启动程序,可自行调整。
    在这里插入图片描述

  • 17
    点赞
  • 107
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 17
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Chorgy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值