首页/新闻资讯/正文详情

Selenium自动化健康打卡实战:从脚本到通用填报框架

发布时间:2026/9/23 11:14:37 来源:云帆数科 栏目:资讯中心
Selenium自动化健康打卡实战:从脚本到通用填报框架
简介这是一份面向高校学生与Python自动化爱好者的实战项目源码基于Selenium实现浙江大学自动健康打卡功能适合作为毕业设计、课程设计或自动化脚本学习案例。压缩包共10个文件约6.91MB以py脚本为核心辅以txt说明、yml工作流配置、chromedriver驱动及md文档覆盖打卡主逻辑、验证码识别与消息推送等模块结构清晰便于二次开发。项目为个人高分作品已通过导师指导与答辩评审获95分评价代码经测试可正常运行。已有52人学习下载。读者可从中掌握Selenium元素定位、表单自动填写、定时任务配置及异常处理思路也可在此基础上修改扩展为其他自动化场景适合具备一定Python基础、希望提升实战能力的学习者参考借鉴。1. 从手动填报到脚本代劳这套浙大健康打卡源码到底解决了什么如果你在浙大待过一段时间大概率经历过这样的早晨闹钟响了先摸手机打开打卡页面填体温、选健康状况、勾承诺书、点提交一套动作下来两三分钟偶尔网络卡一下还得重来。单次不累但连续几百天就是折磨。这套基于 Selenium 的自动健康打卡项目核心价值就是把这套重复动作交给浏览器自动化去跑你只需要在配置里填一次账号信息和打卡参数剩下的交给脚本。它适合三类人一是想省事的在校同学二是拿它当 Selenium 实战案例的计算机专业学生三是想在此基础上改造成其他自动化填报任务的开发者。项目里带了完整源码、chromedriver、requirements.txt 和详细文档拿到手就能跑不是那种只给几个片段让你自己拼的半成品。2. 拆开压缩包目录结构与 Selenium 驱动链路2.1 文件清单与各模块职责先把压缩包解开根目录下能看到这些内容AutoClock-main是主工程目录daka.py是打卡主脚本chaojiying.py负责验证码识别DingRobot.py是钉钉机器人通知模块chromedriver是浏览器驱动requirements.txt锁定依赖README.md是使用说明.github/workflows里放了定时任务的配置模板。这个结构说明作者不是随手写了个脚本而是按工程化思路组织的主流程、验证码、通知、依赖、文档各管一摊。daka.py是整个项目的入口它做的事情可以拆成四步启动 Chrome、登录、填写表单、提交并判断结果。chaojiying.py的存在说明打卡页面在某些情况下会弹验证码作者用第三方打码平台来兜底。DingRobot.py则是把打卡结果推送到钉钉群方便你确认今天到底打没打上。这三个文件构成了「执行—识别—反馈」的闭环。2.2 Selenium 驱动链路与 chromedriver 版本匹配Selenium 的工作原理不复杂你的 Python 代码通过 WebDriver 协议跟 chromedriver 通信chromedriver 再去操控真实的 Chrome 浏览器。所以链路上任何一环版本对不上脚本就会在启动浏览器那一步直接翻车。项目里自带了 chromedriver但你要确认它的版本跟你本机 Chrome 的大版本号一致。比如你本机是 Chrome 120驱动也得是 120.x差一个大版本就可能报session not created的错误。# 查看本机 Chrome 版本Windows 在地址栏输入 chrome://version # Linux 下可以用 google-chrome --version # macOS 下 /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --version # 查看项目自带 chromedriver 版本 ./chromedriver --version上面这几条命令的目的很直接把浏览器版本和驱动版本都打印出来做比对。如果版本不匹配去 chromedriver 的官方下载页找对应版本替换掉项目里的那个文件即可。注意 Windows 下驱动文件名是chromedriver.exeLinux 和 macOS 下没有后缀替换时别搞混。2.3 依赖安装与虚拟环境隔离项目根目录的requirements.txt里列了 Selenium、requests 等包。我一般不建议直接往全局 Python 环境里装容易跟其他项目的依赖打架。用 venv 建一个独立环境出问题直接删掉重建比到处找冲突省事得多。# 创建虚拟环境 python -m venv venv # 激活虚拟环境 # Windows: venv\Scripts\activate # macOS / Linux: source venv/bin/activate # 安装依赖 pip install -r requirements.txt # 确认 selenium 版本 pip show seleniumpython -m venv venv会在当前目录下建一个名为 venv 的文件夹里面是一套独立的 Python 解释器和 pip。激活之后你后续所有 pip install 都只影响这个环境。pip show selenium用来确认装上的版本号Selenium 4.x 和 3.x 在 API 上有差异比如 4.x 里find_element_by_id这类写法已经被移除改成了find_element(By.ID, ...)。如果你拿到的代码是 3.x 写法但装的是 4.x运行时会报AttributeError这时候要么降级 Selenium要么把代码里的定位方式改过来。3. 配置与运行把账号、参数和通知串起来3.1 账号信息与打卡参数的配置位置打开daka.py你会看到脚本开头或单独一个配置区域里放着用户名、密码、打卡表单的默认值。常见做法是把这些敏感信息抽到一个单独的配置文件或者环境变量里避免直接硬编码在脚本中。如果项目里没有做这层抽离你可以自己加一个config.py把账号密码放进去然后在daka.py里 import 进来。# config.py 示例 USERNAME 你的学号 PASSWORD 你的密码 # 打卡表单里的默认选项按你实际情况填 DEFAULT_TEMPERATURE 36.5 DEFAULT_LOCATION 校内# daka.py 中引用配置 from config import USERNAME, PASSWORD, DEFAULT_TEMPERATURE # 登录部分大致逻辑 driver.find_element(By.ID, username).send_keys(USERNAME) driver.find_element(By.ID, password).send_keys(PASSWORD) driver.find_element(By.ID, login-btn).click()这里的关键参数是USERNAME和PASSWORD填错的话脚本会在登录页卡住后续所有步骤都走不下去。DEFAULT_TEMPERATURE这类表单默认值要根据学校当时的填报要求来设不同时期字段可能不一样跑之前先手动打开一次打卡页面看看当前要填哪些项再对照着改脚本里的字段定位和默认值。3.2 表单字段定位与显式等待打卡页面上的输入框、下拉框、提交按钮都需要用 Selenium 的定位方法找到。项目里大概率用的是By.ID、By.NAME或By.XPATH。页面加载需要时间如果脚本跑得比页面渲染快就会报NoSuchElementException。解决办法是用显式等待让脚本在找不到元素时先等一会儿再重试。from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 等待提交按钮出现最多等 10 秒 submit_btn WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.ID, submit-btn)) ) submit_btn.click()WebDriverWait(driver, 10)里的 10 是超时秒数意思是最多等 10 秒期间每隔 0.5 秒检查一次条件是否满足。EC.element_to_be_clickable确保元素不仅出现了而且是可以点击的状态。这比用time.sleep(5)硬等要靠谱得多因为硬等要么等不够要么等太久显式等待是条件满足就立刻继续。3.3 验证码识别与钉钉通知的接入chaojiying.py是打码平台的接口封装。如果打卡页面弹了图形验证码脚本会截图验证码区域发给打码平台拿回识别结果再填进去。用这个模块需要你去打码平台注册账号拿到自己的软件 ID 和密钥填到chaojiying.py对应的变量里。不打码平台的话也可以看看验证码是不是简单的算术题或者固定字符如果是直接在脚本里写逻辑判断就行不必额外花钱。DingRobot.py负责把打卡结果推到钉钉。你需要在钉钉群里添加一个自定义机器人拿到 Webhook 地址和加签密钥填到脚本里。打卡成功或失败后脚本会发一条消息到群里你打开手机就能看到今天到底打没打上。这个模块不是必须的但强烈建议配上否则脚本在后台跑你根本不知道它有没有正常工作。# DingRobot.py 中的关键配置 WEBHOOK https://oapi.dingtalk.com/robot/send?access_token你的token SECRET 你的加签密钥 # 发送消息的函数大致长这样 def send_message(content): # 拼接签名、构造请求、发送 ...Webhook 地址和密钥填错的话消息发不出去但打卡本身不受影响。所以如果你发现打卡记录有了但钉钉没收到通知先检查这两个参数再检查网络能不能访问钉钉的接口。4. 避坑与排查那些让你打卡失败的常见问题4.1 驱动版本不匹配导致浏览器起不来现象运行脚本后立刻报错提示session not created: This version of ChromeDriver only supports Chrome version XX。原因是你本机 Chrome 自动更新了但项目里的 chromedriver 还是旧版本。解决方法是查看本机 Chrome 版本去下载对应版本的 chromedriver 替换项目里的文件。如果懒得每次手动换可以用webdriver-manager这个库让它自动下载匹配的驱动。4.2 页面元素定位失效现象脚本能打开浏览器、能登录但到了填表单那一步就报NoSuchElementException。原因是打卡页面的 HTML 结构变了或者字段的 ID、NAME 跟脚本里写的不一样。解决方法是手动打开打卡页面按 F12 打开开发者工具用元素选择器点一下你要填的输入框看看它的 ID 或 NAME 是什么然后改脚本里的定位表达式。如果页面用了 iframe还需要先driver.switch_to.frame()切进去才能找到元素。4.3 登录态过期与会话保持现象昨天还能跑今天一跑就停在登录页提示密码错误或者要求重新登录。原因是学校系统可能改了密码策略或者你的账号在别处登录导致会话失效。解决方法是先手动登录一次确认账号正常然后检查脚本里的密码是不是最新的。如果系统有异地登录检测可能还需要处理额外的验证步骤。4.4 定时任务环境下浏览器无法启动现象在本地跑得好好的放到服务器上用 cron 定时执行就失败。原因是服务器上没有图形界面Chrome 需要以 headless 模式运行。解决方法是在启动 Chrome 的代码里加上options.add_argument(--headless)和options.add_argument(--no-sandbox)。另外 cron 环境下的 PATH 可能跟你的 shell 不一样脚本里最好用绝对路径来指定 chromedriver 的位置。from selenium.webdriver.chrome.options import Options options Options() options.add_argument(--headless) # 无界面模式 options.add_argument(--no-sandbox) # 服务器上常需要 options.add_argument(--disable-dev-shm-usage) # 避免共享内存不足 driver webdriver.Chrome(optionsoptions)这三个参数是无界面环境下的标配。--headless让 Chrome 不弹窗口--no-sandbox解决权限问题--disable-dev-shm-usage避免容器里共享内存太小导致浏览器崩溃。加上之后脚本在服务器上就能安静地跑完。4.5 打卡成功但通知没发出来现象去系统里查记录发现打卡成功了但钉钉群没收到消息。原因是DingRobot.py里的 Webhook 或密钥配错了或者服务器网络访问不了钉钉接口。解决方法是先手动调用一次发送函数看报什么错再检查 Webhook 地址是否完整、加签密钥是否跟机器人设置里的一致。如果服务器在内网可能还需要配置网络出口。5. 进阶改造把打卡脚本变成通用自动化填报框架这套代码跑通之后你会发现它的骨架其实适用于任何「登录—填表—提交」的网页操作。我后来把它改造成了实验室的日报填报工具思路是一样的换掉登录部分的定位表达式换掉表单字段的填写逻辑通知模块原封不动复用。具体做法是抽出一个BaseFormFiller类把打开页面、登录、填字段、提交、通知这几个步骤定义成方法每个具体任务只需要继承这个类并覆盖字段映射就行。class BaseFormFiller: def __init__(self, url, username, password): self.url url self.username username self.password password self.driver self._init_driver() def _init_driver(self): options Options() options.add_argument(--headless) options.add_argument(--no-sandbox) return webdriver.Chrome(optionsoptions) def login(self): raise NotImplementedError def fill_form(self): raise NotImplementedError def submit(self): raise NotImplementedError def notify(self, result): # 复用钉钉通知逻辑 ... def run(self): try: self.driver.get(self.url) self.login() self.fill_form() self.submit() self.notify(打卡成功) except Exception as e: self.notify(f打卡失败{e}) finally: self.driver.quit()这个基类把流程固定下来子类只需要实现login、fill_form、submit三个方法。run方法里用 try-except-finally 保证无论成功失败都会发通知、都会关浏览器。改造的时候你只需要打开目标网页用开发者工具找到各个元素的定位方式填到子类里就行。验证改造是否成功我一般会分两步走先在本地用有界面模式跑一遍肉眼确认每一步都点对了地方再切到 headless 模式跑一遍确认无界面下也没问题。两步都过了再放到定时任务里。从那以后我每次改完定位表达式都会强制走一遍「有界面→无界面→定时任务」这个流程避免直接上服务器然后对着日志猜哪里出了问题。希望这套思路能帮到你。本文还有配套的精品资源点击获取

