zabbix通过微信企业号发送图文消息

我有篇博客写到如何用微信发送告警消息,实现了发送文字消息,不能带图片,这样不是很直观,最近又研究了一下如何发送图片,写了脚本实现了发送文字+图片的告警。

效果如下:

先发送文字消息,下面挨着graph。



这里只提供脚本和思路,具体配置请看我的另一篇博客:(http://wuhf2015.blog.51cto.com/8213008/1688614#662543)

实现方式:

  1. 在Action中设置Default Subject的格式为"状态:#{TRIGGER.STATUS}#主机:#{HOST.NAME}#键名:#{ITEM.KEY}#"。这样可以在脚本里做判断,如果状态为OK则不发送图片,如果状态为problem则发送图片。

  2. 脚本有了{HOST.NAME}和{ITEM.KEY}这两个参数后,可以通过查询Mysql或者调用zabbix_api的方式得到我们必要的变量ItemID,有了这个变量才能获取图片。
  3. 通过itemid从zabbix中获取图片后,我们需要将图片上传到微信企业号的临时素材里,上传后我们会得到一个media_id
  4. 我们将media_id通过image格式发送出来就能收到图片消息了。



脚本:

#!/bin/bash
#SCRIPT_NAME:weixin.sh
#get graph to you
#V2-2016-05-23
#wuhf
#email:[email protected]

gettoken() {
ID=‘xxxxxxxxxxxxxxxxxxxxxxxxxxxx‘
SECRET=‘xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx‘
URL="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$ID&corpsecret=$SECRET"
Gtoken=$(/usr/bin/curl -s -G $URL | awk -F\" ‘{print $4}‘)
}
gettoken

AppID=3
PartyID=2
UserID="$1"
Title="$2"
Msg="$3"

getitemid() {
DBServer="127.0.0.1"
DBUser="root"
DBName="zabbix"
DBPort="3306"
DBPassword="123456"
Hostname=$(echo $Title |awk -F"#" ‘{print $4}‘)
Key=$(echo $Title |awk -F"#" ‘{print $6}‘)
Return=$(sudo mysql -u$DBUser -h$DBServer -P$DBPort -p$DBPassword --database=$DBName -e "select itemid from items where hostid=(select hostid from hosts where name = \"$Hostname\" ) and key_ = \"$Key\";")
Itemid=$(echo $Return |awk ‘{print $2}‘)
}
#获取itemid可以通过数据库查询,也可以通过zabbix_api,我自己用的是api
#getitemid

getgraph() {
zabbix_user=‘xxxxxxxxxxxxxxxxxx‘
zabbix_pass=‘xxxxxxxxxxxxxxxxxx‘
zabbix_url="http://127.0.0.1/zabbix/"
cookie="/tmp/cookie"
image_path="/tmp/"
STime=$(date +%Y%m%d%H%M%S)
Period=7200
Width=640
High=200
sudo /usr/bin/curl -s -c $cookie -b $cookie -d "name=$zabbix_user&password=$zabbix_pass&autologin=1&enter=Sign+in" $zabbix_url/index.php
sudo /usr/bin/curl -s -b $cookie -F "itemids=$Itemid" -F "period=$Period" -F "stime=$STime" -F "width=$Width" -F "high=$High" $zabbix_url/chart.php > $image_path$Itemid.png
}
#定义这个函数是要利用上面的itemid获取图片保存到/tmp下面
#getgraph

postgraph() {
PIC_URL="$image_path$Itemid.png"
M_URL="https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token=$Gtoken&type=image"
Media=$(sudo curl -s -F [email protected]"$PIC_URL" "$M_URL" | awk -F"\"" ‘{print $8}‘)
}
#定义这个函数是要将/tmp下面的png文件上传到微信临时素材接口,永久素材接口有上限5000,所以不建议使用
#postgraph
#debug
#echo $PIC_URL$Media > /tmp/pic.txt

image() {
    printf ‘{\n‘
    printf ‘\t"touser": "‘"$UserID"\"",\n"
    printf ‘\t"toparty": "‘"$PartyID"\"",\n"
    printf ‘\t"msgtype": "image",\n‘
    printf ‘\t"agentid": "‘" $AppID "\"",\n"
    printf ‘\t"image": {\n‘
    printf ‘\t\t"media_id": "‘"$Media"\""\n"
    printf ‘\t},\n‘
    printf ‘\t"safe":"0"\n‘
    printf ‘}\n‘
}

text() {
    printf ‘{\n‘
    printf ‘\t"touser": "‘"$UserID"\"",\n"
    printf ‘\t"toparty": "‘"$PartyID"\"",\n"
    printf ‘\t"msgtype": "text",\n‘
    printf ‘\t"agentid": "‘" $AppID "\"",\n"
    printf ‘\t"text": {\n‘
    printf ‘\t\t"content": "‘"$Msg"\""\n"
    printf ‘\t},\n‘
    printf ‘\t"safe":"0"\n‘
    printf ‘}\n‘
}

#我这里定义image和text两个格式,是要将一条告警消息分两次发送,先发送text然后发送图片,原因就是微信企业号提供的news发送的为图片链接,如果zabbix是内网监听,那么链接就无意义了,而mpnews每天最多发送100条,超过就返回错误,所以放弃。

url="https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$Gtoken"

if echo $Title | grep "PROBLEM" ;then
getitemid
getgraph
postgraph
sudo /usr/bin/curl --data-ascii "$(text)" $url
sudo /usr/bin/curl --data-ascii "$(image)" $url
sudo rm -f $PIC_URL
else
sudo /usr/bin/curl --data-ascii "$(text)" $url
fi


互相学习:

脚本参照了下面这两篇博客:

时间: 2024-10-11 07:25:06

zabbix通过微信企业号发送图文消息的相关文章

Python实现通过微信企业号发送文本消息的Class

前文<Python实现获取微信企业号access_token的Class>提供了获取微信企业号的access_token,本文中的代码做实际发送文本消息. 编程要点和调用方法: 支持发送中文,核心语句"payload = json.dumps(self.data, encoding='utf-8', ensure_ascii=False)",关键字"python json 中文" 这个Class只有一个公共方法send(). 使用方法:import这个c

[实例]JAVA调用微信接口发送图文消息,不用跳到详情页

package com.test; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import org.junit.Test; import net.sf.json.JSONArray;

python与shell通过微信企业号发送消息

python与shell通过微信企业号发送信息,脚本来源于网络,做好搬运工,哈哈,相应的参考链接放在末位 shell版本: #!/bin/bash # CropID="xxxx" Secret="xxxxxx" GURL="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$CropID&corpsecret=$Secret" Gtoken=$(/usr/bin/curl -s -G

zabbix 设置微信企业号报警

一.发现问题 Zabbix之前一直用的是邮件报警,因为现在邮件不方便经常查看,所以今天决定试一试使用zabbix来发送报警. 二.分析问题 1.要用微信企业号发送告警,首先要申请微信企业号. 2.其次要写发送告警的脚本. 3.最后就是设置zabbix指定哪些人可以接收到信息. 三.解决问题 1. 申请并设置企业号, 微信企业号申请地址:https://qy.weixin.qq.com/ 如何申请企业号及配置可以参数下面链接: http://www.cnyunwei.com/thread-2959

微信企业号开发:接收消息和事件

接收到的消息和事件,其实都是微信post到我们配置的URL的消息.接收普通消息就是用户给公众号发送的消息,事件是由于用户的特定操作,微信post给我们的消息.被动响应消息是我们收到微信post过来的普通消息或者是事件时,企业号通过Response.Write这种方式回复的消息. 核心代码: 把微信post过来的数据先解密,转为能处理的XML,再把XML转为对象 #region 将POST过来的数据转化成实体对象 /// <summary> /// 将微信POST过来的数据转化成实体对象 ///

微信公众平台图文消息条数限制在1条以内

从2018年10月12日起,微信公众平台图文消息被限制为1条. 受影响的有 客服接口发送的图文消息,如 { "touser":"OPENID", "msgtype":"news", "news":{ "articles": [ { "title":"Happy Day", "description":"Is Reall

微信点击图文消息链接 在根据判断跳到另一个页面 但是 点关闭 将当前的关闭之后 会出现空白页

<script> function ss() { var u = navigator.userAgent; if (u.indexOf('Android') > -1 || u.indexOf('Linux') > -1) {//安卓手机location.href = '2.html?id=3323/#wechat_redirect'; } else if (u.indexOf('iPhone') > -1) {//苹果手机location.href = '2.html?id

C#开发微信.NET平台MVC微信开发 发送普通消息Demo以及收不到消息的问题

不得不说现在微信非常火,微信开放平台可以自己写程序跟用户交互,节省了前台开发成本,免去用户装客户端的烦恼.于是今天兴致来潮,想做一个试试. 首先找到了开发者文档,看了看,蛮简单的.(公众号早已申请,有兴趣可以关注看看:zyjsoft) 第一步(提供接口,供微信调用,由于是HTTP请求,于是我用MVC模式做了一个简单的接口): //认证接口 public ActionResult WeiXin(string signature, string timestamp, string nonce, st

zabbix调用telegram机器人发送报警消息

众所周知,telegram的机器人还是非常好用,而且是免费的,所以这就给监控系统发送报警消息提供了一个非常好的渠道,相信很多朋友已经垂涎三尺了,所以废话不多说,直奔主题吧!br/>?zabbix系统基础配置部分此处就直接跳过了,如果需求请参阅http://blog.51cto.com/183530300/category8.html?此处我们直接从创建机器人开始,当然创建机器人的前提是你要先有一个telegram账号,接下来是在telegram客户端上的操作了第一步:在搜索栏里直接使用@BotF