最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot中集成企業(yè)微信機(jī)器人實(shí)現(xiàn)運(yùn)維報(bào)警的示例

 更新時(shí)間:2022年05月07日 15:46:34   作者:Asurplus  
本文主要介紹了SpringBoot中集成企業(yè)微信機(jī)器人實(shí)現(xiàn)運(yùn)維報(bào)警,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

在企業(yè)運(yùn)營(yíng)中,為了實(shí)現(xiàn)工作效率和執(zhí)行效率的提升,往往會(huì)選擇在社群中使用群聊機(jī)器人進(jìn)行協(xié)助管理。機(jī)器人可以定時(shí)或者按照一定的規(guī)則給群里發(fā)信息并@群成員等。群聊機(jī)器人可以活躍氣氛,關(guān)懷員工比如根據(jù)天氣情況提醒員工注意天氣變化,發(fā)送節(jié)日、生日祝福等。它也可以進(jìn)行工作提醒,幫助員工更好的做系統(tǒng)化的回報(bào)總結(jié),機(jī)器人可以依托業(yè)務(wù)系統(tǒng),每天定時(shí)發(fā)送工作總結(jié)給對(duì)應(yīng)負(fù)責(zé)人,幫助員工更好地復(fù)盤工作。

1、注冊(cè)企業(yè)微信

注冊(cè)地址:https://work.weixin.qq.com/wework_admin/register_wx?from=myhome

這里的注冊(cè)企業(yè)微信,不一定需要你有企業(yè)信息,可以任意填寫,不需要審核

2、添加群機(jī)器人

加入企業(yè)微信后,會(huì)有一個(gè)該企業(yè)的全員群,我們可以在群內(nèi)添加機(jī)器人:

在這里插入圖片描述

填寫機(jī)器人名稱

在這里插入圖片描述

在這里插入圖片描述

添加成功后,得到機(jī)器人的 Webhook 地址,我們需要用到它,特別特別要注意:一定要保護(hù)好機(jī)器人的 webhook 地址,避免泄漏!不要分享到 github、博客等可被公開查閱的地方,否則壞人就可以用你的機(jī)器人來(lái)發(fā)垃圾消息了。

3、引入 forest 依賴

<!-- http請(qǐng)求工具 -->
<dependency>
    <groupId>com.dtflys.forest</groupId>
    <artifactId>forest-spring-boot-starter</artifactId>
    <version>1.5.14</version>
</dependency>

forest 是聲明式 HTTP 客戶端 API 框架,讓 Java 發(fā)送 HTTP/HTTPS 請(qǐng)求不再難。它比 OkHttp 和 HttpClient 更高層,是封裝調(diào)用第三方 restful api client 接口的好幫手,是 retrofit 和 feign 之外另一個(gè)選擇。通過(guò)在接口上聲明注解的方式配置 HTTP 請(qǐng)求接口,Gitee 地址:https://gitee.com/dromara/forest

文檔地址:https://forest.dtflyx.com/

相關(guān)配置:

## 輕量級(jí)HTTP客戶端框架forest
forest:
  # 配置底層API為 okhttp3
  backend: okhttp3
  # 連接池最大連接數(shù),默認(rèn)值為500
  max-connections: 1000
  # 每個(gè)路由的最大連接數(shù),默認(rèn)值為500
  max-route-connections: 500
  # 請(qǐng)求超時(shí)時(shí)間,單位為毫秒, 默認(rèn)值為3000
  timeout: 3000
   # 連接超時(shí)時(shí)間,單位為毫秒, 默認(rèn)值為2000
  connect-timeout: 3000
   # 請(qǐng)求失敗后重試次數(shù),默認(rèn)為0次不重試
  retry-count: 1
   # 單向驗(yàn)證的HTTPS的默認(rèn)SSL協(xié)議,默認(rèn)為SSLv3
  ssl-protocol: SSLv3
   # 打開或關(guān)閉日志,默認(rèn)為true
  logEnabled: true
   # 打開/關(guān)閉Forest請(qǐng)求日志(默認(rèn)為 true)
  log-request: true
   # 打開/關(guān)閉Forest響應(yīng)狀態(tài)日志(默認(rèn)為 true)
  log-response-status: true
   # 打開/關(guān)閉Forest響應(yīng)內(nèi)容日志(默認(rèn)為 false)
  log-response-content: true

4、請(qǐng)求方法

import com.dtflys.forest.annotation.JSONBody;
import com.dtflys.forest.annotation.Post;
import com.dtflys.forest.annotation.Var;

import java.util.Map;

public interface WechatClient {

    @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);
}

使用 forest 做 http 請(qǐng)求非常方便,只需要使用注解的方式輕松完成請(qǐng)求

5、發(fā)送消息

注入請(qǐng)求接口:

@Resource
private WechatClient wechatClient;

1、發(fā)送文本消息

