首页 > 其他分享 >企业微信添加机器人,并给机器人发送消息

企业微信添加机器人,并给机器人发送消息

时间:2023-06-27 09:34:48浏览次数:36  
标签:微信 alarm 机器人 robot content headers 添加 text post

找一个企业微信的群聊,点击右上角的"...",添加群机器人。

 

 

创建一个机器人

 

 

填写机器人名字,添加机器人。

 

 

 

 保存这里的webhook地址,后面给机器人发消息,就是给这个地址post消息。

具体的配置文档,可以点这里的“配置说明”去了解。

 

下面介绍,使用py给机器人发送消息

 

出于隐私的考虑,这里机器人的webhook地址,手机号 是加了马赛克(xxx)的。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import requests
import json
headers={"Content-Type":"application/json","appType":"3","version":"5.1.0"}

#机器人地址(在申请成功机器人之后会有这个地址)
url="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxxx"

#要发送的消息
post_data={"msgtype":"text", "text":{"content": "hello python world.20230508"}}

post_data1={
    "msgtype": "text",
    "text": {
        "content": "hello world. i am lianghua robot.111",
        "mentioned_list":["[email protected]","@all"]
    }
}

post_data2={
    "msgtype": "text",
    "text": {
        "content": "您有告警信息,请注意查收",
        "mentioned_mobile_list": ["153xxxxxxxx", "135xxxxxxxx"]
    }
}

post_data3={
    "msgtype": "text",
    "text": {
        "content": "hello world. i am lianghua robot. 333",
        "mentioned_list":["[email protected]","@all"],
        "mentioned_mobile_list":["153xxxxxxx","135xxxxx"]
    }
}


post_markdown={
    "msgtype": "markdown",
    "markdown": {
        "content": """实时新增用户反馈 <font color="#800080">132例</font>,请相关同事注意。<@all>\n
        >类型:<font color="blue">用户反馈</font> 
        >普通用户反馈:<font color="red">117例</font> 
        >VIP用户反馈:<font color="green">15例</font>"""
    }
}



#json,data,2种方式都可以
#p_post = requests.post(url,headers=headers,data= json.dumps(post_data))
#p_post = requests.post(url,headers=headers,json=post_data)

# p_post = requests.post(url,headers=headers,json=post_data1)
# p_post = requests.post(url,headers=headers,json=post_data2)

#p_post = requests.post(url,headers=headers,json=post_markdown)
#p_post = requests.post(url,headers=headers,json=post_data2)

from algoproto.modules.robot_alarm import RobotAlarm
# 接收告警的用户手机号
user_mobile_list = ["135xxxxxxx"]
""" 添加机器人告警。如果计算的条数为0,就发出告警信息"""
robot_headers = {"Content-Type": "application/json", "appType": "3", "version": "5.1.0"}
# 机器人地址(在申请成功机器人之后会有这个地址)
robot_url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxxxx"
i_error_count = 0
robot_helper = RobotAlarm(robot_headers, robot_url, user_mobile_list)

errorlist: list = []  # 添加监控逻辑,返回监控错误
alarm_title = """懂牛选股计算(<font color="#FF0000">test.py</font>)告警"""

errorlist.append(f"> aa<font color='red'>save_data failed, {6666}</font>")
errorlist.append(f"> bb<font color='red'>get_index_data failed, {7777}</font>")

sql = """SELECT IND_UNI_CODE as "symbol",TRADE_DATE as "dt",PRE_CLOSE_PRICE,CLOSE_PRICE,OPEN_PRICE,HIGH_PRICE,LOW_PRICE,TRADE_VOL,TRADE_AMUT from {}.IND_BASIC_MQ where ISVALID =1 and TRADE_DATE={} """.format('abcde', 20230612)
errorlist.append(f"> cc<font color='#FF0000'>process_index dtint:{20230614}</font>,sql查询结果为0. \nsql:{sql}")

err_ret = robot_helper.robot_alarm_markdown(20230614, alarm_title, errorlist)
i_error_count += err_ret

