0、前言

  • 需求:实现告警信息推送到企业微信群
  • 1)、机器人推送消息
    2)、企业微信支持 自建应用 推送消息

1、代码截图

2、pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.0</version><relativePath/> <!-- lookup parent from repository --></parent><modelVersion>4.0.0</modelVersion><artifactId>98com.ct.wx</artifactId><dependencies><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>fluent-hc</artifactId><version>4.5.13</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpmime</artifactId><version>4.5.13</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>30.1-jre</version></dependency><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.6</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies></project>

3、机器人推送

群组管理-添加机器人,复制机器人key=123456abcdefg。可以自定义机器人的名称。

(1)消息vo

  • VoWebhookMDMsg2Group
/*** @Author LaoHa* @Date 2021/7/12*/
@Data
public class VoWebhookMDMsg2Group {String msgtype="markdown";Object markdown;
}

(2)控制器

  • WxController
    /*** 机器人向 群 推送消息** @throws Exception*/@PostMapping({"/webhookSendMD"})public void webhookSendMarkDown() throws Exception {wxService.webhookSendMarkDown("123456789-cb0d-4cc5-9180-d59cb8af789d", "台湾是中国的领土!", 2);}

(3)service

  • WxService
    /*** 发送Markdown消息** @param message* @param level* @throws IOException*/public void webhookSendMarkDown(String robotKey, String message, Integer level) throws IOException {String url = String.format(WxApiUrl.API_WEBHOOK_SEND, robotKey);VoWebhookMDMsg2Group vo = new VoWebhookMDMsg2Group();Map<String, String> markdown = new HashMap<>(1);String content = "**嘀嘀嘀,收到报警信息,请相关同事注意。**\n " +"><font color=\"info\">警报级别:</font><font color=\"warning\">" + level + "</font>\n " +"><font color=\"info\">警报日志:</font>" + message;markdown.put("content", content);vo.setMarkdown(markdown);String result = CtHttpUtils.post(url, gson.toJson(vo));log.info("call [{}], content:{}", url, content);}

(4)常量url

  • WxApiUrl
    /*** 机器人向群发送消息*/public static final String API_WEBHOOK_SEND = WX_API_QY + "/webhook/send?key=%1$s";

(5)http工具类

  • CtHttpUtils
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpEntity;
import org.apache.http.client.fluent.Request;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.FileBody;import java.io.File;
import java.io.IOException;/*** @Author LaoHa* @Date 2021/6/24*/
@Slf4j
public class CtHttpUtils {public static final String TEXT_PLAIN = "text/plain";public static final String TEXT_HTML = "text/html";public static final String TEXT_XML = "text/xml";public static final String APPLICATION_XML = "application/xml";public static final String APPLICATION_JSON = "application/json";private static final CtHttpRespHandler respHandler = new CtHttpRespHandler();/*** GET请求** @param url 请求地址* @return 响应内容* @throws IOException*/public static String get(String url) throws IOException {log.info(url);String content = Request.Get(url).addHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8").execute().handleResponse(respHandler);return content;}/*** POST请求** @param url         请求地址* @param contentType 请求体类型[text, xml, json, html]* @param body        请求体* @return 响应内容* @throws IOException*/public static String post(String url, String contentType, String body) throws IOException {log.info(body);String content = Request.Post(url).bodyString(body, ContentType.create(contentType))
//                .addHeader("Content-Type","text/html;charset=UTF-8").execute().handleResponse(respHandler);return content;}public static String post(String url, String body) throws IOException {log.info(body);String content = Request.Post(url).bodyString(body, ContentType.create(TEXT_XML))
//                .addHeader("Content-Type","text/html;charset=UTF-8").execute().handleResponse(respHandler);return content;}public static String post(String url) throws IOException {log.info(url);String content = Request.Post(url)
//                .addHeader("Content-Type","text/html;charset=UTF-8").execute().handleResponse(respHandler);return content;}/*** 上传文件** @param url  请求地址* @param file 上传文件* @return 响应内容* @throws IOException*/public static String upload(String url, File file) throws IOException {log.info(file.getAbsolutePath());HttpEntity media = MultipartEntityBuilder.create().addPart("media", new FileBody(file)).build();String content = Request.Post(url).body(media).execute().handleResponse(respHandler);return content;}/*** 下载文件** @param url  请求地址* @param file 文件保存位置* @throws IOException*/public static void download(String url, File file) throws IOException {log.info(file.getAbsolutePath());Request.Get(url).execute().saveContent(file);}
}
  • CtHttpRespHandler
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.ResponseHandler;
import org.apache.http.util.EntityUtils;import java.io.IOException;/*** @Author LaoHa* @Date 2021/6/25*/
public class CtHttpRespHandler implements ResponseHandler<String> {@Overridepublic String handleResponse(HttpResponse resp)throws ClientProtocolException, IOException {int status = resp.getStatusLine().getStatusCode();if (status >= 200 && status < 300) {HttpEntity entity = resp.getEntity();String body = (null!= entity) ? EntityUtils.toString(entity,"UTF-8") : "";return body;} else {throw new ClientProtocolException("请求失败,服务器响应代码: " + status);}}
}

(6)测试类