/**
 * 發(fā)送文本消息
 */
public void sendTextMsg() {
    Map<String, Object> map = new HashMap<>();
    map.put("msgtype", "text");
    Map<String, String> content = new HashMap<>();
    content.put("content", "hello world!");
    map.put("text", content);
    wechatClient.sendWechatMsg("xxxxxxxxxxxxxxxxxx", map);
}

其中:xxxxxxxxxxxxxx 為你的機(jī)器人的 Webhook 地址的 key

如果我們想 @某人時(shí),我們可以在 content 中這樣寫:

content.put("content", "hello world!<@zhangsan>");

這樣就可以 @zhangsan 了,僅支持 text、markdown 類型的消息

2、發(fā)送 MD 消息

/**
 * 發(fā)送md消息
 */
public void sendMarkdownMsg() {
    Map<String, Object> map = new HashMap<>();
    map.put("msgtype", "markdown");
    Map<String, String> content = new HashMap<>();
    content.put("content", "實(shí)時(shí)新增用戶反饋<font color=\\\"warning\\\">132例</font>,請(qǐng)相關(guān)同事注意。\\n\n" +
            "         >類型:<font color=\\\"comment\\\">用戶反饋</font>\n" +
            "         >普通用戶反饋:<font color=\\\"comment\\\">117例</font>\n" +
            "         >VIP用戶反饋:<font color=\\\"comment\\\">15例</font>");
    map.put("markdown", content);
    wechatClient.sendWechatMsg("xxxxxxxxxxxxxxxxxx", map);
}

markdown 語(yǔ)法教程見:https://mp.weixin.qq.com/s/uvxdj4tdWePkGbdD5I9iLQ

3、發(fā)送圖片消息

/**
 * 發(fā)送圖片消息
 */
public void sendImageMsg() {
    String url = "C:\\Users\\admin\\Desktop\\test.png";
    Map<String, Object> map = new HashMap<>();
    map.put("msgtype", "image");
    Map<String, String> content = new HashMap<>();
    content.put("md5", getMd5(url));
    content.put("base64", getBase64(url));
    map.put("image", content);
    wechatClient.sendWechatMsg("xxxxxxxxxxxxxxxxxx", map);
}

我們需要圖片的 base64 編碼和 MD5 值,方法如下:

/**
 * 圖片轉(zhuǎn)為base64編碼
 */
public static String getBase64(String imgFile) {
    InputStream in = null;
    byte[] data = null;
    //  讀取圖片字節(jié)數(shù)組
    try {
        in = new FileInputStream(imgFile);
        data = new byte[in.available()];
        in.read(data);
        in.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    // 對(duì)字節(jié)數(shù)組Base64編碼
    BASE64Encoder encoder = new BASE64Encoder();
    // 返回Base64編碼過(guò)的字節(jié)數(shù)組字符串
    return encoder.encode(data);
}

/**
 * 獲取文件的MD5值
 *
 * @param path
 * @return
 */
public static 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 (IOException | NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    return null;
}

這里會(huì)有一個(gè)坑,發(fā)送請(qǐng)求后,返回的請(qǐng)求碼是 200,但是收不到消息,會(huì)看到提示信息:

{"errcode":301019,"errmsg":"media md5 not match, hint: [1651825628340383128465893], from ip: 218.201.194.160, more info at https://open.work.weixin.qq.com/devtool/query?e=301019"}

提示我們:媒體md5不匹配

其實(shí),并不是 MD5 的問(wèn)題,是 base64 的問(wèn)題,轉(zhuǎn)化出來(lái)的 base64 編碼 存在 \r\n,我們需要將其替換掉,這樣寫:

content.put("base64", getBase64(url).replaceAll("\r|\n", ""));

4、發(fā)送圖文消息

/**
 * 發(fā)送圖文消息
 */
public void sendNewsMsg() {
    Map<String, Object> map = new HashMap<>();
    map.put("msgtype", "news");
    Map<String, Object> content = new HashMap<>();
    List<Map<String, Object>> list = new ArrayList<>();
    Map<String, Object> obj = new HashMap<>();
    obj.put("title", "中秋節(jié)禮品領(lǐng)取");
    obj.put("description", "今年中秋節(jié)公司有豪禮相送");
    obj.put("url", "www.qq.com");
    obj.put("picurl", "http://res.mail.qq.com/node/ww/wwopenmng/images/independent/doc/test_pic_msg1.png");
    list.add(obj);
    content.put("articles", list);
    map.put("news", content);
    wechatClient.sendWechatMsg("xxxxxxxxxxxxxxxxxx", map);
}

6、測(cè)試

1、發(fā)送文本消息

在這里插入圖片描述

2、發(fā)送 MD 消息

在這里插入圖片描述

3、發(fā)送圖片消息

在這里插入圖片描述

4、發(fā)送圖文消息

在這里插入圖片描述

5、發(fā)送文本消息并@群?jiǎn)T

