这个东西有啥用,好玩?
确实, 好玩归好玩,其实有很多使用场景。
可以自己选择一些业务节点触发这个机器人助手的消息推送;
简单举例:
1. 有人给你的系统留下反馈意见了,推送到运营群去;
2.项目部署成功了,推送到运维群去;
3.有人新增业务资料了,推送到客服群去;
消息类型有四种:
文本消息
图片消息
MarkDown格式文本消息
小卡片消息(小卡片哦~)
效果:
1.企业微信群聊,外部群聊不允许弄机器人。
2.整合机器人的前提是,到相关群聊建机器人。
可以整合多个机器人,每个机器的身份标识是 创建的时候 企微分发的一个key。
触发哪个机器人去推消息,就使用哪个key。
①对着群聊右键,点击进入管理聊天消息
②点击添加机器人
3.创建机器人
4.创建成功(这个key就是每个机器人的唯一标识,推送消息可以设计成传key推送)
开始敲代码整合:
惯例,先看下这次实例最终目录结构:
<!-- http请求工具 -->
<dependency>
<groupId>com.dtflys.forest</groupId>
<artifactId>forest-spring-boot-starter</artifactId>
<version>1.5.14</version>
</dependency>
- ## 轻量级HTTP客户端框架forest
- forest:
- # 配置底层API为 okhttp3
- backend: okhttp3
- # 连接池最大连接数,默认值为500
- max-connections: 1000
- # 每个路由的最大连接数,默认值为500
- max-route-connections: 500
- # 请求超时时间,单位为毫秒, 默认值为3000
- timeout: 3000
- # 连接超时时间,单位为毫秒, 默认值为2000
- connect-timeout: 3000
- # 请求失败后重试次数,默认为0次不重试
- retry-count: 1
- # 单向验证的HTTPS的默认SSL协议,默认为SSLv3
- ssl-protocol: SSLv3
- # 打开或关闭日志,默认为true
- logEnabled: true
- # 打开/关闭Forest请求日志(默认为 true)
- log-request: true
- # 打开/关闭Forest响应状态日志(默认为 true)
- log-response-status: true
- # 打开/关闭Forest响应内容日志(默认为 false)
- log-response-content: true
-
- wechat:
- notice:
- key: 3f66977b-****-4af5-****-59*0c4****3d
- server:
- port: 8571
用于对接企微机器人推消息接口,因为我们整合了forest ,简单用注解就行(其实自己用http工具也行)
- import com.dtflys.forest.annotation.JSONBody;
- import com.dtflys.forest.annotation.Post;
- import com.dtflys.forest.annotation.Var;
- import org.springframework.stereotype.Component;
-
- import java.util.Map;
-
- /**
- * @Author: JCccc
- * @Date: 2022-5-27 14:44
- * @Description: 企业微信机器人通知client
- */
- @Component
- public interface WechatNoticeClient {
- @Post(
- url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key={key}",
- headers = {
- "Accept-Charset: utf-8",
- "Content-Type: application/json"
- },
- dataType = "json")
- void sendWechatMsg(@Var("key") String key, @JSONBody Map<String, Object> body);
-
-
- }
用于封装不同消息类型消息的推送方法,里面调用的WechatNoticeClient.
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.stereotype.Component;
- import sun.misc.BASE64Encoder;
-
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.security.MessageDigest;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
-
- /**
- * @Author: JCccc
- * @Date: 2022-5-27 14:48
- * @Description:
- */
- @Component
- public class MyNoticeUtil {
- @Autowired
- private WechatNoticeClient wechatNoticeClient;
- @Value("${wechat.notice.key}")
- private String NOTICE_KEY;
-
- /**
- * 发送文本消息
- */
- public void sendTextMsg() {
- Map<String, Object> sendMap = new HashMap<>();
- //设置消息类型 txt文本
- sendMap.put("msgtype", "text");
- Map<String, String> contentMap = new HashMap<>();
- contentMap.put("content", "你好,我是JCccc的机器人");
- sendMap.put("text", contentMap);
- wechatNoticeClient.sendWechatMsg(NOTICE_KEY, sendMap);
- }
-
- /**
- * 发送markdown文本消息
- */
- public void sendMarkDownTextMsg() {
- Map<String, Object> sendMap = new HashMap<>();
- //设置消息类型 markdown文本
- sendMap.put("msgtype", "markdown");
- Map<String, String> contentMap = new HashMap<>();
- contentMap.put("content", "JCccc,您的账户余额已到账<font color=\\\"warning\\\">15000元</font>,开心起来吧。\\\n" +
- " >付款方:<font color=\\\"comment\\\">白日做梦</font>");
- sendMap.put("markdown", contentMap);
- wechatNoticeClient.sendWechatMsg(NOTICE_KEY, sendMap);
- }
-
- /**
- * 发送图片消息
- */
- public void sendImageMsg() {
- String url = "D:\\Program Files\\JcProjects\\dotest\\src\\main\\resources\\static\\test.png";
- Map<String, Object> sendMap = new HashMap<>();
- sendMap.put("msgtype", "image");
- Map<String, String> contentMap = new HashMap<>();
- contentMap.put("md5", getMd5(url));
- contentMap.put("base64", getBase64(url).replaceAll("\r|\n", ""));
- sendMap.put("image", contentMap);
- wechatNoticeClient.sendWechatMsg(NOTICE_KEY, sendMap);
- }
-
- /**
- * 发送图文消息
- */
- public void sendImageAndTxtMsg() {
- Map<String, Object> sendMap = new HashMap<>();
- sendMap.put("msgtype", "news");
- Map<String, Object> contentMap = new HashMap<>();
- List<Map<String, Object>> list = new ArrayList<>();
- Map<String, Object> obj = new HashMap<>();
- obj.put("title", "小目标青年的博客");
- obj.put("description", "大家给他点点赞!");
- obj.put("url", "https://blog.csdn.net/qq_35387940");
- obj.put("picurl", "https://img-blog.csdnimg.cn/6bc435ac39514cb780739ea1cc34c409.png");
- list.add(obj);
- contentMap.put("articles", list);
- sendMap.put("news", contentMap);
- wechatNoticeClient.sendWechatMsg(NOTICE_KEY, sendMap);
- }
-
-
- /**
- * 图片转为base64编码
- */
- public String getBase64(String imgFile) {
- InputStream in = null;
- byte[] data = null;
- // 读取图片字节数组
- try {
- in = new FileInputStream(imgFile);
- data = new byte[in.available()];
- in.read(data);
- in.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- // 对字节数组Base64编码
- BASE64Encoder encoder = new BASE64Encoder();
- // 返回Base64编码过的字节数组字符串
- return encoder.encode(data);
- }
-
- /**
- * 获取文件的MD5值
- *
- * @param path
- * @return
- */
- public String getMd5(String path) {
- try {
- MessageDigest md5 = MessageDigest.getInstance("MD5");
- FileInputStream fis = new FileInputStream(path);
- byte[] buffer = new byte[1024];
- int len;
- while ((len = fis.read(buffer)) != -1) {
- md5.update(buffer, 0, len);
- }
- fis.close();
- byte[] byteArray = md5.digest();
- StringBuilder sb = new StringBuilder();
- for (byte b : byteArray) {
- sb.append(String.format("%02x", b));
- }
- return sb.toString();
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
-
-
- }
- import com.jc.dotest.wechat.MyNoticeUtil;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.web.bind.annotation.GetMapping;
- import org.springframework.web.bind.annotation.RequestParam;
- import org.springframework.web.bind.annotation.RestController;
-
- /**
- * @Author: JCccc
- * @Date: 2022-5-27 14:52
- * @Description:
- */
- @RestController
- public class TestController {
-
- @Autowired
- MyNoticeUtil myNoticeUtil;
-
- @GetMapping("/doTest")
- public String doTest(@RequestParam("testType") String testType){
- if (testType.equals("1")){
- myNoticeUtil.sendTextMsg();
- }
- if (testType.equals("2")){
- myNoticeUtil.sendMarkDownTextMsg();
- }
- if (testType.equals("3")){
- myNoticeUtil.sendImageMsg();
- }
- if (testType.equals("4")){
- myNoticeUtil.sendImageAndTxtMsg();
- }
- return "success";
- }
-
- }
测试效果:
触发发送文本消息
效果:
其他的效果:
好了该篇就到这吧。