国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

企業(yè)微信、飛書、釘釘機器人消息發(fā)送工具類

這篇具有很好參考價值的文章主要介紹了企業(yè)微信、飛書、釘釘機器人消息發(fā)送工具類。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1、實例化WebClient對象

其實你也可以使用RestTemplate,我這里主要是用到了webflux框架,所以需要實例化客戶端請求對象文章來源地址http://www.zghlxwxcb.cn/news/detail-694510.html

@Bean
public WebClient webClient(){
    HttpClient httpClient = getHttpClient();
    return WebClient.builder()
            .clientConnector(new ReactorClientHttpConnector(httpClient)).build();
}

private HttpClient getHttpClient() {
    ConnectionProvider provider = ConnectionProvider.builder("你愛咋咋的,一般用你項目名即可")
            .maxConnections(500)
            .maxIdleTime(Duration.ofSeconds(10))
            .maxLifeTime(Duration.ofSeconds(20))
            .pendingAcquireTimeout(Duration.ofSeconds(30))
            .pendingAcquireTimer((r, d) -> {
                Timeout t = wheel.newTimeout(timeout -> r.run(), d.toMillis(), TimeUnit.MILLISECONDS);
                return () -> t.cancel();
            })
            .fifo()
            .build();

    HttpClient httpClient = HttpClient.create(provider);
    return httpClient;
}

2、發(fā)送及有效性測試工具類


import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.tomcat.util.codec.binary.Base64;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.Map;

import static com.paratera.console.notice.utils.Constants.*;

/**
 * 機器人發(fā)送工具類(微信,飛書,釘釘)
 *
 * @author huxiang
 */
@Component
@Slf4j
public class RobotUtil {

    @Autowired
    private WebClient webClient;

    /**
     * 機器人發(fā)送消息(markdown格式)
     *
     * @param robotUrl   機器人地址
     * @param type       類型:1微信,2飛書,3釘釘
     * @param context    markdown文本內(nèi)容
     * @param signSecret 簽名校驗(飛書,釘釘使用,可為空,具體要根據(jù)用戶是否啟用簽名)
     */
    public void sendMsg(String robotUrl, Integer type, String context, String signSecret) {
        JSONObject msgObj = JSONUtil.createObj();
        JSONObject mdObj = JSONUtil.createObj();
        switch (type) {
            case ROBOT_TYPE_WX:
                msgObj.set("msgtype", "markdown");
                mdObj.set("content", context);
                msgObj.set("markdown", mdObj);
                break;
            case ROBOT_TYPE_FS:
                if (StringUtils.isNotEmpty(signSecret)) {
                    msgObj = getFsSignObj(signSecret);
                }
                msgObj.set("msg_type", "interactive");
                mdObj.set("tag", "lark_md");
                mdObj.set("content", context);
                JSONArray elements = JSONUtil.createArray();
                JSONObject wrapObj = JSONUtil.createObj();
                wrapObj.set("tag", "div");
                wrapObj.set("text", mdObj);
                elements.put(wrapObj);
                JSONObject cardObj = JSONUtil.createObj();
                cardObj.set("elements", elements);
                msgObj.set("card", cardObj);
                break;
            case ROBOT_TYPE_DD:
                if (StringUtils.isNotEmpty(signSecret)) {
                    robotUrl = getDdRobotURL(robotUrl, signSecret);
                }
                msgObj.set("msgtype", "markdown");
                mdObj.set("title", "通知");
                mdObj.set("text", context);
                msgObj.set("markdown", mdObj);
                break;
        }
        webClient.post()
                .uri(robotUrl)
                .contentType(MediaType.APPLICATION_JSON)
                .body(BodyInserters.fromValue(msgObj))
                .retrieve().bodyToMono(String.class).subscribe(
                        result -> {
                            log.info("機器人通知發(fā)送結(jié)果:" + result);
                        }
                );
    }