相关推荐

前端防篡改实战:3招搞定版本升级API失效
前端防篡改实战:3招搞定版本升级API失效

前端防篡改实战:3招搞定版本升级API失效 版本升级后 API 全变了,是不是让你抓狂?别急,这往往不是后端的问题,而是前端请求被中间层悄悄 篡改 了。今天咱们不聊虚的,直接通过 源码解析… · 2026/9/23 11:14:36

GitHub 周榜观察:DLSS 工具、AI 工作流与轻量应用成主流
GitHub 周榜观察:DLSS 工具、AI 工作流与轻量应用成主流

GitHub 周榜趋势速报是我每周固定会看的东西。以前看热闹,现在看门道——星标暴涨不一定是项目真的好,可能只是踩中了某个情绪节点;星标涨得慢的项目,反而可能是闷声发大财的基建工具。2026-09-19 这一期榜单,整体给我… · 2026/9/23 11:14:30

采矿CAD课程设计:矿山地质环境治理分区与CAD落图实战
采矿CAD课程设计:矿山地质环境治理分区与CAD落图实战

简介:这份采矿CAD课程设计PPT面向采矿工程、地质环境及相关专业的本科生与课程设计者,围绕矿山地质环境分析、矿区生态破坏成因、治理分区及综合治理方案展开,帮助读者系统梳理课程设计所需的核心知识点与规划思路。资源包共1个文件&#xff… · 2026/9/23 11:14:30

