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:
- 关注公众号:wxpusher,然后点击「我的」-「我的UID」查询到UID;
- 通过创建参数二维码接口创建一个定制的二维码,用户扫描此二维码后,会通过用户关注回调把UID推送给你;
- 通过创建参数二维码接口创建一个定制的二维码,然后用查询扫码用户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端告警源测试