钉钉机器人(1)创建钉钉群机器人推送消息

创建钉钉群机器人发送消息

钉钉群机器人是一个高级扩展功能,只要有一个钉钉账号,就可以使用它。它可以将第三方信息聚合到钉钉群中,实现信息自动同步。支持Webhook协议的自定义接入,通过发明者量化机器人,将提醒、报警等信息聚合到钉钉群中。支持钉钉机器人的文本(text)、链接(link)、markdown、跳转卡片(ActionCard)、消息卡片(FeedCard)类型的消息指令操作。同一条信息还可以同时发送至多个钉钉群。
参考官方链接:https://ding-doc.dingtalk.com/doc#/serverapi2/ye8tup

1、创建机器人

1.1、创建钉钉群

​ 钉钉群每创建一个自定义机器人都会产生唯一的Hook地址,我们称为WebHook地址,通过向该WebHook地址推送消息,钉钉群就会收到消息。我们以PC端钉钉为例,首先点击左上方“+”号发起群聊,如果只想自己接受消息,可以随便拉两个人再踢出去,填写群名称如:“xxx讨论组”,群类型选择普通群即可。

1.2、添加钉钉群机器人

​ 点击头像,选择机器人管理,然后选择自定义,点击添加。自定义机器人名字:“钉钉Adapter工具人”,添加到刚刚创建的钉钉群。机器人支持三种安全设置:

1)点击自定义机器人服务:

智能群助手 在这里插入图片描述

2)添加钉钉机器人

添加钉钉机器人

3)输入机器人名称和添加到群组
输入机器人名称和添加到群组

自定义关键字:只有信息包含这个关键字,信息才会被同步。

加签:相当于设置密码。

IP地址:固定第三方信息的IP地址段。

1.3、获取加密密钥
  • 来自钉钉机器人设置(群主&管理员可见)

  • 群设置 - 智能群助手 - 选定机器人打开设置,然后如下图

    获取加密密钥

1.4、获取Webhook地址

创建完机器人后会显示如下界面:
获取Webhook地址

接着,我们复制webhook地址备用。

如果只用于提醒或报警,选择自定义关键词就可以了。在这里我们定义的关键词是“:”,也就是说当发明者量化机器人推送的信息中包含“:”时,这条信息才会推送到钉钉群中。然后点击同意协议完成。最后复制Webhook地址备用。

2、客户端示例

在获取到Webhook地址后,我们可以在发明者量化策略中向这个地址发起HTTP POST请求,就可以给这个钉钉群发送信息。需要注意的是,在发起POST请求时,必须将字符集编码设置成UTF-8。

钉钉机器人支持文本(text)、链接(link)、markdown三种消息格式,五种消息类型。

下面是文本类型消息测试示例:

package com.test;

import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @description: 钉钉机器人文本消息通知
 **/
@Slf4j
public class DingTalkTextMsgTest {

    /**
     * 发送超时时间10s
     */
    private static final int TIME_OUT = 10000;

    /**
     * 钉钉机器人文档地址https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq
     *
     * @param webhook
     * @param secret     安全设置 3选1:
     *                   【方式一,自定义关键词 】
     *                   【方式二,加签 ,创建机器人时选择加签 secret以SE开头】
     *                   【方式三,IP地址(段)】
     * @param content    发送内容
     * @param mobileList 通知具体人的手机号码列表 (可选)
     * @return
     */
    public static String sendMsg(String webhook, String secret, String content, List<String> mobileList) {
        try {
            //钉钉机器人地址(配置机器人的webhook)
            if (!StringUtils.isEmpty(secret)) {
                Long timestamp = System.currentTimeMillis();
                String sign = getSign(timestamp, secret);
                webhook = new StringBuilder(webhook)
                        .append("&timestamp=")
                        .append(timestamp)
                        .append("&sign=")
                        .append(sign)
                        .toString();
            }
            System.out.println("webhook:" + webhook);
            //是否通知所有人
            boolean isAtAll = false;
            //组装请求内容
            String reqStr = buildReqStr(content, isAtAll, mobileList);
            //推送消息(http请求)
            String result = postJson(webhook, reqStr);
            log.info("推送结果result == " + result);
            return result;
        } catch (Exception e) {
            log.info("发送群通知异常 异常原因:{}", e.getStackTrace());
            return null;
        }
    }

    /**
     * 组装请求报文
     * 发送消息类型 text
     *
     * @param content
     * @return
     */
    private static String buildReqStr(String content, boolean isAtAll, List<String> mobileList) {
        //消息内容
        Map<String, String> contentMap = new HashMap<>();
        contentMap.put("content", content);
        //通知人
        Map<String, Object> atMap = new HashMap<>();
        //1.是否通知所有人
        atMap.put("isAtAll", isAtAll);
        //2.通知具体人的手机号码列表
        atMap.put("atMobiles", mobileList);
        Map<String, Object> reqMap = new HashMap<>();
        reqMap.put("msgtype", "text");
        reqMap.put("text", contentMap);
        reqMap.put("at", atMap);
        return JSON.toJSONString(reqMap);
    }


    private static String postJson(String url, String reqStr) {
        String body = null;
        try {
            body = HttpRequest.post(url).body(reqStr).timeout(TIME_OUT).execute().body();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return body;
    }


    /**
     * 自定义机器人获取签名,创建机器人时选择加签获取secret以SE开头
     * 把timestamp+"\n"+密钥当做签名字符串,使用HmacSHA256算法计算签名,然后进行Base64 encode,最后再把签名参数再进行urlEncode,得到最终的签名(需要使用UTF-8字符集)
     * @param secret 机器人安全设置下的签名
     * @param timestamp 时间戳
     * @return
     * @throws NoSuchAlgorithmException
     * @throws UnsupportedEncodingException
     * @throws InvalidKeyException
     */
    private static String getSign(Long timestamp, String secret) throws NoSuchAlgorithmException, UnsupportedEncodingException, InvalidKeyException {
        String stringToSign = timestamp + "\n" + secret;
        Mac mac = Mac.getInstance("HmacSHA256");
        mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256"));
        byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
        String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)), "UTF-8");
        log.info("sign:" + sign);
        return sign;
    }


    public static void main(String[] args) {
        String webhook = "https://oapi.dingtalk.com/robot/send?access_token=ccxxxxxxxxxxxxxxxx";
        String secret = "SECxxxxxxxxxxxxx";
        List<String> mobileList = new ArrayList<>();
        mobileList.add("18888888888");
        DingTalkTextMsgTest.sendMsg(webhook, secret, "hello!!!", null);
    }
}

修改webhook地址,secret,mobileList运行示例程序即可发送钉钉机器人消息。

3、UI页面测试

1)首先打开测试工具页面:http://cxk0.com/
在这里插入图片描述

2)发送请求

输入机器人TokenURL(Webhook地址),加密密钥(secretToken),Markdown消息标题和Markdown文本消息。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值