Notepad++Good Luck To You!

Zabbix微信企业订阅号报警设置
浏览: 2959    评论: 0

官方提供了较全的api,使用个人订阅号测试时,发现很多接口没有权限,无法获取订阅者openid,导致无法发送消息,然后要来了公司的企业订阅号来进行报警。微信公众号登录:https://mp.weixin.qq.com/微信api参考:http://m...


官方提供了较全的api,使用个人订阅号测试时,发现很多接口没有权限,无法获取订阅者openid,导致无法发送消息,然后要来了公司的企业订阅号来进行报警。

微信公众号登录:https://mp.weixin.qq.com/

微信api参考:http://mp.weixin.qq.com/wiki/16/992df48524118c3e89945856694b30cc.html

微信api在线调试:http://mp.weixin.qq.com/debug/

微信消息发送

1、获取access_token

官方api文档:

http://mp.weixin.qq.com/wiki/11/0e4b294685f817b95cbed85ba5e82b8f.html

说明:

    根据应用ID和应用密钥,获取access_token,每日获取token上限2000次,token的有效期为2小时。

 

2获取订阅者openid

官方api文档:

http://mp.weixin.qq.com/wiki/0/d0e07720fc711c02a3eab6ec33054804.html

说明:

    官方api不能直接根据用户帐号进行获取openid,而是通过获取所有的openid,在遍历openid找到用户名,最后得到用户名与openid的对应关系,然后把接受报警的用户的openid找到,并记录。

 

3、发送消息

官方api文档:

http://mp.weixin.qq.com/wiki/1/70a29afed17f56d537c833f89be979c9.html

说明:

    群发每天限制了4条,只能使用客服接口发送消息,条数上限为50w

    客服接口限制:当用户主动发消息给公众号的时候:(包括发送信息、点击自定义菜单、订阅事件、扫描二维码事件、支付成功事件、用户维权),开发者在一段时间内(目前修改为48小时)可以调用客服消息接口,通过POST一个JSON数据包来发送消息给普通用户,在48小时内不限制发送次数。所以48小时后,如果用户没有再触发上述事件,报警消息就无法发送。

 

4、微信报警python脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#!/usr/bin/env python
#coding=utf-8
#author: yangrong
#date: 2015-8-19
#本微信报警脚本应用于企业订阅号
#当用户主动发消息给公众号的时候(包括发送信息、点击自定义菜单、订阅事件、扫描二维
#码事件、支付成功事件、用户维权),微信将会把消息数据推送给开发者,开发者在一段时
#间内(目前修改为48小时)可以调用客服消息接口,通过POST一个JSON数据包来发送
#消息给普通用户,在48小时内不限制发送次数。
  
  
  
import os
import urllib2
import requests
import sys
import time
import json
import pickle
  
appid='wxc88**************'     
secret='b9b8925aaa0eafc***********'
token_file='/tmp/token_file.txt'
log_file='/tmp/wechat.log'
openid_user_file='/tmp/openid_user.txt'
openid_list=["omPAFj8PBaE4UbdOGmgjFfq-shFM",   #杨容
            "omPAFj27U-7PJkgYyHMk1wvDI27o",   #阿飞
            ]  #这是微信接收者的openid
  
#报警格式,脚本名  收件人  标题  内容
#这是zabbix发送内容格式,所以
#这里取出标题和内容就行了
  
#帮助信息,要求必须传参4个
if len(sys.argv) != 4:
  print 'Usage: %s mail-to title content'%sys.argv[0]
  print 'Example: '
  print '       %syangrong@jpush.cn  "this is testtitle"  "this is test content."'%sys.argv[0]
  sys.exit()
  
title=sys.argv[2]
content=sys.argv[3]
current_hour=time.strftime('%H',time.localtime(time.time()))    
  
  
#日志记录函数,把标题,用户id,状态记录
def log(title,openid,status):
         withopen(log_file,'ab') as f:
                   current_time=time.strftime('%Y-%m-%d%H:%M:%S',time.localtime(time.time()))
                   f.write('%s| %s | %s | %s\n'%(current_time,openid,status,title))
  
  
