【Zabbix】Zabbix结合WxPusher推送告警消息

WxPusher简单介绍

什么是WxPusher

WxPusher (微信推送服务)是一个使用微信公众号作为通道的,实时信息推送平台,你可以通过调用API的方式,把信息推送到微信上,无需安装额外的软件,即可做到信息实时通知。 你可以使用WxPusher来做服务器报警通知、抢课通知、抢票通知,信息更新提示等。

快速入门

整体架构

在接入之前,你可以看一下架构图,有助于你理解单发,群发的区别。
在这里插入图片描述

注册并且创建应用

https://wxpusher.zjiecode.com/admin/ ,使用微信扫码登录,无需注册,新用户首次扫码自动注册。

创建一个应用,如下图:
在这里插入图片描述

回调地址 :可以不填写,不填写用户关注的时候,就不会有回调,你不能拿到用户的UID,参考回调说明。

设置URL:可以不填写,填写以后,用户在微信端打开「我的订阅」,可以直接跳转到这个地址,并且会携带uid作为参数,方便做定制化页面展示。

联系方式:可以不填写,告诉用户,如何联系到你,给你反馈问题。

关注提示:用户关注或者扫应用码的时候发送给用户的提示,你可以不填写,Wxpusher会提供一个默认文案。你也可以在用户关注回调给你UID的时候,再主动推送一个提示消息给用户。

说明:描述一下,你的应用,推送的是啥内容,用户通过链接关注,或者在微信端查看的时候可以看到。

获取appToken

在你创建应用的过程中,你应该已经看到appToken,如果没有保存,可以通过下面的方式重制它。

打开应用的后台https://wxpusher.zjiecode.com/admin/,从左侧菜单栏,找到appToken菜单,在这里,你可以重置appToken,请注意,重置后,老的appToken会立即失效,调用接口会失败。

扫码关注应用

创建应用以后,你可以看到应用的应用码和关注链接,你可以让你的用户通过下面2种方式来关注你的应用,关注你的应用以后,你就可以给他发送消息了。
在这里插入图片描述

获取UID

目前有3种方式获取UID:

  1. 关注公众号:wxpusher,然后点击「我的」-「我的UID」查询到UID;
  2. 通过创建参数二维码接口创建一个定制的二维码,用户扫描此二维码后,会通过用户关注回调把UID推送给你;
  3. 通过创建参数二维码接口创建一个定制的二维码,然后用查询扫码用户UID接口,查询扫描此二维码的用户UID;

发送消息

拿到UID以后,配合应用的appToken,然后调用发送接口发送消息。

WxPusher限制说明

WxPusher是免费的推送服务,为了能更好的服务大家,这里说明一下系统相关数据限制

  • 消息发送,必须合法合规,发送违规违法欺诈等等非正常消息,可能被封号;
  • WxPusher推送的是实时消息,时效性比较强,过期以后消息也就没有价值了,目前WxPusher会为你保留7天的数据
    ,7天以后不再提供可靠性保证,会不定时清理历史消息;
  • 单条消息的数据长度(字符数)限制是:content<40000;summary<100;url<400;
  • 单条消息最大发送UID的数量<2000,单条消息最大发送topicIds的数量<5;
  • 单个微信用户,也就是单个UID,每天最多接收1000条消息,请合理安排发送频率。

Zabbix Server服务器端准备及脚本准备

进入到Zabbix Server服务器安装Python脚本中需要的python库及查看脚本存放路径

[root@whzabbix alertscripts]# cat /etc/zabbix/zabbix_server.conf | grep alertscripts
AlertScriptsPath=/usr/lib/zabbix/alertscripts
[root@whzabbix alertscripts]# pip install requests

创建python脚本文件

[root@whzabbix alertscripts]# vim zabbix-python-robot.py

(需要修改机器人的APP_TOKEN的值)

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import datetime
import json
import logging
import os
import sys

try:
    import requests
except ImportError:
    import subprocess
    import sys


    def install(package):
        subprocess.call([sys.executable, "-m", "pip3", "install", package])


    install("requests")

    import requests

# 获取当前时间
current_time = datetime.datetime.now()

# 生成日志文件名
log_filename = current_time.strftime("%Y%m%d%H%M%S") + "_WXPusher.log"

# 定义日志文件夹路径
log_folder = ""

# 判断操作系统类型
if os.name == "nt":  # Windows
    log_folder = os.path.join(os.getcwd(), log_filename)
else:  # 非Windows
    log_folder = "/var/log/wxpusher/"
    os.makedirs(log_folder, exist_ok=True)
    log_folder = os.path.join(log_folder, log_filename)

