• Springboot 整合 企业微信机器人助手推送消息


    前言

    这个东西有啥用,好玩?

    确实, 好玩归好玩,其实有很多使用场景。

    可以自己选择一些业务节点触发这个机器人助手的消息推送;

    简单举例:

    1. 有人给你的系统留下反馈意见了,推送到运营群去;

    2.项目部署成功了,推送到运维群去;

    3.有人新增业务资料了,推送到客服群去;

    本篇内容:
     

    对接企微机器人,推送消息到群聊。 

    消息类型有四种:

    文本消息

    图片消息

    MarkDown格式文本消息

    小卡片消息(小卡片哦~)

    效果:


    正文

    注意点:

    1.企业微信群聊,外部群聊不允许弄机器人。

     2.整合机器人的前提是,到相关群聊建机器人。
     

    可以整合多个机器人,每个机器的身份标识是 创建的时候 企微分发的一个key。

    触发哪个机器人去推消息,就使用哪个key。

    机器人创建步骤:


    ①对着群聊右键,点击进入管理聊天消息 

    ②点击添加机器人

    3.创建机器人

     4.创建成功(这个key就是每个机器人的唯一标识,推送消息可以设计成传key推送)

    开始敲代码整合:

    惯例,先看下这次实例最终目录结构:

    1. 从头开始 建一个项目:

     2.引入核心依赖:
     

    <!-- http请求工具 -->
    <dependency>
        <groupId>com.dtflys.forest</groupId>
        <artifactId>forest-spring-boot-starter</artifactId>
        <version>1.5.14</version>
    </dependency>
     


    3. 把配置文件改成yml格式 (个人习惯),然后配上forset调用工具的配置,以及 机器人key

    1. ## 轻量级HTTP客户端框架forest
    2. forest:
    3. # 配置底层API为 okhttp3
    4. backend: okhttp3
    5. # 连接池最大连接数,默认值为500
    6. max-connections: 1000
    7. # 每个路由的最大连接数,默认值为500
    8. max-route-connections: 500
    9. # 请求超时时间,单位为毫秒, 默认值为3000
    10. timeout: 3000
    11. # 连接超时时间,单位为毫秒, 默认值为2000
    12. connect-timeout: 3000
    13. # 请求失败后重试次数,默认为0次不重试
    14. retry-count: 1
    15. # 单向验证的HTTPS的默认SSL协议,默认为SSLv3
    16. ssl-protocol: SSLv3
    17. # 打开或关闭日志,默认为true
    18. logEnabled: true
    19. # 打开/关闭Forest请求日志(默认为 true)
    20. log-request: true
    21. # 打开/关闭Forest响应状态日志(默认为 true)
    22. log-response-status: true
    23. # 打开/关闭Forest响应内容日志(默认为 false)
    24. log-response-content: true
    25. wechat:
    26. notice:
    27. key: 3f66977b-****-4af5-****-59*0c4****3d
    28. server:
    29. port: 8571

    4. 创建 WechatNoticeClient.java


     
    用于对接企微机器人推消息接口,因为我们整合了forest ,简单用注解就行(其实自己用http工具也行)

    1. import com.dtflys.forest.annotation.JSONBody;
    2. import com.dtflys.forest.annotation.Post;
    3. import com.dtflys.forest.annotation.Var;
    4. import org.springframework.stereotype.Component;
    5. import java.util.Map;
    6. /**
    7. * @Author: JCccc
    8. * @Date: 2022-5-27 14:44
    9. * @Description: 企业微信机器人通知client
    10. */
    11. @Component
    12. public interface WechatNoticeClient {
    13. @Post(
    14. url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key={key}",
    15. headers = {
    16. "Accept-Charset: utf-8",
    17. "Content-Type: application/json"
    18. },
    19. dataType = "json")
    20. void sendWechatMsg(@Var("key") String key, @JSONBody Map<String, Object> body);
    21. }

    5.创建 MyNoticeUtil.java  

    用于封装不同消息类型消息的推送方法,里面调用的WechatNoticeClient.

    1. import org.springframework.beans.factory.annotation.Autowired;
    2. import org.springframework.beans.factory.annotation.Value;
    3. import org.springframework.stereotype.Component;
    4. import sun.misc.BASE64Encoder;
    5. import java.io.FileInputStream;
    6. import java.io.IOException;
    7. import java.io.InputStream;
    8. import java.security.MessageDigest;
    9. import java.util.ArrayList;
    10. import java.util.HashMap;
    11. import java.util.List;
    12. import java.util.Map;
    13. /**
    14. * @Author: JCccc
    15. * @Date: 2022-5-27 14:48
    16. * @Description:
    17. */
    18. @Component
    19. public class MyNoticeUtil {
    20. @Autowired
    21. private WechatNoticeClient wechatNoticeClient;
    22. @Value("${wechat.notice.key}")
    23. private String NOTICE_KEY;
    24. /**
    25. * 发送文本消息
    26. */
    27. public void sendTextMsg() {
    28. Map<String, Object> sendMap = new HashMap<>();
    29. //设置消息类型 txt文本
    30. sendMap.put("msgtype", "text");
    31. Map<String, String> contentMap = new HashMap<>();
    32. contentMap.put("content", "你好,我是JCccc的机器人");
    33. sendMap.put("text", contentMap);
    34. wechatNoticeClient.sendWechatMsg(NOTICE_KEY, sendMap);
    35. }
    36. /**
    37. * 发送markdown文本消息
    38. */
    39. public void sendMarkDownTextMsg() {
    40. Map<String, Object> sendMap = new HashMap<>();
    41. //设置消息类型 markdown文本
    42. sendMap.put("msgtype", "markdown");
    43. Map<String, String> contentMap = new HashMap<>();
    44. contentMap.put("content", "JCccc,您的账户余额已到账<font color=\\\"warning\\\">15000元</font>,开心起来吧。\\\n" +
    45. " >付款方:<font color=\\\"comment\\\">白日做梦</font>");
    46. sendMap.put("markdown", contentMap);
    47. wechatNoticeClient.sendWechatMsg(NOTICE_KEY, sendMap);
    48. }
    49. /**
    50. * 发送图片消息
    51. */
    52. public void sendImageMsg() {
    53. String url = "D:\\Program Files\\JcProjects\\dotest\\src\\main\\resources\\static\\test.png";
    54. Map<String, Object> sendMap = new HashMap<>();
    55. sendMap.put("msgtype", "image");
    56. Map<String, String> contentMap = new HashMap<>();
    57. contentMap.put("md5", getMd5(url));
    58. contentMap.put("base64", getBase64(url).replaceAll("\r|\n", ""));
    59. sendMap.put("image", contentMap);
    60. wechatNoticeClient.sendWechatMsg(NOTICE_KEY, sendMap);
    61. }
    62. /**
    63. * 发送图文消息
    64. */
    65. public void sendImageAndTxtMsg() {
    66. Map<String, Object> sendMap = new HashMap<>();
    67. sendMap.put("msgtype", "news");
    68. Map<String, Object> contentMap = new HashMap<>();
    69. List<Map<String, Object>> list = new ArrayList<>();
    70. Map<String, Object> obj = new HashMap<>();
    71. obj.put("title", "小目标青年的博客");
    72. obj.put("description", "大家给他点点赞!");
    73. obj.put("url", "https://blog.csdn.net/qq_35387940");
    74. obj.put("picurl", "https://img-blog.csdnimg.cn/6bc435ac39514cb780739ea1cc34c409.png");
    75. list.add(obj);
    76. contentMap.put("articles", list);
    77. sendMap.put("news", contentMap);
    78. wechatNoticeClient.sendWechatMsg(NOTICE_KEY, sendMap);
    79. }
    80. /**
    81. * 图片转为base64编码
    82. */
    83. public String getBase64(String imgFile) {
    84. InputStream in = null;
    85. byte[] data = null;
    86. // 读取图片字节数组
    87. try {
    88. in = new FileInputStream(imgFile);
    89. data = new byte[in.available()];
    90. in.read(data);
    91. in.close();
    92. } catch (IOException e) {
    93. e.printStackTrace();
    94. }
    95. // 对字节数组Base64编码
    96. BASE64Encoder encoder = new BASE64Encoder();
    97. // 返回Base64编码过的字节数组字符串
    98. return encoder.encode(data);
    99. }
    100. /**
    101. * 获取文件的MD5值
    102. *
    103. * @param path
    104. * @return
    105. */
    106. public String getMd5(String path) {
    107. try {
    108. MessageDigest md5 = MessageDigest.getInstance("MD5");
    109. FileInputStream fis = new FileInputStream(path);
    110. byte[] buffer = new byte[1024];
    111. int len;
    112. while ((len = fis.read(buffer)) != -1) {
    113. md5.update(buffer, 0, len);
    114. }
    115. fis.close();
    116. byte[] byteArray = md5.digest();
    117. StringBuilder sb = new StringBuilder();
    118. for (byte b : byteArray) {
    119. sb.append(String.format("%02x", b));
    120. }
    121. return sb.toString();
    122. } catch (Exception e) {
    123. e.printStackTrace();
    124. }
    125. return null;
    126. }
    127. }

    6.简单写一个测试接口模拟触发一下机器人:

    1. import com.jc.dotest.wechat.MyNoticeUtil;
    2. import org.springframework.beans.factory.annotation.Autowired;
    3. import org.springframework.web.bind.annotation.GetMapping;
    4. import org.springframework.web.bind.annotation.RequestParam;
    5. import org.springframework.web.bind.annotation.RestController;
    6. /**
    7. * @Author: JCccc
    8. * @Date: 2022-5-27 14:52
    9. * @Description:
    10. */
    11. @RestController
    12. public class TestController {
    13. @Autowired
    14. MyNoticeUtil myNoticeUtil;
    15. @GetMapping("/doTest")
    16. public String doTest(@RequestParam("testType") String testType){
    17. if (testType.equals("1")){
    18. myNoticeUtil.sendTextMsg();
    19. }
    20. if (testType.equals("2")){
    21. myNoticeUtil.sendMarkDownTextMsg();
    22. }
    23. if (testType.equals("3")){
    24. myNoticeUtil.sendImageMsg();
    25. }
    26. if (testType.equals("4")){
    27. myNoticeUtil.sendImageAndTxtMsg();
    28. }
    29. return "success";
    30. }
    31. }

    测试效果:

    触发发送文本消息

    效果: 

     

    其他的效果:


    好了该篇就到这吧。

  • 相关阅读:
    [附源码]Python计算机毕业设计Django小型银行管理系统
    软件测试-4-用例篇
    Qt项目-安防监控系统(欢迎登录注册)
    Spring Boot(七)
    Fabric.js 使用自定义字体
    新版本下如何通过外部网络访问wsl
    go语言中的锁底层分析(二)
    Mit6.006-problemSet01
    华为云云耀云服务器 L 实例使用,从性能、性价比、易用性、稳定性和安全性等方面进行评测
    PYTHON链家租房数据分析:岭回归、LASSO、随机森林、XGBOOST、KERAS神经网络、KMEANS聚类、地理可视化...
  • 原文地址:https://blog.csdn.net/qq_35387940/article/details/125003593