content = """aabbccde 
def \n
aaaaa \n
"""
err_ret = robot_helper.robot_alarm_text(user_mobile_list, content)
i_error_count += err_ret

if i_error_count > 0:
    robot_helper.msg_at_someone(user_mobile_list)

 

 

这是写的一个 机器人类,把若干方法封装了一下。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# author:henry
# desc:企业微信机器人告警
# Date:20230614

import os
import sys
import copy
import math
import pandas as pd
import time
import requests
import json
from algoproto.common import logger


class RobotAlarm(object):
    def __init__(self, robot_headers:str,robot_url:str,user_mobile_list:[]):
        self.__robot_headers = robot_headers
        self.__robot_url = robot_url
        self.__user_mobile_list = user_mobile_list

    def set_robot_info(self,robot_headers:str,robot_url:str,user_mobile_list:[]):
        self.__robot_headers = robot_headers
        self.__robot_url = robot_url
        self.__user_mobile_list = user_mobile_list


    # markdown类型的告警信息,成功发送消息返回1.
    def robot_alarm_markdown(self,trade_day:int,alarm_title:str,errlist:list):
        """
        类似这样的告警信息

        懂牛选股计算(DN_XGB_FACTOR_2.py)告警,请相关同事注意。
        条数:3条
        日期:20230515
        指标ID:1118,CRXG5,创5日新高计算结果为0
        指标ID:1118,CRXG20,创20日新高计算结果为0
        指标ID:1118,CRXG60,创60日新高计算结果为0
        """
        start_tm1 = time.perf_counter()
        count_err= len(errlist)
        if 0 == count_err:
            return 0
        alarm_count=f'条数:<font color=\'warning\'>{count_err}条</font>'
        alarm_trade_day=f"交易日期:{trade_day}"

        alarm_sub_content=""
        for value in errlist:
            alarm_sub_content += value
            alarm_sub_content += "\n"

        alarm_content = f"{alarm_title},请相关同事注意。\n{alarm_count}\n{alarm_trade_day}\n{alarm_sub_content}\n<@所有人>"
        post_markdown={
            "msgtype": "markdown",
            "markdown":
                {"content": alarm_content}
        }
        p_post = requests.post(self.__robot_url,headers=self.__robot_headers,json=post_markdown)
        logger.info(f" post error msg1:{json.loads(p_post.text)}")
        logger.info(f"robot_alarm_markdown post_markdown:{post_markdown}")

        # '{"errcode":0,"errmsg":"ok"}'
        ret_dict = json.loads(p_post.text)
        if 0==ret_dict["errcode"]:
            logger.info(f"企业微信告警消息,发送正常。")
        else:
            logger.info(f"企业微信告警消息,发送异常。")
            alarm_sub_content2 = alarm_sub_content[0:2000]
            alarm_sub_content2 +="\n.......\n"
            alarm_sub_content2 +="<font color='red'>错误消息内容超过4096,部分告警消息发送不出来,请排查问题。</font>"
            alarm_content2 = f"{alarm_title},请相关同事注意。\n{alarm_count}\n{alarm_trade_day}\n{alarm_sub_content2}\n<@all>"
            post_markdown2 = {"msgtype": "markdown","markdown": {"content": alarm_content2}}
            p_post2 = requests.post(self.__robot_url,headers=self.__robot_headers,json=post_markdown2)
            logger.info(f" post error msg2:{json.loads(p_post2.text)}")

        start_tm2 = time.perf_counter()
        logger.info(f"post error msg cost:{round(start_tm2 - start_tm1, 4)}")
        return 1


    # text类型的告警信息...
    def robot_alarm_text(self,user_mobile_list:[],content:str):
        start_tm1 = time.perf_counter()
        if len(user_mobile_list)==0:
            user_mobile_list.append("@all")
        post_text = {
            "msgtype": "text",
            "text": {
                "content": content,
                "mentioned_mobile_list":user_mobile_list
            }
        }
        p_post = requests.post(self.__robot_url,headers=self.__robot_headers, json=post_text)
        ret_dict = json.loads(p_post.text)
        logger.info(f"post error msg1:{json.loads(p_post.text)}")
        logger.info(f"robot_alarm_text post_text:{post_text}")

        # '{"errcode":0,"errmsg":"ok"}'
        if 0 == ret_dict["errcode"]:
            logger.info(f"企业微信告警消息,发送正常。")
        else:
            logger.info(f"企业微信告警消息,发送异常。")
            alarm_content2 = content[0:1500]
            alarm_content2 += "\n.......\n"
            alarm_content2 += "错误消息内容超过2048,部分告警消息已截断,请排查问题"
            post_text2 = {
                "msgtype": "text",
                "text": {
                    "content": alarm_content2,
                    "mentioned_mobile_list": user_mobile_list
                }
            }
            p_post2 = requests.post(self.__robot_url, headers=self.__robot_headers, json=post_text2)
            logger.info(f" post error msg1:{json.loads(p_post2.text)}")

        start_tm2 = time.perf_counter()
        logger.info(f"post error msg cost:{round(start_tm2 - start_tm1, 4)}")
        return 1

    # 这个方法主要是用来 @指定成员 的,markdown暂时还没研究出来如何 @指定成员
    def msg_at_someone(self,user_mobile_list:[]):
        if len(user_mobile_list)==0:
            user_mobile_list.append("@all")
        post_text = {
            "msgtype": "text",
            "text": {
                "content": "您有告警信息,请注意查收",
                "mentioned_mobile_list":user_mobile_list
            }
        }
        p_post = requests.post(self.__robot_url,headers=self.__robot_headers, json=post_text)
        ret_dict = json.loads(p_post.text)
        logger.info(f" message ret:{ret_dict}")
        return 0

 

 给机器人发消息,就是一个Post请求。把要发送的内容放在json参数字段,Url是机器人地址。

 requests.post(self.__robot_url,headers=self.__robot_headers,json=post_markdown)         再来一个robot的使用示例:  