    /**
     * 機器人有效性測試 0表示成功,其他表示失敗
     *
     * @param robotUrl   機器人地址
     * @param type       類型:1微信,2飛書,3釘釘
     * @param signSecret 簽名校驗(飛書,釘釘使用,可為空,具體要根據(jù)用戶是否啟用簽名)
     * @return
     */
    public Integer sendTestMsg(String robotUrl, Integer type, String signSecret) {
        JSONObject msgObj = JSONUtil.createObj();
        JSONObject mdObj = JSONUtil.createObj();
        ObjectMapper mapper = new ObjectMapper();
        switch (type) {
            case ROBOT_TYPE_WX:
                msgObj.set("msgtype", "markdown");
                mdObj.set("content", "機器人有效性測試!");
                msgObj.set("markdown", mdObj);
                break;
            case ROBOT_TYPE_FS:
                if (StringUtils.isNotEmpty(signSecret)) {
                    msgObj = getFsSignObj(signSecret);
                }
                msgObj.set("msg_type", "interactive");
                mdObj.set("tag", "lark_md");
                mdObj.set("content", "機器人有效性測試!");
                JSONArray elements = JSONUtil.createArray();
                JSONObject wrapObj = JSONUtil.createObj();
                wrapObj.set("tag", "div");
                wrapObj.set("text", mdObj);
                elements.put(wrapObj);
                JSONObject cardObj = JSONUtil.createObj();
                cardObj.set("elements", elements);
                msgObj.set("card", cardObj);
                break;
            case ROBOT_TYPE_DD:
                if (StringUtils.isNotEmpty(signSecret)) {
                    robotUrl = getDdRobotURL(robotUrl, signSecret);
                }
                msgObj.set("msgtype", "markdown");
                mdObj.set("title", "通知");
                mdObj.set("text", "機器人有效性測試!");
                msgObj.set("markdown", mdObj);
                break;

        }
        Mono<String> mono = webClient.post()
                .uri(robotUrl)
                .contentType(MediaType.APPLICATION_JSON)
                .body(BodyInserters.fromValue(msgObj))
                .retrieve().bodyToMono(String.class);
        String result = mono.block();
        try {
            Map res = mapper.readValue(result, Map.class);
            return (Integer) (res.containsKey("errcode") ? res.get("errcode") : res.get("code"));
        } catch (JsonProcessingException e) {
            log.error("類型轉(zhuǎn)換異常-RobotUtil.sendTestMsg:" + e);
        }
        return -1;
    }

    /**
     * 飛書獲取帶簽名的消息體
     *
     * @return
     */
    public JSONObject getFsSignObj(String signSecret) {
        JSONObject signObj = JSONUtil.createObj();
        Long timestamp = DateUtil.currentSeconds();
        String sign = null;
        try {
            //把timestamp+"\n"+密鑰當(dāng)做簽名字符串
            String stringToSign = timestamp + "\n" + signSecret;
            //使用HmacSHA256算法計算簽名
            Mac mac = Mac.getInstance("HmacSHA256");
            mac.init(new SecretKeySpec(stringToSign.getBytes(StandardCharsets.UTF_8), "HmacSHA256"));
            byte[] signData = mac.doFinal(new byte[]{});
            sign = Base64.encodeBase64String(signData);
        } catch (Exception e) {
            log.error("飛書獲取簽名失敗:" + e);
        }
        if (StringUtils.isEmpty(sign)) {
            return null;
        }
        signObj.set("timestamp", timestamp);
        signObj.set("sign", sign);
        return signObj;
    }


    /**
     * 釘釘獲取帶簽名的機器人推送URL
     *
     * @return
     */

    public String getDdRobotURL(String robotUrl, String signSecret) {
        Long timestamp = System.currentTimeMillis();
        String stringToSign = timestamp + "\n" + signSecret;
        String sign = null;
        try {
            Mac mac = Mac.getInstance("HmacSHA256");
            mac.init(new SecretKeySpec(signSecret.getBytes("UTF-8"), "HmacSHA256"));
            byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
            sign = URLEncoder.encode(Base64.encodeBase64String(signData), "UTF-8");
        } catch (Exception e) {
            log.error("釘釘獲取簽名失敗:" + e);
        }
        if (StringUtils.isEmpty(sign)) {
            return null;
        }
        return robotUrl + "&timestamp=" + timestamp + "&sign=" + sign;
    }
}

