企业微信发送应⽤消息
实现范围
主动发送应⽤消息:企业后台调⽤接⼝通过应⽤向指定成员发送单聊消息
仅使⽤markdown⼀种形式发送
notify_channel 接⼊
配置⽂件维护
新增wxMsg模板配置
新增wsMsg账号密码、地址等配置
模板的形式进⾏发送类型区分
模板定义
详⻅接⼝调⽤
token获取
刷新策略
启动时候拉取⼀次
失败
全局错误码:https://developer.work.weixin.qq.com/document/path/90455
token获取失败
上报
token失效导致的失败
42001 access_token已过期 access_token有时效性,需要重新获取⼀次
则加锁重新获取token
接⼝调⽤
⽀持使⽤模板配置三种通知
markdownend
textSend
textCardSend频率限制
企业Id、agentid、corpsecret 加密
对称加密⽅式
https://developer.work.weixin.qq.com/document/path/91039
请求⽅式: GET(HTTPS)
请求地址: https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ID&corpsecret=SECRET
{
"errcode": 0,
"errmsg": "ok",
"access_token": "accesstoken000001",
"expires_in": 7200
}
https://developer.work.weixin.qq.com/document/path/90312
每应⽤不可超过帐号上限数*200⼈次/天(注:若调⽤api⼀次发给1000⼈,算1000⼈次;若企业帐号上限是
500⼈,则每个应⽤每天可发送100000⼈次的消息)
每应⽤对同⼀个成员不可超过30次/分钟,超过部分会被丢弃不下发
发消息频率不计⼊基础频率
/**
* 加密
*
* @param input 原⽂
* @param key 定义 key,必须 8 字节以上
* @param transformation 算法
* @param algorithm 加密类型
*/
private static String encryptDes(String input, String key, String
transformation, String algorithm) throws Exception {
Cipher cipher = Cipher.getInstance(transformation);
// 加密规则
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), algorithm);
// 初始化
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
byte[] bytes = cipher.doFinal(input.getBytes());
// Base64 转码失败处理
上报prometheus
告警
n9e
grafana
通知类型 -- 采⽤模板配置⽅开发,⽬前预计⽀持text,markdown
⽂本消息
markdown
textcard
接⼝调⽤
String encode = new String(Base64.getEncoder().encode(bytes));
return encode;
}
/**
* 解密
*
* @param encryptDES 密⽂
* @param key 定义 key
* @param transformation 算法
* @param algorithm 加密类型
*/
private static String decryptDes(String encryptDES, String key, String
transformation, String algorithm) throws Exception {
Cipher cipher = Cipher.getInstance(transformation);
// 解密规则
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), algorithm);
// 初始化
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
byte[] bytes = cipher.doFinal(Base64.getDecoder().decode(encryptDES));
return new String(bytes);
}
https://developer.work.weixin.qq.com/document/path/90236
请求⽅式:POST(HTTPS)
请求地址: https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKENbody:
markdownSend:
{
"agentid":10000841,
"duplicate_check_interval":1800,
"enable_duplicate_check":0,
"enable_id_trans":0,
"markdown":{
"content":"${content}"
},
"msgtype":"markdown",
"name":"markdownend",
"touser":"${tousers}"
}
textSend:
{
"agentid":10000841,
"duplicate_check_interval":1800,
"enable_duplicate_check":0,
"enable_id_trans":0,
"msgtype":"text",
"name":"textSend",
"text":{
"content":"${content}"
},
"touser":"${tousers}"
}
textCardSend:
{
"agentid":10000841,
"duplicate_check_interval":1800,
"enable_duplicate_check":0,
"enable_id_trans":0,
"msgtype":"textcard",
"name":"textCardSend",
"textcard":{
"btntxt":"${btntxt}",
"description":"${description}",
"title":"${title}",
"url":"${url}"
},
"touser":"${tousers}"
}后台逻辑
告警通知、订阅规则
模板: 参照微信机器⼈markdown模板
消息推送控制
超过2048 字符的主动截断 2000,分⻚发送
如:{{.RuleName}} 1/2
{{.RuleName}} 2/2
配置
通知账号获取,users.wecom_id
{{range .}}
[级别状态]: {{if .IsRecovered}}S{{.Severity}} Recovered{{else}}S{{.Severity}}
Triggered{{end}}
{{if eq .Severity 1}}<font color=red>**[规则标题]: {{.RuleName}}**</font>{{else}}[规则标
题]: {{.RuleName}}{{end}}
[规则备注]: {{.RuleNote}}
{{if .IsRecovered}}[恢复时间]:{{timeformat .RecoverTime}}{{else}}[触发时间]: {{timeformat
.TriggerTime}}
[触发时值]: {{.TriggerValue}}{{end}}
{{if .OrderTaskId}}[⼯单号]: {{.OrderTaskId}}{{end}}
{{if .TargetIdent}}[监控对象]: {{.TargetIdent}}{{end}}
[告警描述]: {{.Describe}}
[发送时间]: {{timestamp}}
[告警处理]: [认领](url) [忽略1⼩时](url) [忽略6⼩时](url) [忽略1天](url)
[告警标记]: [准确](url) [误报](url) [备注](url)
{{end}}
[WxMsg]
Url = "xxx"
Template = "markdownend"
User = "xxx"
Pass = "xxx"