0x01 前言

为了能及时收到zabbix的告警提醒,我一直以来都使用企业微信作为除邮件以外的接收平台。因为时效性的问题,电子邮件并不是很好的试试告警提醒途径,反而即时通讯软件则满足这个需求。

我们常用的微信并不适合这么频繁的信息推送,而私密性较高的企业微信的可定制化正是我需要的。在过去一年多的时间里,免费、无广告又及时的企业微信是我告警推送的首选:

0x02 准备

使用该脚本推送告警信息需要准备以下内容:

  • 企业微信的企业ID
  • 企业微信的部门ID
  • 企业微信的应用ID
  • 企业微信的应用Secret

相对于阿里钉钉,企业微信的信息获取则简单得多。首先得又一个企业微信账号,而企业微信的注册非常简单,登入以下页面并填写相关内容即可:

然后定位到以下页面即可获取企业ID:

而部门ID则需要先建立部门,而后即可在以下按钮中找到:

 

最后来到“应用与小程序”页面,建立一个应用:

完成后进入应用的配置界面,即可找到相应的信息:

将上面的信息记录下来,以备后用。

0x03 配置文件生成器

因为配置脚本所需的配置文件较为复杂,我特意编写一个生成器,通过生成器的交互可减少不必要的脑部活动。

通过python3执行配置文件生成器:

在我写这篇文章的时候发现该脚本又逻辑上的错误,我将在近期进行修正。

完成后即可在该文件的目录下找到配置文件:alarm_sender.conf,里面的内容如下:

如果有多个应用或需要将告警信息推送到多个部门甚至多个企业,可以跟随配置文件生成器的提示继续添加。

0x04 逻辑

因为只是一个简单的信息推送,所以逻辑也较为简单,流程如下:

  • 检查临时文件中是否存在token,若是则校验有效期,若否或已过期则获取新token
  • 利用token调用信息推送API推送信息
  • 写入日志与临时文件

检查token的函数如下:

首先尝试读取文件,如果文件不存在,则返还None;如果文件存在,将格式化为json,而后尝试读取相应的key;若key存在则判断有效期,若不存在则返还None;最后有效期有效则返还该key所对应的value,否则返还None。

如果检查token的函数返还None,则需要重新获取,函数如下:

该部分的内容比较简单,只是一个HTTP GET的请求,最后做了一个简单的响应判断。因为时间的关系,这部分目前还没有编写后续动作的部分。

获取到新token后需要写入到临时文件,减少API调用的次数。因为token有一个较长的有效期,所以可以重复使用。而相关的函数如下:

该部分主要是json的生成,层级关系比较复杂,最后将生成好的json写入文件。

一切顺利的话,即可用token向企业微信内创建好的应用推送信息,函数如下:

同样是HTTP请求,但这里使用POST方式,而需要的信息全包含在HTTP payload内,最后返还日志。

0x05 调用

以下是一个简单的调用函数:

首先将需要的参数赋值给对应的变量,而后跟随上述的逻辑执行,最后无论成功与否都会写入日志。

0x06 结语

这脚本有别于我之前用的版本,虽然大体上一致,但精简了很多冗余代码和删减了很多没必要的函数。这可能会产生BUG,如果有,欢迎在GitHub上提issues,如果有功能上的需求,可以给我发邮件。