到了這里,關(guān)于企業(yè)微信、飛書、釘釘機器人消息發(fā)送工具類的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 使用飛書機器人發(fā)送消息與文件

    使用飛書機器人發(fā)送消息與文件

    本文默認你已擁有一個機器人,如果沒有請點擊以下鏈接創(chuàng)建機器人 檢查機器人權(quán)限 如果需要跨部門發(fā)送消息,檢查是否開通跨部門權(quán)限 在發(fā)布版本時選擇作用范圍為所有員工 機器人發(fā)送消息需要獲取以下權(quán)限: 通過手機號或郵箱獲取用戶 ID 查看、評論和下載云空間中所

    2024年04月10日
    瀏覽(24)
  • 使用飛書自定義機器人發(fā)送消息

    使用飛書自定義機器人發(fā)送消息

    使用飛書機器人可以很方便的獲取自動化任務(wù)的反饋: 在群里創(chuàng)建一個機器人: 記住下面的 webhook地址,這個是標識機器人的唯一ID,比如它的webhook地址是: \\\"https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxx-ab01-4427-xxxxx-xxxxx\\\" 然后創(chuàng)建程序: 發(fā)送之后的效果如下:

    2024年02月03日
    瀏覽(24)
  • 【Java】企業(yè)微信群機器人發(fā)送消息(文字、圖片、MarkDown、文件消息)

    【Java】企業(yè)微信群機器人發(fā)送消息(文字、圖片、MarkDown、文件消息)

    2022/4/22更新:新增可發(fā)送文件消息。 發(fā)送文件消息需要先將文件上傳到企業(yè)微信的臨時素材,url為https://qyapi.weixin.qq.com/cgi-bin/webhook/upload_media?type=filekey=**********,這個key就是群機器人Webhook地址的key參數(shù),在代碼里我已經(jīng)處理好了,只要有Webhook地址就行。獲取到media_id,再拿

    2023年04月08日
    瀏覽(18)
  • 【Postman】調(diào)用飛書機器人接口發(fā)送消息

    【Postman】調(diào)用飛書機器人接口發(fā)送消息

    1、進入飛書,新建一個群組,添加機器人 2、點擊該機器人,復(fù)制webhook地址 3、打開postman,在url中輸入該webhook地址,輸入需要請求的json內(nèi)容,點擊發(fā)送 內(nèi)容例如: 4、飛書就會收到對應(yīng)的消息推送了 5、請求內(nèi)容的格式參見飛書機器人文檔 自定義機器人指南

    2024年02月13日
    瀏覽(22)
  • 工作隨記-Java利用企業(yè)微信群機器人定時發(fā)送消息

    工作隨記-Java利用企業(yè)微信群機器人定時發(fā)送消息

    hi,大家好,我是恰恰 閱讀本文需要2分鐘~ 最近利用企業(yè)微信群機器人做的需求主要有 1.返獎率通知與告警: 抽獎箱能抽出垃圾也能抽出大貨,每隔5分鐘查詢一下這個返獎率,如果用戶頻繁抽出大貨,這個抽獎箱的返獎率已經(jīng)高出了閾值,那么我們就將其下架。 2.自動發(fā)送導(dǎo)

    2024年02月09日
    瀏覽(20)
  • python飛書群機器人通過webhook發(fā)送消息

    python飛書群機器人通過webhook發(fā)送消息

    2024年02月06日
    瀏覽(24)
  • Grafana無法發(fā)送告警消息的飛書webhook(機器人)

    Grafana無法發(fā)送告警消息的飛書webhook(機器人)

    Grafana無法向飛書機器人發(fā)送報警消息,實測使用Grafana自帶的webhook也不好使,對于用飛書辦公的程序猿非常不便,后來發(fā)現(xiàn)一個報警神器,開源免費,關(guān)鍵是好用 PrometheusAlert PrometheusAlert是一個即裝即用的程序,非常好用,具體步驟如下: 進入模板頁面 找到grafana-fs進入 測試

    2024年02月03日
    瀏覽(18)
  • php對接飛書自定義機器人發(fā)送消息功能

    php對接飛書自定義機器人發(fā)送消息功能

    今天收到一個需求,需要定時去監(jiān)控業(yè)務(wù)是否正常穩(wěn)定,并將錯誤信息發(fā)送到飛書,之前接入過釘釘機器人都比較順利,但是今天接入飛書居然卡了半天,特此分享給大家,避免踩坑 1,首先創(chuàng)建飛書機器人 2.創(chuàng)建完成之后,獲取機器人對應(yīng)的 webhook 地址 格式如下: 3.下面提

    2024年04月09日
    瀏覽(84)
  • 飛書開發(fā)學(xué)習(xí)筆記(七)-添加機器人及發(fā)送webhook消息

    飛書開發(fā)學(xué)習(xí)筆記(七)-添加機器人及發(fā)送webhook消息

    1.1 添加飛書機器人過程 在群的右上角點擊折疊按鍵…選擇 設(shè)置 群機器人中選擇 添加機器人 選擇自定義機器人,通過webhook發(fā)送消息 彈出的信息中有webhook地址,選擇復(fù)制。 安全設(shè)置后續(xù)可以設(shè)置,比如將信任的IP地址加入IP白名單。 選擇僅群主和添加者可以編輯移除機器人

    2024年02月05日
    瀏覽(21)
  • 釘釘機器人發(fā)送jira消息到釘釘群聊

    釘釘機器人發(fā)送jira消息到釘釘群聊

    前期準備 1.安裝JIRA相關(guān)插件 Automation for Jira - Server Lite。 、 2.配置釘釘群機器人 01.釘釘群右上角點擊群設(shè)置,選擇智能群助手,點擊添加機器人,選擇自定義機器人; 02.給機器人起個名字,消息推送開啟,復(fù)制出webhook,后面會用到,勾選自定義,填寫(

    2024年02月15日
    瀏覽(53)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包