首頁 > 軟體

Springboot整合企業微信機器人助手推播訊息的實現

2022-05-29 14:00:24

前言

這個東西有啥用,好玩?

確實, 好玩歸好玩,其實很有使用場景。

可以自己選則一些業務節點觸發這個機器人助手的訊息推播;

簡單舉例:

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

## 輕量級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

4. 建立 WechatNoticeClient.java

用於對接企微機器人推訊息介面,因為我們整合了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);
 
 
}

5.建立 MyNoticeUtil.java  

用於封裝不同訊息型別訊息的推播方法,裡面呼叫的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\KmProjects\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;
    }
 
 
}

6.簡單寫一個測試介面模擬觸發一下機器人:

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";
    }
 
}

測試效果:

觸發傳送文字訊息

效果: 

 

其他的效果:

到此這篇關於Springboot整合企業微信機器人助手推播訊息的實現的文章就介紹到這了,更多相關Springboot企業微信機器人推播內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com