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

python发送企业微信群webhook消息(文本、文件)

import datetime
import os
import time
from copy import copyimport requests
from loguru import logger
from urllib3 import encode_multipart_formdataclass WeiXin_Robot:def __init__(self,url: str = ""):# 测试cartest_url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx"self.url = url or test_urlself.mHeader = {'Content-Type': 'application/json; charset=UTF-8'}def send_cars_msg(self, car_dict):logger.info(f"{car_dict=}")cars = f"  ##通知\n" \f"一一一一一一一一一一一一一一\n"for vin, info in car_dict.items():info_str = f"{vin}:<font color=\"info\">{info}</font>\n"cars += info_strdata = {"msgtype": "markdown","markdown": {'content': cars}}self.send(data=data)def send_error_msg(self, info):data = {"msgtype": "text","text": {"content":f"企业微信异常提醒\n"f"问题描述:{info.get('desc')}\n"f"名称:{info.get('name')}\n"f"id:{info.get('media_id')}\n","mentioned_mobile_list": ["18817957261"]}}self.send(data=data)def send(self, data):try:info = requests.post(url=self.url, json=data, headers=self.mHeader)if info.json().get("errcode") == 0 and info.json().get("errmsg") == "ok":logger.info(f"企业微信通知发送成功,msg={info.json()}")else:logger.warning(f"企业微信通知发送异常,{info.json()=}")except Exception as e:logger.warning("企业微信通知发送异常")logger.warning(e)pass# file_path: e.g /root/data/test_file.xlsx# 如果D:\\windows\\ 下面file_name的split需要调整一下# upload_file 是为了生成 media_id, 供消息使用def upload_file(self, file_path):try:key = self.url.split('=')[1]wx_upload_url = f"https://qyapi.weixin.qq.com/cgi-bin/webhook/upload_media?key={key}&type=file"file_name = file_path.split("/")[-1]with open(file_path, 'rb') as f:length = os.path.getsize(file_path)data = f.read()print(file_name)headers = {"Content-Type": "application/octet-stream"}params = {"name": 'media',"filename": file_name,"filelength": length,}file_data = copy(params)file_data['file'] = (file_path.split('/')[-1:][0], data)encode_data = encode_multipart_formdata(file_data)file_data = encode_data[0]headers['Content-Type'] = encode_data[1]r = requests.post(wx_upload_url, data=file_data, headers=headers)print(r.text)if r.json().get("errcode") == 0 and r.json().get("errmsg") == "ok":logger.info(f"上传文件到企业微信成功,msg={r.json()},{file_path=}")media_id = r.json()['media_id']return media_idelse:logger.warning(f"上传文件到企业微信异常,{r.json()=},{file_path=}")except Exception as e:logger.warning("上传文件到企业微信失败")logger.warning(e)pass# media_id 通过上一步上传的方法获得def send_file(self, file_path=None, media_id=""):"""企业微信发送文件"""if not media_id:media_id = self.upload_file(file_path=file_path)time.sleep(1)try:# headers = {"Content-Type": "text/plain"}data = {"msgtype": "file","file": {"media_id": media_id}}for i in range(3):r = requests.post(url=self.url, json=data, headers=self.mHeader)if r.json().get("errcode") == 0 and r.json().get("errmsg") == "ok":logger.info(f"企业微信发送文件成功,msg={r.json()},{file_path=},{media_id=}")breakelse:logger.warning(f"企业微信发送文件异常,{r.json()=},{file_path=}")logger.warning('3s后再次尝试发送文件...')time.sleep(3)if i == 2:self.send_error_msg(info={'desc': f'企业微信发送文件异常',"name": file_path,'media_id': media_id,})# print(r.text)except Exception as e:logger.warning("企业微信发送文件异常")logger.warning(e)passif __name__ == "__main__":pass

相关文章:

  • 我应该删除低质量页面以提高Google排名吗?
  • k8s中label标签、deployment控制器、service、ipvs管理简介
  • Yuhan Blu-ray DVD Creator for Mac: 打造专属的高清视听盛宴
  • 功率放大器的种类和作用是什么
  • Gluster安装
  • cartographer去ros
  • org.springframework.cloud:spring-cloud-starter-openfeign:jar is missing详解
  • Spring MVC的常用注解(设置响应篇)
  • 3D网页游戏外包开发引擎
  • “排队领奖,购物狂欢!开启全新商业模式
  • Mybatis学习
  • springsecurity详解
  • 万字解析设计模式之工厂方法模式与简单工厂模式
  • HTTP/HTTPS、SSL/TLS、WS/WSS 都是什么?
  • 【AD9361 数字接口CMOS LVDSSPI】C 并行数据 LVDS
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • 2017年终总结、随想
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • angular2开源库收集
  • C# 免费离线人脸识别 2.0 Demo
  • java中具有继承关系的类及其对象初始化顺序
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • pdf文件如何在线转换为jpg图片
  • Promise初体验
  • python docx文档转html页面
  • socket.io+express实现聊天室的思考(三)
  • spring学习第二天
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • VuePress 静态网站生成
  • vue的全局变量和全局拦截请求器
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 区块链分支循环
  • 如何用vue打造一个移动端音乐播放器
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • # 飞书APP集成平台-数字化落地
  • #laravel 通过手动安装依赖PHPExcel#
  • #pragma once
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (AngularJS)Angular 控制器之间通信初探
  • (python)数据结构---字典
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (补)B+树一些思想
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (转)VC++中ondraw在什么时候调用的
  • (转)大型网站的系统架构
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .NET 反射的使用
  • .net反编译的九款神器