  • BaseJunit5Test
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;
@ExtendWith(SpringExtension.class)
@SpringBootTest(classes=com.ct.wx.WxApp.class)
//不启动服务器,使用mockMvc进行测试http请求。启动了完整的Spring应用程序上下文,但没有启动服务器
@AutoConfigureMockMvc
public class BaseJunit5Test {
}
  • TestMvc
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;/*** @Author LaoHa* @Date 2021/6/22*/
@Slf4j
public class TestMvc extends BaseJunit5Test{@Autowiredprivate MockMvc mockMvc;/*** 测试POST FormData* @throws Exception*/@Testpublic void testPost() throws Exception {MvcResult mvcResult = this.mockMvc.perform(post("/webhookSendMD").contentType(MediaType.APPLICATION_FORM_URLENCODED)).andReturn();log.info(mvcResult.getResponse().getContentAsString());}}

(7)运行test

4、自建应用 推送消息

  • 详见附录 创建应用

(1)控制器


/*** @Author LaoHa* @Date 2021/6/21*/import com.ct.wx.service.WxService;
import com.ct.wx.vo.VoChatCreateReturn;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;import java.io.IOException;@Slf4j
@RestController
public class WxController {@AutowiredWxService wxService;/*** 企业微信支持自建 应用 推送消息给 某些用户** @return void* @Author shenlele* @Date 2018/10/11 14:19* @Param []**/@PostMapping({"/appSendTextMsg2Users"})public void appSend() throws IOException {wxService.appSend("中华人民共和国万万岁!!!");}/*** 企业微信支持自建 应用* 1、创建创组(自动关联该应用,chatid已经存在=创建失败。)* 2、推送消息给 群聊** @throws IOException*/@PostMapping({"/appSendText2Chat"})public void appChatSend() throws Exception {String chatId="testChat";VoChatCreateReturn re = wxService.createChat("laoHa通过自建app创建的群组", chatId, "laoha", "laoha2", "laoha3", "laoha");if (!re.getErrmsg().equals("ok") ) {log.error("创建群组失败。chatId="+chatId+" error="+re.getErrmsg());}else {wxService.appChatSend(chatId, "打倒帝国主义!");}}/*** 机器人向 群 推送消息** @throws Exception*/@PostMapping({"/webhookSendMD"})public void webhookSendMarkDown() throws Exception {wxService.webhookSendMarkDown("1111111-cb0d-4cc5-9180-d59cb8af789d", "台湾是中国的领土!", 2);}
}

(2)service


import com.ct.common.CtConstant;
import com.ct.common.CtHttpUtils;
import com.ct.config.CtWxProperties;
import com.ct.wx.common.WxApiUrl;
import com.ct.wx.vo.*;
import com.google.common.reflect.TypeToken;
import com.google.gson.Gson;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;/*** @Author LaoHa* @Date 2021/7/7*/
@Slf4j
@Service
public class WxService {@AutowiredCtWxProperties ctWxProperties;public static final String CONTENT_TYPE = "Content-Type";private static Gson gson = new Gson();/*** 获取toAuth(String Get_Token_Url)返回结果中键值对中access_token键的值** @param corpid 应用组织编号   corpsecret 应用秘钥*/public String getToken() throws IOException {String api_url = String.format(WxApiUrl.API_GET_TOKEN, ctWxProperties.getQyCorpid(), ctWxProperties.getQyCorpsecret());String resp = CtHttpUtils.get(api_url);//推荐使用gson(性能有要求时,采用fastjson转bean)Map<String, Object> map = gson.fromJson(resp,new TypeToken<Map<String, Object>>() {}.getType());log.info("corpid [{}], corpsecret:{}, resp:{}", corpid, corpsecret, resp);return map.get("access_token").toString();}/*** 自建应用 向某些用户推送消息** @param message* @throws IOException*/public void appSend(String message) throws IOException {String token = getToken();String url = String.format(WxApiUrl.API_SEND_MESSAGE, token);//VoAppTextMsg2Users vo = new VoAppTextMsg2Users();vo.setTouser("user1|user2");vo.setAgentid(ctWxProperties.getQyAppId());Map<Object, Object> content = new HashMap<Object, Object>();content.put("content", message + "\n--------\n" + CtConstant.DF_LONG_DATETIME.format(new Date()));vo.setText(content);gson.toJson(vo);String resp = CtHttpUtils.post(url, gson.toJson(vo));log.info("call [{}],  content:{}", url, message);}/*** 只有app创建的chat才有chatId** @param chatName* @param chatId* @param owner* @param userList* @return* @throws IOException*/public VoChatCreateReturn createChat(String chatName, String chatId, String owner, String... userList) throws IOException {String token = getToken();String url = String.format(WxApiUrl.API_CHAT_CREATE, token);//VoChatCreate vo = new VoChatCreate();vo.setName(chatName);vo.setOwner(owner);vo.setUserlist(userList);vo.setChatid(chatId);String result = CtHttpUtils.post(url, gson.toJson(vo));log.info("call [{}], chatId:{},chatName:{}, owner:{}, userList:{}", url, chatId, chatName, owner, userList);return gson.fromJson(result, VoChatCreateReturn.class);}/*** 发送群聊消息** @throws IOException*/public void appChatSend(String chatId, String message) throws IOException {String token = getToken();String url = String.format(WxApiUrl.API_CHAT_SEND_MESSAGE, token);//VoAppTextMsg2Chat vo = new VoAppTextMsg2Chat();vo.setChatid(chatId);Map<String, String> text = new HashMap<>(1);text.put("content", message);vo.setText(text);String result = CtHttpUtils.post(url, gson.toJson(vo));log.info("call [{}], chatId:{}, content:{}", url, chatId, message);}

(3)微信api url常量

import java.text.SimpleDateFormat;/*** 在《Effective Java》一书中,作者建议使用一般类加私有构造方法的方式** @Author LaoHa* @Date 2021/6/24*/
public class WxApiUrl {private WxApiUrl() {}/*** api 入口*/public static final String WX_API_QY = "https://qyapi.weixin.qq.com/cgi-bin";/*** 获取token*/public static final String API_GET_TOKEN = WX_API_QY + "/gettoken?corpid=%1$s&corpsecret=%2$s";/*** 推送消息*/public static final String API_SEND_MESSAGE = WX_API_QY + "/message/send?access_token=%1$s";/*** app向 群 推送消息*/public static final String API_CHAT_SEND_MESSAGE = WX_API_QY + "/appchat/send?access_token=%1$s";/*** 机器人向群发送消息*/public static final String API_WEBHOOK_SEND = WX_API_QY + "/webhook/send?key=%1$s";/*** 自建应用创建群组(chat)*/public static final String API_CHAT_CREATE = WX_API_QY + "/appchat/create?access_token=%1$s";
}

(4)配置文件读取类

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;/*** @Author LaoHa* @Date 2021/7/14*/
@Data
@Component
@ConfigurationProperties(prefix="wx")
public class CtWxProperties {private Integer qyAppId;private String qyCorpid;private String qyCorpsecret;
}

(5)vo

