当前位置: 首页 > article >正文

别再手动算考勤了!我用Python+企业微信API写了个自动统计脚本(附源码)

告别手工考勤Python企业微信API自动化统计实战指南每次月底统计考勤时行政同事总要加班到深夜手动核对上百条打卡记录。迟到、早退、外勤打卡...各种状态让人眼花缭乱。作为技术团队的一员我决定用Python企业微信API打造一个自动化解决方案。这个脚本不仅能自动获取打卡数据还能智能分析考勤状态最终生成可视化报表。整个过程无需复杂数据库只需50行核心代码特别适合中小企业的技术团队快速部署。1. 企业微信API准备与配置企业微信提供了完善的打卡接口但使用前需要完成几个必要步骤。首先登录企业微信管理后台进入「应用管理」→「打卡」记录下你的CorpID和Secret。这两个参数相当于API访问的钥匙。注意Secret只在创建时显示一次务必妥善保存。如果遗失需要重新生成。接下来创建接收数据的应用。在「应用与小程序」中新建一个自建应用设置可见范围后记下AgentId。这三个参数构成API调用的基础# 配置参数示例 config { corp_id: wwxxxxxxxxxx, secret: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx, agent_id: 1000002 }企业微信API采用OAuth2.0认证我们需要先获取access_token。这个token有效期2小时建议在脚本中加入自动刷新逻辑import requests import json def get_access_token(corp_id, secret): url fhttps://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid{corp_id}corpsecret{secret} response requests.get(url) return response.json().get(access_token)2. 打卡数据获取与解析获取到access_token后就可以调取打卡数据了。企业微信提供两种接口打卡记录获取原始打卡流水打卡规则获取班次、考勤组等配置信息我们主要使用第一个接口。关键参数包括start_time/end_time查询时间范围userid_list指定员工列表为空则查全部def get_checkin_data(token, start_date, end_date, userid_listNone): url https://qyapi.weixin.qq.com/cgi-bin/checkin/getcheckindata params { access_token: token, starttime: int(start_date.timestamp()), endtime: int(end_date.timestamp()), useridlist: userid_list or [] } response requests.post(url, jsonparams) return response.json().get(checkindata, [])返回的JSON数据结构复杂主要包含这些关键字段userid员工企业微信IDcheckin_type打卡类型上班/下班exception_type异常类型0正常1迟到2早退等location_title打卡位置wifiname连接WiFi名称3. 考勤状态智能判断逻辑原始数据需要转换为可读的考勤状态。我们定义一个状态映射字典STATUS_MAPPING { (0, 上班打卡): 正常上班, (0, 下班打卡): 正常下班, (1, 上班打卡): 迟到, (2, 下班打卡): 早退, (3, None): 缺卡, (4, None): 外勤打卡 }实际处理时还需要考虑这些特殊情况多次打卡取最早上班和最晚下班记录请假时段需要对接请假系统数据跨日班次夜班人员的特殊处理建议使用pandas进行数据处理import pandas as pd def process_checkin_data(raw_data): df pd.DataFrame(raw_data) # 转换时间戳 df[datetime] pd.to_datetime(df[checkin_time], units) # 按用户分组 grouped df.groupby(userid) # 计算最早上班和最晚下班 result grouped.agg({ datetime: [min, max], exception_type: first }) return result4. 完整脚本实现与部署方案将上述模块组合成完整解决方案。脚本主要流程获取access_token拉取打卡原始数据处理分析考勤状态生成可视化报表核心代码结构如下# main.py import config from datetime import datetime, timedelta from data_fetcher import get_checkin_data from processor import process_checkin_data def main(): # 1. 认证 token get_access_token(config.corp_id, config.secret) # 2. 获取数据默认查询昨天 end_date datetime.now() start_date end_date - timedelta(days1) raw_data get_checkin_data(token, start_date, end_date) # 3. 处理数据 report process_checkin_data(raw_data) # 4. 输出结果 print(report.to_markdown()) if __name__ __main__: main()部署时建议采用定时任务。Linux服务器可以使用crontab# 每天上午9点运行 0 9 * * * /usr/bin/python3 /path/to/main.py /var/log/checkin.log对于Windows服务器可以创建计划任务或使用Python的APScheduler库实现内部定时。5. 异常处理与性能优化实际运行中可能遇到各种问题需要完善的错误处理try: token get_access_token(config.corp_id, config.secret) if not token: raise ValueError(获取token失败) except requests.exceptions.RequestException as e: print(f网络请求异常: {e}) except json.JSONDecodeError: print(API返回数据解析失败)性能优化建议缓存机制将access_token缓存到文件/内存避免频繁获取增量查询记录上次查询时间只获取新数据批量处理当员工数量多时分批查询避免超时# 分批查询示例 def batch_query(user_ids, batch_size50): for i in range(0, len(user_ids), batch_size): batch user_ids[i:i batch_size] data get_checkin_data(token, start_date, end_date, batch) yield from data6. 数据可视化与报表输出最终结果可以多种形式呈现控制台表格适合快速查看Excel报表便于行政存档可视化图表直观展示考勤趋势使用pandas的样式功能可以美化控制台输出def format_report(df): styled df.style\ .applymap(color_status)\ .set_caption(每日考勤统计)\ .format({工作时长: {:.1f}小时}) return styled def color_status(val): if val 迟到: return color: red elif val 早退: return color: orange return color: green生成Excel报表也很简单df.to_excel(考勤统计.xlsx, sheet_name月度汇总, freeze_panes(1,0))对于长期运行的系统建议将数据保存到数据库。SQLite是轻量级选择import sqlite3 def save_to_db(data): conn sqlite3.connect(attendance.db) data.to_sql(checkin_records, conn, if_existsappend) conn.close()我在实际部署中发现最实用的功能是自动发送日报到管理群。添加企业微信消息接口即可实现def send_report(report, token): url fhttps://qyapi.weixin.qq.com/cgi-bin/message/send?access_token{token} payload { touser: all, msgtype: markdown, agentid: config.agent_id, markdown: { content: f**今日考勤报告**\n{report} } } requests.post(url, jsonpayload)