人类最后悔的十大发明踩坑实录,从入门到精通
人类最后悔的十大发明踩坑实录,从入门到精通

人类最后悔的十大发明踩坑实录,从入门到精通 报错一堆看不懂 StackTrace?别慌,这不仅是新手的噩梦,更是无数老手在凌晨三点盯着屏幕时的真实写照。当满屏的红色异常堆栈像天书一样砸下来,你的第一反应往往是重启大法,但真正的 入门到精通… · 2026/9/23 11:48:08

动力电池PACK量产痛点解析:激光焊接隐性缺陷漏检如何规避?
动力电池PACK量产痛点解析:激光焊接隐性缺陷漏检如何规避?

在动力电池PACK智能制造产线中,激光焊接是决定电池包结构强度、密封性能与电气安全的核心工艺。随着GB38031新国标落地,动力电池安全质控门槛大幅提升,传统人工目检、金相抽检的滞后式质检模式,已经无法适配规模化量产需求。 动力… · 2026/9/23 11:48:08

从T40EVB原理图到硬件设计:电源树、DDR4与MIPI全解析
从T40EVB原理图到硬件设计:电源树、DDR4与MIPI全解析

简介:北京君正T40EVB原理图PDF,面向从事AIoT、机器视觉硬件开发的嵌入式工程师与方案设计人员。T40是面向AIoT的通用SoC,采用XBurst2双核架构并集成RISC-V协处理器,内置8TOPS算力的AI引擎,支持4K ISP和多摄像头同时输入… · 2026/9/23 11:47:48

