利用微信打造各类监控消息推送
文章最后更新时间为:2022年12月13日 11:37:36
1. 背景
在日常的工作生活中,经常用到长期后台运行的程序,比如子域名监控,github监控,各种论坛签到,网站动态监控等等,这些都可以归结为属于定时任务,每天跑一次或者每小时跑一次,这种程序有个痛点就是状态监测,比如今天论坛签到成功了吗?今天github发现新的漏洞了吗?
这类问题需要一个统一的消息推送解决方案,比如微信、钉钉、邮件、telegram等等,但是都有各自的缺点:
- 微信:不带推送api功能
- 钉钉:需要多安装一个app
- 邮件:不够简单快捷,邮件太多容易泛滥
- telegram:需要手机长期挂代理
之前一直在用server酱,利用公众号的通道推送消息,但因微信曾发布下线公告,所以已经不被推荐使用。
然后转向server酱的企业微信应用消息
通道,发现其免费用户一天推送额度只有5条,且只显示标题,又想白嫖又想爽那是不行的,于是尝试站着把消息推送了。
2. 利用企业微信API直接发送消息到微信
企业微信本身可以发送添加群机器人,发送消息,也可以利用企业微信的应用发送消息。具体的文档可以见:https://work.weixin.qq.com/api/doc/90000/90135/90664
这里我的需求有三个:
- 只用微信即可接收消息,不需要独立安装企业微信
- 发送消息无次数限制
- 可以直接看到消息的全部内容
于是选用了发送应用消息
的api:https://work.weixin.qq.com/api/doc/90000/90135/90236
方法很简单:
- 先认证获取access_token
- 然后发送具体消息即可,支持图文、文字、语言,视频等
但是我在每个需要监控的应用里都写一套这样的逻辑,那不是很麻烦?
于是想到可以模仿server酱,提供一个webhook的api,只需要一条http请求即可发送消息。具体的逻辑就是封装了上面的两步,然后提供了对外的api功能。项目主页:https://github.com/saucer-man/wepush
下面说一下部署的流程:
2.1 创建企业和企业微信应用
详细的步骤可以参考:https://sct.ftqq.com/forward
- 创建企业,200人以下免认证
- 创建企业应用,名为
消息推送
,图标自己网上找一个即可 - 利用微信插件关注微信,可以直接在微信中可以收发企业微信的消息
2.2 部署server
git clone https://github.com/saucer-man/wepush
cd wepush
vim wepush.env # 填写企业微信应用信息
docker-compose build && docker-compose up -d
其中主要需要填写的有:
- AuthToken 此api接口的认证token,随便填写一串字符串即可
- CorpSecret 企业应用secret
- CorpId 企业ID
- AgentId 企业应用ID
- LogLevel 日志详细级别(可以选debug/info/warn)
默认端口为8001
,日志目录为./log
,可以从docker-compose.yml
中修改
2.3 使用教程
本着大道至简,九九归一的原则,api调用只支持POST json请求。
- curl版本
curl http://localhost:8001/wepush -H "Content-Type:application/json" -H "token:xxxxx" -X POST -d '{"type": "text","touser": "@all","msg": "hello\nworld"}'
- python版本
import requests
data = {"type": "text","touser": "@all","msg": "hello\\nworld"}
response = requests.post('http://localhost:8001/wepush?token=xxxxx', json=data)
- golang版本
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
"strings"
)
func main() {
client := &http.Client{}
var data = strings.NewReader(`{"type": "text","touser": "@all","msg": "hello\nworld"}`)
req, err := http.NewRequest("POST", "http://localhost:8001/wepush", data)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("token", "123")
resp, err := client.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
bodyText, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%s\n", bodyText)
}
参数解释:
- token:此api接口认证token,可以放在header中,也可以放在url的query中
- type:发送的消息类型,支持text和markdown(不填的话默认为markdown)
- touser:成员ID列表,即消息接收者,多个接收者用‘|’分隔,最多支持1000个。(不填的话默认为@all)
- msg:需要发送的消息内容
效果为:
看起来非常nice
优秀,大赞,给力!
:tada: 感谢分享!不过邮件加点规则自动收纳倒也不会泛滥,感觉主要是有可能不能及时通知?
那不就得一直开着电脑?
非常好用 NiceNice
非常Nice,感谢分享