Python sanic框架钉钉和第三方打卡机实现
同样还是需要开通钉钉应用这里就不错多说了
第一步:梳理逻辑流程
前提:打卡的机器是使用postgres数据库,由于因为某些原因,钉钉userId 我已经提前获取到了存放到数据库里。
1.用户打卡成功后,我们应该监听数据库进行查询,然后获取到打卡的时间,在通过钉钉的工作消息接口,发送消息给当前考勤打卡的用户,这样用户就可以知道我上班的打卡时间!
现在我们看看应该怎么去实现
先定义钉钉接口先Token:
appkey = ""
appsecret = ""
ding_url = "https://oapi.dingtalk.com/"async def dingTalkToken():async with httpx.AsyncClient() as client:response = await client.get(ding_url + 'gettoken', params={"appkey": appkey, "appsecret": appsecret})# 解析响应JSONresult = response.json()# 提取Access Tokenaccess_token = result.get("access_token")return access_token
钉钉工作消息接口
async def dingTalkTokenAsyncsend_v2(access_token, kqTime, userid):params = {"agent_id": ,"msg": {"msgtype": "text","text": {"content": "打卡成功:" + kqTime}},"userid_list": userid}async with httpx.AsyncClient() as client:response = await client.post(ding_url + 'topapi/message/corpconversation/asyncsend_v2?access_token=' + access_token, params=params)# 解析响应JSONresult = response.json()# 提取Access Tokenerrcode = result.get("errcode")return errcode
以上向钉钉工作发送消息的接口已经完成了
接下来就是核心代码:
async def check_notifications():print('执行')try:# 连接到数据库with psycopg2.connect(dbname=posql.dbname, user=posql.user, password=posql.password, host=posql.host,port=posql.port) as connection:# 创建一个游标对象,用于执行 SQL 语句with connection.cursor() as cursor:# 执行查询cursor.execute("LISTEN punch_event_channel")while True:connection.commit() # 提交事务await asyncio.sleep(1)# 检查是否有通知connection.poll() # 从服务器获取通知if connection.notifies:notify = connection.notifies[0]# 执行查询cursor.execute("这填写打卡系统的数据库使用ID去查询最新
SELECT * FROM table WHERE id = %s" % int(notify.payload))# 获取查询结果result = cursor.fetchone()columns = [desc[0] for desc in cursor.description]result_dict = dict(zip(columns, result))# 处理 datetime 对象的序列化result_dict['timestamp'] = result_dict.get('timestamp', None)if result_dict['timestamp']:result_dict['timestamp'] = datetime.fromisoformat(result_dict['timestamp'])kqTime = result_dict['att_date'] + ' ' + result_dict['att_time']# 获取用户IDuser_name = result_dict['person_name']sql_str = """EXEC GetUserDingByName @UserName = N'%s';""" % user_nameuser_id = query_user_info(sql_str)if user_id != 'null':# 发送HTTP POST请求获取Access Tokenaccess_token = await dingTalkToken()codes = await dingTalkTokenAsyncsend_v2(access_token, kqTime, user_id)print(f"考勤时间: " + result_dict['att_date'] + ' ' + result_dict['att_time'])breakelse:break# 去执行 钉钉推送模块# messages = '发送成功'else:print({"notify_payload": '没有消息'})await asyncio.sleep(1)except Exception as e:print({"error": str(e)})
解释一下代码:
# 执行查询
cursor.execute("LISTEN punch_event_channel")
这里我是在考勤机器的数据库里做了一个punch_event_channel 的频道,而这个频道是我创建了一个触发函数用来触发最新数据库里的数据
接下来是创建触发函数
-- 创建触发器函数
CREATE OR REPLACE FUNCTION notify_punch_event()
RETURNS TRIGGER AS
$$
BEGINPERFORM pg_notify('punch_event_channel', 'new_punch_event');RETURN NEW;
END;
$$ LANGUAGE plpgsql;
-- 创建触发器,关联到表的 AFTER INSERT 事件上CREATE TRIGGER 触发器名称XXXXX
AFTER INSERT ON 表名
FOR EACH ROW
EXECUTE PROCEDURE notify_punch_event();
在sql 工具执行这两句就可以了,替换成你自己的数据库
另外这里是我内部拿取钉钉Userid的数据库,我就不放代码了:
# 获取用户ID
user_name = result_dict['person_name']
sql_str = """EXEC GetUserDingByName @UserName = N'%s';""" % user_name
user_id = query_user_info(sql_str)
你们可以根据自己方式,来获取
最后,就是使用定时任务来
async def periodic_task():while True:await check_notifications()await asyncio.sleep(1) # 1秒钟检查一次,可以根据需要调整间隔if __name__ == '__main__':# 启动定时任务app.add_task(periodic_task())# 启动 Sanic 应用app.run(host='0.0.0.0', port=8089, workers=8)
最后记得导入包
import psycopg2
import httpx
import pymssql # 这是sql server 数据库连接
如果写的好动动你们发财的小手点赞,对你有帮助也可以打赏请我喝杯咖啡,提提神,感谢各位兄弟了

相关文章:
Python sanic框架钉钉和第三方打卡机实现
同样还是需要开通钉钉应用这里就不错多说了 第一步:梳理逻辑流程 前提:打卡的机器是使用postgres数据库,由于因为某些原因,钉钉userId 我已经提前获取到了存放到数据库里。 1.用户打卡成功后,我们应该监听数据库进行查询…...
微信小程序性能优化
1. 代码包不包含插件大小超过 1.5 M 建议:小程序代码包单个包大小限制为2M。因此我们建议开发者在开发时,如果遇到单包体积大于1.5M的情况,可以采取分包的方式,把部分代码拆分到分包去,降低单个包的体积,提…...
java并发编程六 ReentrantLock,锁的活跃性
多把锁 一间大屋子有两个功能:睡觉、学习,互不相干。 现在小南要学习,小女要睡觉,但如果只用一间屋子(一个对象锁)的话,那么并发度很低 解决方法是准备多个房间(多个对象锁…...
深度学习 | DRNN、BRNN、LSTM、GRU
1、深度循环神经网络 1.1、基本思想 能捕捉数据中更复杂模式并更好地处理长期依赖关系。 深度分层模型比浅层模型更有效率。 Deep RNN比传统RNN表征能力更强。 那么该如何引入深层结构呢? 传统的RNN在每个时间步的迭代都可以分为三个部分: 1.2、三种深层…...
代理模式:中间者的故事
代理模式:中间者的故事 介绍需求分析代理模式代码实现代理模式整理和用途第一种用途第二种用途第三种用途第四种用途 总结 介绍 本文引用《大话设计模式》第七章节的内容进行学习分析,仅供学习使用 需求:小明拜托自己好朋友小王给他朋友小美…...
中间件系列 - Redis入门到实战(高级篇-多级缓存)
前言 学习视频: 黑马程序员Redis入门到实战教程,深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目 中间件系列 - Redis入门到实战 本内容仅用于个人学习笔记,如有侵扰,联系删除 学习目标 JVM进程缓存Lua语法入…...
是德科技E9304A功率传感器
是德科技E9304A二极管功率传感器测量频率范围为9 kHz至6 GHz的平均功率,功率范围为-60至20 dBm。该传感器非常适合甚低频(VLF)功率测量。E系列E9304A功率传感器有两个独立的测量路径,设计用于EPM系列功率计。功率计自动选择合适的功率电平路径。为了避免…...
视频格式网络地址转换视频到本地,获取封面、时长,其他格式转换成mp4
使用ffmpeg软件转换网络视频,先从官网下载对应操作系统环境的包 注意:网络地址需要是视频格式结尾,例如.mp4,.flv 等 官网地址:Download FFmpeg window包: linux包: 如果下载缓慢,下载迅雷安装使用…...
企业私有云容器化架构运维实战
什么是虚拟化: 虚拟化(Virtualization)技术最早出现在 20 世纪 60 年代的 IBM 大型机系统,在70年代的 System 370 系列中逐渐流行起来,这些机器通过一种叫虚拟机监控器(Virtual Machine Monitor,VMM&#x…...
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用UserSet功能保存和载入相机的各类参数(C++)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用UserSet功能保存和载入相机的各类参数(C) Baumer工业相机Baumer工业相机NEOAPISDK中UserSet的技术背景代码案例分享第一步:保存相机当前参数设置UserSet_Save第二步:载入已经保存…...
STM32的以太网外设+PHY(LAN8720)使用详解(3):PHY寄存器详解
0 工具准备 1.野火 stm32f407霸天虎开发板 2.LAN8720数据手册 3.STM32F4xx中文参考手册1 PHY寄存器 前面介绍到,站管理接口(SMI)允许应用程序通过2线时钟和数据线访问任意PHY寄存器,同时该接口支持访问最多32个PHY,也…...
缓存和缓冲的区别
近期被这两个词汇困扰了,感觉有本质的区别,搜了一些资料,整理如下 计算机内部的几个部分图如下 缓存(cache) https://baike.baidu.com/item/%E7%BC%93%E5%AD%98 提到缓存(cache),就…...
C++高级-STL库概述
目录 一、概念 二、STL的历史背景 三、STL的版本 四、STL的主要优势...
uniapp 统一获取授权提示和48小时间隔授权
应用商店审核要求 获取权限前需要给提示,拒绝之后48小时不能给弹窗授权 项目用的是uniapp getImagePermission(v?: string, tag?: any, source?: any, proj?: any) {// proj proj || vueSelf.$proj(tag, source);let data {state: false,//是否原生授权denied…...
Halcon点云重建
dev_close_window () *点云文件数据的读取 read_object_model_3d (‘E:/1.om3’, ‘mm’, [], [], ObjectModel3D, Status) *获得点云的数据,例如高度 get_object_model_3d_params (ObjectModel3D, ‘point_coord_z’, GenParamValue) dev_open_window (0, 0, 512, …...
docker学习(二十一、network使用示例container、自定义)
文章目录 一、container应用示例1.需要共用同一个端口的服务,不适用container方式2.可用示例3.停掉共享源的容器,其他容器只有本地回环lo地址 总结 二、自定义网络应用示例默认bridge,容器间ip通信默认bridge,容器间服务名不通 自…...
【Python机器学习系列】一文带你了解机器学习中的Pipeline管道机制(理论+源码)
这是Python机器学习原创文章,我的第183篇原创文章。 一、引言 对于表格数据,一套完整的机器学习建模流程如下: 背景知识1:机器学习中的学习器 【Python机器学习系列】一文搞懂机器学习中的转换器和估计器(附案例&…...
算法基础之整数划分
整数划分 核心思想: 计数类dp 背包做法 f[i][j] 表示 取 1 – i 的物品 总容量为j的选法数量 f[i][j] f[i-1][j] f[i-1][j-v[i]] f[i-1][j-2v[i]] f[i-1][j-3v[i]] ……f[i-1][j-kv[i]] f[i][j-v[i]] f[i-1][j-v[i]] f[i-1][j-2v[i]] f[i-1][j-3v[i]] ……f[i…...
关于“Python”的核心知识点整理大全47
目录 16.1.10 错误检查 highs_lows.py highs_lows.py 16.2 制作世界人口地图:JSON 格式 16.2.1 下载世界人口数据 16.2.2 提取相关的数据 population_data.json world_population.py 16.2.3 将字符串转换为数字值 world_population.py 2world_population…...
Android 8.1 设置USB传输文件模式(MTP)
项目需求,需要在电脑端adb发送通知手机端接收指令,将USB的仅充电模式更改成传输文件(MTP)模式,便捷用户在我的电脑里操作内存文件,下面是我们的常见的修改方式 1、android12以下、android21以上是这种方式…...
通义千问3-VL-Reranker-8B新手教程:零基础学会混合检索排序
通义千问3-VL-Reranker-8B新手教程:零基础学会混合检索排序 1. 认识这个强大的多模态排序工具 想象一下,你正在管理一个包含文字、图片和视频的庞大数据库。当用户搜索"户外运动装备"时,系统返回了100个结果——有些是产品描述文…...
DeepFace模型预下载全攻略:从根源解决首次运行痛点
DeepFace模型预下载全攻略:从根源解决首次运行痛点 【免费下载链接】deepface A Lightweight Face Recognition and Facial Attribute Analysis (Age, Gender, Emotion and Race) Library for Python 项目地址: https://gitcode.com/GitHub_Trending/de/deepface …...
Windows 11终极优化指南:用Win11Debloat免费提升51%系统性能
Windows 11终极优化指南:用Win11Debloat免费提升51%系统性能 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本,用于从Windows中移除预装的无用软件,禁用遥测,从Windows搜索中移除Bing,以及执行各种其他更改以简…...
pk3DS完全指南:解锁宝可梦3DS游戏的无限可能
pk3DS完全指南:解锁宝可梦3DS游戏的无限可能 【免费下载链接】pk3DS Pokmon (3DS) ROM Editor & Randomizer 项目地址: https://gitcode.com/gh_mirrors/pk/pk3DS 你是否已经厌倦了千篇一律的宝可梦冒险?每次遇到的野生宝可梦都相同ÿ…...
FastAPI安全防线:OAuth2 + JWT 实现无状态认证的完整流程
更多内容请见: 《Python Web项目集锦》 - 专栏介绍和目录 在现代Web应用开发中,安全认证是构建可靠API的基石。FastAPI通过其强大的安全组件,为开发者提供了实现安全、可扩展认证系统的工具。本文将深入剖析OAuth2与JWT在FastAPI中的整合实现,揭示无状态认证的完整流程,提…...
TypeScript迁移工具ts-migrate版本兼容性终极指南:如何确保JavaScript到TypeScript平滑升级
TypeScript迁移工具ts-migrate版本兼容性终极指南:如何确保JavaScript到TypeScript平滑升级 【免费下载链接】ts-migrate A tool to help migrate JavaScript code quickly and conveniently to TypeScript 项目地址: https://gitcode.com/gh_mirrors/ts/ts-migra…...
猫抓:重构网页资源获取与媒体管理的高效解决方案
猫抓:重构网页资源获取与媒体管理的高效解决方案 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 在数字内容爆炸的时代,网页资源获取已成为内容创作者、教育工作者和普通用户的…...
全志T3核心板DDR初始化失败:从ZQ校准误导到VREF电压偏差的排查实录
1. 问题现象与初步排查 那天早上刚到实验室,测试组的同事就急匆匆跑过来:"哥,又有三台设备启动不了,uboot都没跑起来!"我接过设备一看,果然又是熟悉的ZQ校准错误提示,这已经是本周第五…...
深度学习环境配置太麻烦?试试这个训练环境镜像,一键部署快速上手
深度学习环境配置太麻烦?试试这个训练环境镜像,一键部署快速上手 1. 为什么选择这个训练环境镜像 深度学习项目开发的第一步就是搭建环境,这个过程往往充满挑战: 需要手动安装CUDA、cuDNN、PyTorch等框架,版本匹配问…...
Python多线程/多进程内存爆炸真相:GIL锁外的隐性开销、共享对象深拷贝黑洞与零拷贝迁移方案
第一章:Python智能体内存管理策略入门导论Python智能体(如基于LLM的Agent、ReAct架构或Tool-Calling系统)在运行过程中频繁创建、传递与销毁对象,其内存行为远超普通脚本应用。理解CPython底层的引用计数、循环垃圾回收࿰…...