相关文章:

别再手动算考勤了!我用Python+企业微信API写了个自动统计脚本(附源码)

告别手工考勤:Python企业微信API自动化统计实战指南 每次月底统计考勤时,行政同事总要加班到深夜,手动核对上百条打卡记录。迟到、早退、外勤打卡...各种状态让人眼花缭乱。作为技术团队的一员,我决定用Python企业微信API打造一个…...

XLink 和 XPointer 语法详解

XLink 和 XPointer 语法详解 概述 XLink(XML Linking Language)和 XPointer(XML Pointer Language)是XML文档中处理链接和定位信息的语言。本文将详细解释XLink和XPointer的语法及其应用。 XLink 语法 XLink定义了一种标准的方法,允许在XML文档内部和之间建立链接。以…...

手把手教你用Python3运行seeyon_exp工具,一键检测致远OA常见漏洞

手把手教你用Python3运行seeyon_exp工具进行致远OA漏洞检测 在当今企业数字化办公环境中,协同办公系统承载着大量核心业务数据,其安全性至关重要。致远OA作为国内广泛使用的办公自动化平台,近年来曝光的多个高危漏洞引起了安全从业者的高度关…...

米家极客版常用快捷键

米家极客版常用快捷键 双击放大/缩小卡片...

告别‘Requirement already satisfied’:精准定位Python环境,让pip install不再迷茫

1. 为什么pip总是说"已经安装好了"? 每次看到"Requirement already satisfied"这个提示,我都想对着屏幕大喊:"不!它根本没装在我想要的地方!"这种抓狂的感觉,相信很多Python…...

正交张量、正定张量与材料稳定性:在有限元分析ABAQUS中的实际应用与参数设置

正交张量、正定张量与材料稳定性:在有限元分析ABAQUS中的实际应用与参数设置 当工程师在ABAQUS中遇到材料刚度矩阵非正定警告时,往往意味着仿真结果可能失去物理意义。这种警告背后隐藏着深刻的张量数学原理——正定张量的性质直接决定了材料本构模型的稳…...

从碰撞到安全路径:在MATLAB里为你的机械臂规划一条无碰撞轨迹(附完整代码)

七轴机械臂无碰撞轨迹规划实战:从MATLAB基础到高级避障策略 机械臂在复杂环境中的自主运动一直是工业自动化和服务机器人领域的核心挑战。想象一下,当一台七轴机械臂需要在布满障碍物的空间里精准抓取物品时,如何确保它不会撞上周围的工作台、…...

嵌入式开源项目高效学习指南:从筛选评估到深度贡献

1. 项目概述:为什么我们需要一份“开源项目精选”?如果你是一名嵌入式开发者,或者正在向这个领域转型,那么你一定经历过这样的时刻:GitHub上项目浩如烟海,技术论坛帖子日更千条,想找一个靠谱的、…...