log_format = "%(asctime)s - %(levelname)s - %(message)s"
# 配置日志记录器
logging.basicConfig(
    level=logging.INFO,  # 设置日志级别为 DEBUG
    format=log_format,  # 设置日志格式
    filename=log_folder,  # 设置日志文件名
)

# 创建一个控制台处理程序
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
console_formatter = logging.Formatter(log_format)
console_handler.setFormatter(console_formatter)

# 获取根记录器并添加控制台处理程序
root_logger = logging.getLogger()
root_logger.addHandler(console_handler)

# 删除旧的日志文件
if os.name != "nt":  # 非Windows
    for root, dirs, files in os.walk(log_folder):
        for file in files:
            file_path = os.path.join(root, file)
            file_modified_time = os.path.getmtime(file_path)
            if file_modified_time < (datetime.datetime.now() - datetime.timedelta(days=30)).timestamp():
                os.remove(file_path)


def get_wxuser_info(app_token, page=1, page_size=100, uid=None, is_block=False, user_type=0):
    # 请求参数
    params = {
    
    
        "appToken": app_token,  # appToken 应用密钥标志
        "page": page,  # page 请求数据的页码
        "pageSize": page_size,  # pageSize 分页大小,不能超过100
        "uid": uid,  # uid 用户的uid,可选,如果不传就是查询所有用户,传uid就是查某个用户的信息。
        "isBlock": is_block,  # isBlock 查询拉黑用户,可选,不传查询所有用户,true查询拉黑用户,false查询没有拉黑的用户
        "type": user_type  # type 关注的类型,可选,不传查询所有用户,0是应用,1是主题。 返回数据:
    }

    # 发送GET请求
    response = requests.get('https://wxpusher.zjiecode.com/api/fun/wxuser/v2', params=params)

    # 解析响应结果
    if response.status_code == 200:
        logging.info('获取用户UID列表成功')
        data = response.json()
        if data['msg'] == '处理成功':
            users = data['data']['records']
            users_uid = [user['uid'] for user in users]
            return users_uid
    else:
        logging.error('获取用户UID列表失败')

    return []


def send_wx_message(app_token, summary, content, users_uid):
    # 请求头信息
    headers = {
    
    
        'Content-Type': 'application/json'
    }

    # 请求数据
    data = {
    
    
        "appToken": app_token,
        "content": content,
        "summary": summary,
        "contentType": 2,
        "uids": users_uid,
        "verifyPay": False
    }

    # 在关键位置记录日志
    logging.info(f'发送主题:{
      
      summary}')
    logging.info(f'发送内容:{
      
      content}')
    logging.info('发送消息开始')

    # 发送POST请求
    response = requests.post('https://wxpusher.zjiecode.com/api/send/message', headers=headers, data=json.dumps(data))

    # 判断请求是否成功,并记录日志
    if response.status_code == 200:
        logging.info('消息发送成功')
    else:
        logging.error('消息发送失败')


# 调用函数发送消息
# 定义要发送的人,也就是zabbix webUI配置的"{ALERT.SENDTO}"参数对应的值
touser = sys.argv[1]

logging.info('整个脚本开始运行')
app_token = "AT_XXXXXXXXXXXXXX"  #修改此处的APP_TOKEN
# 定义要发送的主题,也就是zabbix webUI配置的"{ALERT.SUBJECT}"参数对应的值
summary = sys.argv[2]
# 定义要发送的消息内容,也就是zabbix webUI配置的"{ALERT.MESSAGE}"参数对应的值
content = sys.argv[3]
users_uid = get_wxuser_info(app_token)  # 填入具体的用户UID列表
send_wx_message(app_token, summary, content, users_uid)
logging.info('整个脚本结束运行')

修改脚本的执行权限

[root@whzabbix alertscripts]# chmod +x zabbix-python-robot.py

测试发送消息

脚本执行的格式

[root@whzabbix alertscripts]# ./zabbix-python-robot.py userid ce shi

如上所示,脚本执行需要携带3个参数:

参数1:需要提醒的用户名的“账号” [此参数并未调用,但不能省略]
参数2:发送消息的主题
参数3:发送消息的内容

测试结果

在这里插入图片描述在这里插入图片描述

Zabbix Web端添加告警源

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

Zabbix Web端告警源测试

在这里插入图片描述
在这里插入图片描述

Zabbix Web端告警源绑定到用户并合理设置需要WxPusher推送的消息级别

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/u012153104/article/details/133065277
今日推荐