特效图片实战项目选型:5种方案避坑指南
特效图片实战项目选型:5种方案避坑指南

特效图片实战项目选型:5种方案避坑指南 学会语法却不知怎么搭项目,是无数开发者的通病。很多老鸟在面试或接 实战项目 时,往往卡在“特效图片”这类非核心但显眼的功能上。别被“特效”二字吓住,这背后其实是渲染引擎、资源加载策略和性能优化的博弈。… · 2026/9/23 11:47:30

OpenRLHF 多节点训练实战:基于 Ray 集群的跨机分布式 RLHF 完整指南
OpenRLHF 多节点训练实战:基于 Ray 集群的跨机分布式 RLHF 完整指南

OpenRLHF 多节点训练实战:基于 Ray 集群的跨机分布式 RLHF 完整指南 【免费下载链接】AI-Research-SKILLs Comprehensive open-source library of AI research and engineering skills for any AI model. Package the skills and your claude code/codex/gemini age… · 2026/9/23 11:47:04

5个高频面试题讲透幻灯片备注原理,告别代码跑不通
5个高频面试题讲透幻灯片备注原理,告别代码跑不通

5个高频面试题讲透幻灯片备注原理,告别代码跑不通 刚入职第一周,我拿着网上抄来的 PPT 自动化脚本去跑,结果报错 AttributeError: 'NotesSlide' object has no attribute 'text'… · 2026/9/23 11:46:51

3招搞定手机怎么下载微信面试难题实战项目解析
3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧
Win7无线热点配置工具源码解析:解决API失效的3个实战技巧

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧 Win7无线热点配置工具在Win10/11上跑不动?不是你的问题,是版本升级后 API 全变了。很多老项目里的 netsh wlan… · 2026/9/23 0:00:36

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码