import requests
import json

def robot_alarm(trade_day:int,alarm_title:str,errlist:list):
    """ 添加机器人告警。如果计算的条数为0,就发出告警信息"""
    headers={"Content-Type":"application/json","appType":"3","version":"5.1.0"}
    #机器人地址(在申请成功机器人之后会有这个地址)
    url="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

    errlist.append(f">指标521-XG_KPDRise3Days,<font color='red'>庄家控盘_控盘3日递增,计算结果为0</font>")
    errlist.append(f">指标521-XG_YellowDKP,<font color='red'>庄家控盘_黄柱低控盘,计算结果为0</font>")
    errlist.append(f">指标521-XG_RedZKP,<font color='red'>庄家控盘_红柱中控盘,计算结果为0</font>")


    str_count= len(errlist)
    alarm_count=f'条数:<font color=\'warning\'>{str_count}条</font>'
    alarm_trade_day=f"日期:{trade_day}"

    alarm_sub_content=""
    for value in errlist:
        alarm_sub_content += value
        alarm_sub_content += "\n"

    alarm_content = f"{alarm_title},请相关同事注意。\n{alarm_count}\n{alarm_trade_day}\n{alarm_sub_content}\n<@所有人>"
    post_markdown={
    "msgtype": "markdown",
    "markdown": {
        "content": alarm_content
        }
    }
    print("content is:",len(post_markdown["markdown"]["content"]))
    p_post = requests.post(url,headers=headers,json=post_markdown)
    print(p_post.text)
    return

result_map={}
"""
result_map["521-XG_KPDRise3Days"]="庄家控盘_控盘3日递增,计算结果为0"
result_map["521-XG_YellowDKP"]="庄家控盘_黄柱低控盘,计算结果为0"
result_map["521-XG_RedZKP"]="庄家控盘_红柱中控盘,计算结果为0"
"""

errlist22=[]
alarm_title = "懂牛选股计算(DN_XGB_FACTOR_2.py)告警"

robot_alarm(20230516,alarm_title,errlist22)

print("errlist22:",errlist22)

 