AI微型赛车:从车道线检测到PID控制,手把手实现端侧自动驾驶

1. 项目概述:当AI遇见指尖上的速度与激情最近在创客圈和AI应用领域,一个结合了硬件、软件与智能算法的项目正悄然兴起,那就是“AI驱动的自动微型赛车”。这听起来像是科幻电影里的场景,但如今,借助开源硬件和成熟的机器…...

【VASP实战】Ubuntu 22.04 LTS 部署 vasp.6.x 指南:从Intel oneAPI编译到GPU加速测试

1. VASP 6.x与Ubuntu 22.04 LTS环境概述 VASP(Vienna Ab initio Simulation Package)是材料科学领域广泛使用的第一性原理计算软件,能够模拟原子尺度的电子结构、分子动力学等过程。最新版VASP 6.x在并行计算效率和GPU加速支持上有显著提升&a…...

OpenCV实战:工业相机Bayer数据高效转换与图像处理全流程

1. 工业相机Bayer格式基础解析 第一次接触工业相机输出的Bayer格式数据时,我盯着那些看起来像黑白噪点的图像完全摸不着头脑。后来才发现,这其实是工业视觉领域最常见的原始数据格式之一。Bayer格式的本质是单通道马赛克阵列,每个像素点只记录…...

C166编译器内联展开机制与嵌入式性能优化

1. C166编译器运行时库函数的内联展开机制解析在嵌入式开发领域,C166架构因其高效的实时性能被广泛应用于工业控制领域。作为长期使用Keil C166工具链的开发者,我发现编译器对标准库函数的内联优化处理直接影响着代码的执行效率和内存占用。本文将深入剖…...

HNU 计算机系统 bomblab:从GDB断点到链表重构的逆向实战

1. 逆向工程实战:从零开始拆解二进制炸弹 第一次接触bomblab时,我盯着终端里那个名为"bomb"的可执行文件发呆了十分钟。这个看似普通的Linux程序就像个黑盒子,里面藏着六个需要密码才能解除的"炸弹"。作为计算机系统课程…...

华为BGP路由实战:从原理到策略调优的深度解析

1. 华为BGP路由技术入门指南 第一次接触华为BGP路由配置时,我被那些专业术语搞得晕头转向。经过多次实战后才发现,BGP就像互联网世界的邮局系统,负责在不同自治系统(AS)之间传递路由信息。华为设备的BGP实现特别适合企…...

【Perplexity专利搜索黄金法则】:20年资深IP专家首度公开3大反直觉检索技巧

更多请点击: https://intelliparadigm.com 第一章:Perplexity专利搜索黄金法则的底层逻辑 Perplexity 作为基于语言模型的智能搜索工具,其在专利检索场景中的卓越表现并非源于简单关键词匹配,而是植根于对专利文本结构化语义、法…...

为什么你的Perplexity症状查询总返回模糊答案?——解析LLM医学知识蒸馏偏差、实体链接断层与实时性衰减问题

更多请点击: https://kaifayun.com 第一章:Perplexity症状查询功能的临床价值与典型失效场景 Perplexity症状查询功能在临床决策支持系统中承担着语义级症状归一化与鉴别诊断初筛的关键角色。它通过将患者自然语言描述(如“饭后右上腹闷胀、…...

QGIS工程文件.QGZ与.QGS到底怎么选?从团队协作到版本控制的完整避坑指南

QGIS工程文件.QGZ与.QGS深度对比:团队协作与版本控制的最佳实践 当你在QGIS中完成一天的工作,点击保存按钮时,系统默认会生成.QGZ格式的文件。但你是否想过,这个看似简单的选择可能会影响未来团队协作的效率?在GIS项目…...

帆软FineReport 10升级实战:从路径映射到安全配置的完整指南

1. 从FineReport 9到10的升级背景与准备工作 最近接手了一个企业级报表系统的升级项目,需要将现有的FineReport 9环境迁移到最新的10版本。在实际操作过程中发现,这不仅仅是简单的版本替换,而是涉及到路径映射、参数调整、安全配置等多个关键…...

从CLIP到车辆检索:解锁ViT大模型在跨摄像头ReID中的实战潜力

1. 当CLIP遇上车辆检索:ViT大模型的跨界实战 第一次看到CLIP模型在车辆重识别任务上的表现时,我对着屏幕上的mAP 84.5数据反复确认了三遍。这就像给一辆普通家用车换上了F1赛车的引擎,性能提升简单粗暴。传统ReID方法需要精心设计网络结构、调…...