在這里插入圖片描述

到此這篇關(guān)于SpringBoot中集成企業(yè)微信機(jī)器人實(shí)現(xiàn)運(yùn)維報(bào)警的示例的文章就介紹到這了,更多相關(guān)SpringBoot運(yùn)維報(bào)警內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java實(shí)現(xiàn)俄羅斯方塊的源碼分享

    Java實(shí)現(xiàn)俄羅斯方塊的源碼分享

    俄羅斯方塊是一個(gè)最初由阿列克謝帕吉特諾夫在蘇聯(lián)設(shè)計(jì)和編程的益智類視頻游戲。本文將利用Java語(yǔ)言實(shí)現(xiàn)這一經(jīng)典的小游戲,感興趣的可以學(xué)習(xí)一下
    2022-05-05
  • Java實(shí)現(xiàn)定時(shí)讀取json文件里內(nèi)容的示例代碼

    Java實(shí)現(xiàn)定時(shí)讀取json文件里內(nèi)容的示例代碼

    有時(shí)候我們會(huì)需要定時(shí)來(lái)讀取JSON配置文件里的內(nèi)容,來(lái)執(zhí)行一些業(yè)務(wù)邏輯上的操作,本文就介紹了Java實(shí)現(xiàn)定時(shí)讀取json文件里內(nèi)容的示例代碼,感興趣的可以了解一下
    2023-08-08
  • SpringBoot中的multipartResolver上傳文件配置

    SpringBoot中的multipartResolver上傳文件配置

    這篇文章主要介紹了SpringBoot中的multipartResolver上傳文件配置,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java如何用時(shí)間戳重命名上傳的文件

    Java如何用時(shí)間戳重命名上傳的文件

    這篇文章主要介紹了Java如何用時(shí)間戳重命名上傳的文件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • java8中的HashMap原理詳解

    java8中的HashMap原理詳解

    這篇文章主要介紹了java8中的HashMap原理詳解,HashMap是日常開發(fā)中非常常用的容器,HashMap實(shí)現(xiàn)了Map接口,底層的實(shí)現(xiàn)原理是哈希表,HashMap不是一個(gè)線程安全的容器,需要的朋友可以參考下
    2023-09-09
  • 如何實(shí)用Java實(shí)現(xiàn)合并、拆分PDF文檔

    如何實(shí)用Java實(shí)現(xiàn)合并、拆分PDF文檔

    這篇文章主要介紹了如何實(shí)用Java實(shí)現(xiàn)合并、拆分PDF文檔,處理PDF文檔時(shí),這樣的好處是對(duì)文檔的存儲(chǔ)、管理很方便。下面將通過(guò)Java程序代碼介紹具體的PDF合并、拆分的方法,需要的朋友可以參考下
    2019-07-07
  • Spring利用@Validated注解實(shí)現(xiàn)參數(shù)校驗(yàn)詳解

    Spring利用@Validated注解實(shí)現(xiàn)參數(shù)校驗(yàn)詳解

    這篇文章主要為大家詳細(xì)介紹了在?Spring?項(xiàng)目中使用?@Validated?進(jìn)行參數(shù)校驗(yàn)的方法和常見應(yīng)用場(chǎng)景,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-05-05
  • Java實(shí)現(xiàn)Jar文件的遍歷復(fù)制與文件追加

    Java實(shí)現(xiàn)Jar文件的遍歷復(fù)制與文件追加

    這篇文章主要為大家詳細(xì)介紹了如何利用Java實(shí)現(xiàn)Jar文件的遍歷復(fù)制與文件追加功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-11-11
  • 使用jvm sandbox對(duì)三層嵌套類型的改造示例

    使用jvm sandbox對(duì)三層嵌套類型的改造示例

    這篇文章主要為大家介紹了使用jvm sandbox對(duì)三層嵌套類型的改造示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Java生成范圍內(nèi)隨機(jī)整數(shù)的三種方法

    Java生成范圍內(nèi)隨機(jī)整數(shù)的三種方法

    在Java中生成隨機(jī)數(shù)的場(chǎng)景有很多,下面這篇文章主要給大家介紹了關(guān)于Java生成范圍內(nèi)隨機(jī)整數(shù)的三種方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07

最新評(píng)論

孟津县| 汕头市| 奉新县| 穆棱市| 融水| 江陵县| 陵水| 盘锦市| 通城县| 水城县| 海晏县| 岳西县| 白玉县| 定日县| 万年县| 弋阳县| 苍溪县| 封丘县| 贵阳市| 邵阳县| 苍山县| 泗阳县| 临西县| 龙里县| 南通市| 会泽县| 周宁县| 修水县| 英超| 从化市| 姜堰市| 舟曲县| 彭阳县| 定日县| 洪湖市| 溧水县| 工布江达县| 化隆| 太保市| 新龙县| 浠水县|