  • VoAppTextMsg2Chat
/*** @Author LaoHa* @Date 2021/7/12*/
@Data
public class VoAppTextMsg2Chat {String msgtype = "text";String chatid;/*** 实际接收Map类型数据*/Object text;
}
  • VoAppTextMsg2Users
/*** @Author LaoHa* @Date 2021/7/7*/
@Data
public class VoAppTextMsg2Users {String touser;String msgtype = "text";int agentid;/*** 实际接收Map类型数据*/Object text;
}
  • VoChatCreate
/*** @Author LaoHa* @Date 2021/7/14*/
@Data
public class VoChatCreate {private String name;private String owner;private String[] userlist;private String chatid = "CHATID";
}
  • VoChatCreateReturn
/*** @Author LaoHa* @Date 2021/7/14*/
@Data
public class VoChatCreateReturn {private Integer errcode;private String errmsg;private String chatid="CHATID";
}

(6)运行结果

附录

  • Java普通接入微信告警实现代码

  • 发送告警消息到企业微信群

springboot推送告警消息至企业微信相关推荐

  1. 通过XXL-JOB定时推送bug信息到企业微信群1

    通过XXL-JOB定时推送bug信息到企业微信群. 效果图 前提: 公司的Bug平台可以提供接口返回给你bug数据. 一.在企业微信群创建机器人 1.群右键创建机器人 2.拿到对应webhook. 二 ...