#获取token
class Token(object):
   def __init__(self, appid, secret):
       self.baseurl ='https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}'.format(
           appid,secret)
       self.expire_time = sys.maxint
  
   def get_token(self):
       if self.expire_time > time.time():
           request = urllib2.Request(self.baseurl)
           response = urllib2.urlopen(request)
           ret = response.read().strip()
           ret = json.loads(ret)
           if 'errcode' in ret.keys():
                print >> ret['errmsg'],sys.stderr
                sys.exit(1)
           self.expire_time = time.time() + ret['expires_in']
           self.access_token = ret['access_token']
             token_pre=[current_hour,self.access_token]
             with open(token_file,'wb') as f:
                      pickle.dump(token_pre,f)
       return self.access_token
  
#access_token = Token(appid=appid,secret=secret).get_token()  #这是获取access_token的代码
#print access_token
  
  
#获取所有的openid,然后根据openid获取用户信息,提取出用户名,最后输出用户名与openid的对应关系。
class get_user():
         def__init__(self):
                   self.access_token=Token(appid,secret).get_token()
         defget_openid_list(self):
                   openid_list_url='https://api.weixin.qq.com/cgi-bin/user/get?access_token={0}&next_openid='.format(self.access_token)
                   request=urllib2.Request(openid_list_url)
                   response=urllib2.urlopen(request)
                   ret=response.read().strip()
                   openid_list= json.loads(ret)
                   #printopenid_list['data']['openid']
                   openid_list= openid_list['data']['openid']
                   foropenid in openid_list:
                            user_info_url='https://api.weixin.qq.com/cgi-bin/user/info?access_token={0}&openid={1}'.format(self.access_token,openid)
                            user_info_request=urllib2.Request(user_info_url)
                            user_info_response=urllib2.urlopen(user_info_request).read().strip()
                            user_info=json.loads(user_info_response)
                            if'errcode' in user_info.keys():
                                     print>> user_info['errmsg'],sys.stderr
                                     sys.exit() 
                            withopen(openid_user_file,'wb') as f:
                                     f.write('openid:%s  nickname:%s'%(openid,user_info['nickname']))    
#使用post方式发送报警
def send_msg(title,content):
       #一天能够获取的access_token次数是2000次,每次取到的token有效时间2小时,所以pickle dump时,把当前小时数与access_token写入文件,每一小时获取一次token.
         current_hour=time.strftime('%H',time.localtime(time.time()))    
         ifnot os.path.exists(token_file):
                   access_token=Token(appid,secret).get_token()
         withopen(token_file,'rb') as f:
                   token_pre=pickle.load(f)
                   #print'token_pre:',token_pre
         access_token_pre=token_pre[1]
         current_hour_pre=token_pre[0]
         ifcurrent_hour == current_hour_pre:
                   access_token=access_token_pre
         else:
                   access_token=Token(appid,secret).get_token()
         #print'access_token:',access_token
       #循环openid_list,给每个成员单独推送微信消息
         foropenid in openid_list:
                   #print'openid:',openid
                   url='https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=%s'%access_token
                   payload={
                    "touser"'%s'%openid,
                      "msgtype""text",
                      "text": {
                     "content""Title: %s\nContent:%s"%(title,content)
                                }
                   }       
                   ret= requests.post(url, data=json.dumps(payload, ensure_ascii=False),verify=False)
                   result=ret.json()
                   
                   #printresult
                   #如果这一次发送失败,则代表可能access_token有问题,删除pickle dump文件,重新生成一次access_token
                   if  result['errcode']:
                            log(title,openid,'sendfail')      
                            os.remove(token_file)
                            access_token=Token(appid,secret).get_token()
                   else:
                            log(title,openid,'sendsuccess')      
                            
                   #printpost(url, data)
  
  
#get_user().get_openid_list()   #这是遍历所有openid,获取openid和用户名的对应关系。
  
send_msg(title,content)  #发送微信信息

   

zabbix报警设置

1)把报警脚本放到zabbix报警路径下,默认是:

    /usr/local/zabbix/share/zabbix/alertscripts

2)web添加报警介质


 

wKiom1XcHTCAlzOYAAEMTBMykkA437.jpg


3)添加报警动作


 wKioL1XcH0bTtq6sAAC2VLMO60Q026.jpg


4)设置用户报警


 wKiom1XcHTGz_FkPAAEYeBgbspk980.jpg


全文详见:http://xpxw.com/?id=15

TOP


«    2024年10月    »
123456
78910111213
14151617181920
21222324252627
28293031
TOP 搜索
TOP 控制面板
您好,欢迎到访网站!
  查看权限
TOP 最新留言
    TOP 作者列表
    TOP 站点信息
    • 文章总数:163
    • 页面总数:0
    • 分类总数:6
    • 标签总数:20
    • 评论总数:0
    • 浏览总数:361552