企业微信、飞书、钉钉机器人消息发送工具类

这篇具有很好参考价值的文章主要介绍了企业微信、飞书、钉钉机器人消息发送工具类。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、实例化WebClient对象

其实你也可以使用RestTemplate,我这里主要是用到了webflux框架,所以需要实例化客户端请求对象文章来源地址https://www.toymoban.com/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、发送及有效性测试工具类


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.*;

/**
 * 机器人发送工具类(微信,飞书,钉钉)
 *
 * @author huxiang
 */
@Component
@Slf4j
public class RobotUtil {

    @Autowired
    private WebClient webClient;

    /**
     * 机器人发送消息(markdown格式)
     *
     * @param robotUrl   机器人地址
     * @param type       类型:1微信,2飞书,3钉钉
     * @param context    markdown文本内容
     * @param signSecret 签名校验(飞书,钉钉使用,可为空,具体要根据用户是否启用签名)
     */
    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("机器人通知发送结果:" + result);
                        }
                );
    }

    /**
     * 机器人有效性测试 0表示成功,其他表示失败
     *
     * @param robotUrl   机器人地址
     * @param type       类型:1微信,2飞书,3钉钉
     * @param signSecret 签名校验(飞书,钉钉使用,可为空,具体要根据用户是否启用签名)
     * @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("类型转换异常-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"+密钥当做签名字符串
            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;
    }
}

到了这里,关于企业微信、飞书、钉钉机器人消息发送工具类的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用飞书自定义机器人发送消息

    使用飞书机器人可以很方便的获取自动化任务的反馈: 在群里创建一个机器人: 记住下面的 webhook地址,这个是标识机器人的唯一ID,比如它的webhook地址是: \\\"https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxx-ab01-4427-xxxxx-xxxxx\\\" 然后创建程序: 发送之后的效果如下:

    2024年02月03日
    浏览(66)
  • 使用飞书机器人发送消息与文件

    本文默认你已拥有一个机器人,如果没有请点击以下链接创建机器人 检查机器人权限 如果需要跨部门发送消息,检查是否开通跨部门权限 在发布版本时选择作用范围为所有员工 机器人发送消息需要获取以下权限: 通过手机号或邮箱获取用户 ID 查看、评论和下载云空间中所

    2024年04月10日
    浏览(53)
  • 【Java】企业微信群机器人发送消息(文字、图片、MarkDown、文件消息)

    2022/4/22更新:新增可发送文件消息。 发送文件消息需要先将文件上传到企业微信的临时素材,url为https://qyapi.weixin.qq.com/cgi-bin/webhook/upload_media?type=filekey=**********,这个key就是群机器人Webhook地址的key参数,在代码里我已经处理好了,只要有Webhook地址就行。获取到media_id,再拿

    2023年04月08日
    浏览(45)
  • 【Postman】调用飞书机器人接口发送消息

    1、进入飞书,新建一个群组,添加机器人 2、点击该机器人,复制webhook地址 3、打开postman,在url中输入该webhook地址,输入需要请求的json内容,点击发送 内容例如: 4、飞书就会收到对应的消息推送了 5、请求内容的格式参见飞书机器人文档 自定义机器人指南

    2024年02月13日
    浏览(58)
  • 工作随记-Java利用企业微信群机器人定时发送消息

    hi,大家好,我是恰恰 阅读本文需要2分钟~ 最近利用企业微信群机器人做的需求主要有 1.返奖率通知与告警: 抽奖箱能抽出垃圾也能抽出大货,每隔5分钟查询一下这个返奖率,如果用户频繁抽出大货,这个抽奖箱的返奖率已经高出了阈值,那么我们就将其下架。 2.自动发送导

    2024年02月09日
    浏览(51)
  • python飞书群机器人通过webhook发送消息

    python飞书群机器人通过webhook发送消息

    2024年02月06日
    浏览(59)
  • php对接飞书自定义机器人发送消息功能

    今天收到一个需求,需要定时去监控业务是否正常稳定,并将错误信息发送到飞书,之前接入过钉钉机器人都比较顺利,但是今天接入飞书居然卡了半天,特此分享给大家,避免踩坑 1,首先创建飞书机器人 2.创建完成之后,获取机器人对应的 webhook 地址 格式如下: 3.下面提

    2024年04月09日
    浏览(53)
  • Grafana无法发送告警消息的飞书webhook(机器人)

    Grafana无法向飞书机器人发送报警消息,实测使用Grafana自带的webhook也不好使,对于用飞书办公的程序猿非常不便,后来发现一个报警神器,开源免费,关键是好用 PrometheusAlert PrometheusAlert是一个即装即用的程序,非常好用,具体步骤如下: 进入模板页面 找到grafana-fs进入 测试

    2024年02月03日
    浏览(55)
  • 飞书开发学习笔记(七)-添加机器人及发送webhook消息

    1.1 添加飞书机器人过程 在群的右上角点击折叠按键…选择 设置 群机器人中选择 添加机器人 选择自定义机器人,通过webhook发送消息 弹出的信息中有webhook地址,选择复制。 安全设置后续可以设置,比如将信任的IP地址加入IP白名单。 选择仅群主和添加者可以编辑移除机器人

    2024年02月05日
    浏览(42)
  • 钉钉机器人发送jira消息到钉钉群聊

    前期准备 1.安装JIRA相关插件 Automation for Jira - Server Lite。 、 2.配置钉钉群机器人 01.钉钉群右上角点击群设置,选择智能群助手,点击添加机器人,选择自定义机器人; 02.给机器人起个名字,消息推送开启,复制出webhook,后面会用到,勾选自定义,填写(

    2024年02月15日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包