从示例中可以看到,最核心的就是一个 Post 函数调用。

 

标签:微信,alarm,机器人,robot,content,headers,添加,text,post
From: https://www.cnblogs.com/music-liang/p/17507796.html

相关文章

  • 微信海量数据查询如何从1000ms降到100ms? 转载
    微信的多维指标监控平台,具备自定义维度、指标的监控能力,主要服务于用户自定义监控。作为框架级监控的补充,它承载着聚合前45亿/min、4万亿/天的数据量。当前,针对数据层的查询请求也达到了峰值40万/min,3亿/天。较大的查询请求使得数据查询遇到了性能瓶颈:查询平均耗时>1000ms,失败......
  • 【Azure 事件中心】Kafka 生产者发送消息失败,根据失败消息询问机器人得到的分析步骤
    问题描述AzureEventHubs--Kafka生产者发送消息存在延迟接收和丢失问题,在客户端的日志中发现如下异常:2023-06-0502:00:20.467[kafka-producer-thread|producer-1]ERRORcom.deloitte.common.kafka.CommonKafkaProducer-messageId:9235f334-e39f-b429-227e-45cd30dd6486......
  • ABB机器人选项包,密钥,三种方法,真实、虚拟、密钥三种方法,有教程、有软件、也有密钥。
    ABB机器人选项包,密钥,三种方法,真实、虚拟、密钥三种方法,有教程、有软件、也有密钥。原创文章,转载请说明出处,资料来源:http://imgcs.cn/5c/661261334891.html......
  • Spring Boot 形参Map并没有添加到类似于ModelAndView中,但是却可以页面取到相应的值?
    需求缘起:      有网友留言:感谢讲解,思路很清晰,不过有点疑惑,为什么最后结尾的时候,那个形参Map并没有添加到类似于ModelAndView中,但是页面却可以取到相应的值? 本节大纲:(1)留言代码翻译(2)问题分析(3)SpringMVC数据模型(4)写法延伸       接下来看下具体的内容:留言代码翻译:我......
  • 微信小程序文件上传、下载
    微信小程序的附件上传下载。上传后并支持打开 1、wxml定义<view><van-uploaderclass="autoField"bind:after-read="afterRead......
  • Kubernetes添加用户
    kubernetes中有两种用户,一种是serviceaccount,另一种是普通用户ServiceAccount认证从1.24开始,创建serviceaccount的同时不再创建secretapiVersion:v1kind:ServiceAccountmetadata:name:kubepi-usernamespace:kube-system---apiVersion:rbac.authoriz......
  • 在VScode中,文件自动添加头部注释-插件koroFileHeader配置
    1、扩展商店,搜索koroFileHeader进行安装2、打开设置-搜索Fileheader-点击头部注释的setting.json文件3、可以在其中配置头部注释"fileheader.customMade":{"Author":"gitconfiguser.name",//作者//"Author":"gitconfiguser.name",//可以获......
  • centos添加服务
    一、添加服务启动脚本#!/bin/bashexportJAVA_HOME=/usr/java/jdk1.8.0_201exportPATH=$JAVA_HOME/bin:$PATH#注意,这里的文件都必须是绝对路径nohupjava-jar/luban/app/deploy/deploy-0.0.1-SNAPSHOT.war>/luban/app/deploy/nohup.out&echo"启动完成"二、添......
  • flask中添加路由的方式
    在Flask中,添加路由有两种方式:(一般情况下都是用第一种方式)方式一:常见的装饰器模式@app.route("/")defindex():return"HelloWorld"方式二:通过阅读装饰器模式添加路由的源码发现 defroute(self,rule,**options):"""Adecoratorthatisusedtoregistera......
  • uniapp微信小程序转支付宝小程序踩坑(持续更新)
    首先第一个,真有被折磨到!//微信正常使用,支付宝不行<imagesrc="https://static.dabapiao.com/images/coupon-index.png"mode=""/>//以下两种微信、支付宝都正常使用<imagesrc="https://static.dabapiao.com/images/coupon-index.png"mode="aspectFill&quo......