背景说明
银行项目的服务器都是处于行方的内网环境中,运维的监控告警手段只有邮件和电话;每次收到邮件又没有很好的提醒效果,而电话告警方式播报告警内容的时候不够明确,且接听麻烦。因此可以增加微信告警方式(告警内容清晰明确且收到微信也能及时提醒)。虽然内网环境的服务器不能直接通过zabbix调用微信接口发送告警,但可以利用邮件与外网联通。具体做法就是把告警邮件发送给自己的邮箱,然后利用自己服务器通过python扫描邮件,一旦发现有新的告警邮件就通过企业微信接口发送消息到微信
准备工作
1、去企业微信官网注册用户,点此进入官方链接(注册个人的就行,不需要企业),注册完之后并登录在应用管理里面创建应用,该应用就是用于发送告警消息的,创建好应用点击进入就可以看到有API发送消息的能力。然后就可以通过企业微信API里面的发送消息接口给创建好的应用发送消息,具体调用方法请移步企业微信开放平台

2、一个专门用于接收告警邮件的邮箱,我这里需要用的是IMAP服务,所以使用QQ邮箱。邮箱设置里面的账户需要开启POP,开启后会提供一个授权码(python脚本里面登陆邮箱的时候需要用到这个授权码),并设置收件规则把告警邮件都转移到master文件夹内

3、准备一台能通公网的服务器,通过这个服务器登陆邮箱并发送告警消息
脚本参考
1、调用发送应用消息接口需要接口调用凭证(access_token),access_token有时间限制,有效期为两小时(有效期内无限制使用),过期后需要重新获取,所以把获取凭证脚本(get_token.py)添加到定时任务,每小时获取一次就可以了。
50 * * * * python3 /home/channelsoft/get_token.py
import requests
import json
appid = "wwc4xxxxxxxxxx62b" #企业corpid
secret = "mZzBuOxYQs4xxxxxxxxxxxxcAy_zM6PmhbCmFTI84" #企业应用secret
url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?orpid="+appid+"&corpsecret="+secret+"" #接口地址
response = requests.get(url) #发送get请求调用接口
result = json.loads(response.content)
access_token = result['access_token']
with open('/home/channelsoft/access_token.txt','w') as f: #把获取到的token保存下来
f.write(access_token)
其中企业corpid在企业微信后台企业信息里面可以看到,企业应用secret在企业微信创建的应用里面也可以看到
2、登陆邮箱扫描并解析邮件和发送消息脚本(master.py)
#coding=utf-8
import zmail
import time
import asyncio
import requests
import json
def get_token():
with open('/home/channelsoft/access_token.txt','r') as f:
return f.read()
def send_msg(content):
if content == '':
return
access_token = get_token()
send_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={}'.format(access_token)
content_modul = {"touser":"@all","msgtype":"text","agentid":1000002,"text":{"content":'"' + content + '"'},"safe":0}
requests.post(url=send_url,data=json.dumps(content_modul),headers={'Content-Type':'application/json'})
async def jiexi_mail(server,ID):
mail = server.get_mail(ID)
if mail['from'] == 'master@bxxxxxxm.com': #匹配条件为发件人是XXX
# print(mail['id'])
# print(mail['subject'])
# print(mail['content_text'])
# print(mail['content_html'])
content = ''.join(mail['content_text']).replace('\\r\\n\\r\\n', '\\r\\n').strip('\\n')
send_msg(content)
async def main():
# 腾讯企业邮箱使用示例
# server = zmail.server('wxxxxxxxm','passwd',config='qq')
server = zmail.server('xxxxxxxx@qq.com','dqoeqcugpclfdghi')
mailbox_info = server.stat()
ID = mailbox_info[0] #mailbox_info[0],邮箱数量初始化
while True:
mailbox_info = server.stat()
if mailbox_info[0] > ID: #刷新后邮件数量对比
tasks = []
for mail_id in range(int(ID)+1,int(mailbox_info[0])+1): #获取range范围内的邮件
tasks.append(asyncio.create_task(jiexi_mail(server,mail_id)))
for task in tasks:
await task
ID = mailbox_info[0] #新增邮件后更新数量ID
else:
ID = mailbox_info[0] #邮件有删除或没有新邮件是更新数量ID
asyncio.run(main())
3、脚本测试ok,然后后台运行就可以了
nohup python3 master.py &
接收告警
企业微信后台:
我的企业->微信插件->允许成员在微信插件中接收和回复聊天消息