告别CV大法:用MyBatisX插件5分钟搞定MyBatis Plus全套基础代码

告别重复劳动:MyBatisX插件在MyBatis Plus项目中的高效实践 每次启动新项目时,面对数十张数据库表和数百个字段,你是否也厌倦了手动编写那些格式固定的实体类、Mapper接口和Service层代码?在团队协作中,这种重复劳动不…...

VMware 17 开机自启实战:从配置到故障排查的完整指南

1. VMware 17开机自启基础配置 很多运维工程师在生产环境中都会遇到这样的需求:让VMware虚拟机像系统服务一样随宿主机自动启动。这个功能对于无人值守的服务器、工控机等场景特别重要。下面我就以VMware Workstation 17为例,手把手教你配置全过程。 首…...

HarmonyOS ArkWeb 系列之用户一复制,我就知道——剪贴板事件监听实战

文章目录 剪贴板事件有哪几个ArkTS 侧配置H5 侧的事件监听实现流程图:copy 事件拦截修改三种事件的使用场景对比一个实用的"只允许粘贴纯文本"方案踩坑记录写在最后 上一篇讲了怎么用代码主动读写剪贴板。但有时候需求不是主动操作,而是监听—…...

告别硬编码!用Python importlib实现动态插件加载(附完整代码)

告别硬编码!用Python importlib实现动态插件加载(附完整代码) 在构建复杂系统时,插件化架构已成为提升代码灵活性和可扩展性的黄金标准。想象一下,当你的应用需要在不重启服务的情况下动态添加新功能,或者允…...

【STM32】GuiLite在HAL库环境下的轻量级GUI移植实战

1. GuiLite框架简介 第一次接触GuiLite是在一个资源紧张的STM32F103项目上,当时需要给设备加个简单的用户界面,但传统的GUI框架动不动就几十KB的代码量实在吃不消。GuiLite这个只有5千行C代码的轻量级框架完美解决了我的痛点。 它的核心优势可以用三个关…...

KUKA机器人FSoE安全地址丢了别慌!手把手教你用WorkVisual 6.0找回(附KRC4标准柜地址表)

KUKA机器人FSoE安全地址丢失应急修复指南:WorkVisual 6.0实战全解析 当产线突然报警停机,示教器闪烁"FSoE安全地址丢失"的红色警告时,经验丰富的维护工程师都知道——这往往是EtherCAT网络拓扑结构异常引发的紧急故障。尤其在采用K…...

STM32固件防抄攻略:手把手教你用Programmer CLI读取芯片ID并实现简易加密

STM32固件防抄实战:基于芯片ID的低成本加密方案设计与实现 在硬件产品开发中,固件安全往往是被忽视的一环。许多中小团队在产品量产前夕才意识到,精心设计的电路和算法可能因为固件被轻易复制而失去竞争优势。STM32系列MCU凭借其丰富的产品线…...

把ESP-01S变成智能开关:51单片机+ESP8266的简易物联网项目实战

从零打造智能灯控系统:51单片机ESP-01S物联网实战指南 项目背景与核心思路 在智能家居领域,远程控制灯光是最基础却最实用的功能之一。传统方案往往需要购买成套的智能家居设备,成本高昂且灵活性不足。而借助51单片机和ESP-01S WiFi模块的组合…...

Android MediaCodec解码实战:从H.264文件到ImageView,同步与异步模式代码对比与避坑指南

Android MediaCodec解码实战:同步与异步模式深度解析与性能优化 在移动端视频处理领域,Android MediaCodec作为系统级硬件加速接口,一直是开发者实现高效视频解码的首选方案。但面对同步与异步两种工作模式的选择,许多中高级开发者…...

Spike Prime避坑指南:Python控制电机和传感器时,新手最常遇到的5个错误及解决方法

Spike Prime避坑指南:Python控制电机和传感器时新手最常遇到的5个错误 第一次用Python控制Spike Prime的电机和传感器时,那种期待和兴奋很快就会被各种报错消磨殆尽。明明照着官方文档写的代码,电机就是不转;传感器读数永远为零&a…...

CircuitMind框架:突破LLM在数字电路设计中的布尔优化障碍

1. 项目概述:CircuitMind框架的创新价值在数字电路设计领域,布尔优化一直是硬件工程师面临的核心挑战。传统设计流程中,工程师需要手动应用卡诺图、奎因-麦克拉斯基算法等技巧来优化门级网表,这一过程既耗时又高度依赖专家经验。近…...