  2. 【逗老师带你学IT】PRTG监控系统通过企业微信推送告警消息

    本文主要介绍如何让PRTG网络监控系统通过企业微信webhook接口发送告警信息 效果就是这样子的↑ PRTG简介 https://www.cn.paessler.com/ 产品主页 企业微信简介 h ...

  3. 【技能】“百度推广”每天定时推送数据报告到企业微信的方法

    百度推广相信大家都不陌生,很多企业都在用他做产品或品牌的推广,那每天我们的推广人员是需要去百度营销后台查看前一天或者实时的推广数据报告,那如果把百度推广和企业微信做系统集成的话,就可以实现每天在固定的 ...

  4. 企业微信机器人推送mysql_Zabbix.5.0设置企业微信群机器人推送告警信息

    一.企业微信端配置 1.创建微信群机器人 在需要接收告警信息的企业微信群上右键(注意群里成员至少要3人以上),选择"添加群机器人",设置机器人名称,系统自动生成此机器人的webho ...

  5. tp5框架实现推送消息到企业微信机器人(从需求分析、方案设计、研发阐述)

    需求 目前需要接入消息推送的模块是任务中心,原因是任务中心是多人协作处理某个特定小组内的所有分析任务,在整个分析的过程中,一个任务的生命周期会经历若干个关键的状态节点, 当分析师或审批人触发了相关动作 ...

  6. 【企业微信开发】企业微信开发测试推送应用消息流程

    准备事项 企业应用ID(AGENTID)和密钥(SECRET) 1) 登录企业微信 2)在应用管理下方的自建应用中,找到你要推送消息的应用信息,如下图所示 企业ID(CORPID) 1) 点击&quo ...

  7. 使用微信推送报警消息及api

    使用微信推送报警消息及api 三种常见报警介质: 短信:它的好处是不用联网手机有信号就行,但是需要有短信网关,需要花钱 邮件:它也可以做到手机短信通知,基本现在邮箱都有这个功能,当然如果你使用qq邮箱 ...

  8. C#微信公众号开发系列教程五(接收事件推送与消息排重)

    C#微信公众号开发系列教程五(接收事件推送与消息排重) 原文:C#微信公众号开发系列教程五(接收事件推送与消息排重) 微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续 ...

  9. python微信推送消息_Python编程之微信推送模板消息功能示例

    本文实例讲述了Python微信推送模板消息功能.分享给大家供大家参考,具体如下: 官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main& ...

最新文章

  1. linux nat 端口,linux – iptables nat只是端口25?
  2. ADPRL - 近似动态规划和强化学习 - Note 8 - 近似策略迭代 (Approximate Policy Iteration)
  3. 微信小程序:字体保持大小
  4. 从Java到Kotlin(五)
  5. post和get的区别?
  6. codeblocks如何watch指针
  7. boost::type_erasure::param相关的测试程序
  8. isinstance函数
  9. Hulu 视频QoS优化策略
  10. java字节码指令简介(仅了解)
  11. 【面试妥了】史上最全Spark面试题
  12. 元素隐式具有 “any” 类型,因为类型“Shared”没有索引签名问题解决思路
  13. WAP PUSH解析(3)——Android中实现
  14. MTK6577---camera驱动分析
  15. windows10 使用老版图片查看器
  16. 微信公众平台 个人微信号订阅号发图文文章 总显示发送失败
  17. 解析android多语言与自定义字体
  18. 大公司github官网整理链接
  19. 22岁少年破解史上最严重网络攻击,拯救全球互联网,三个月后却被FBI逮捕……
  20. IT硬件运维的一些建议

热门文章

  1. 【Eclipse插件开发】Java读写串口
  2. JAVA零基础学习之路(三十)
  3. 全国计算机等级考试一级上机WORD题,全国计算机等级考试一级上机WORD题库
  4. JavaScript中eval方法的替代方法
  5. 1; XHTML 基本知识
  6. 计算机的科技创新,科学网—计算机科技创新需要狂人思维模式 - 姜咏江的博文...
  7. pr字幕按指定的路径方向输入文字
  8. RESTful API 设计指南
  9. 再谈淘宝客PID被劫持之事! [复制链接]
  10. C语言用栈实现迷宫求解