钉钉自定义机器人 对接源码

package top.mhi.provider.usc.controller;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;

/**
* @author 
*
* @dateTime 2020年3月31日 下午1:56:00
*
* @describe  消息发送频率限制:
* 每个机器人每分钟最多发送20条。
* 消息发送太频繁会严重影响群成员的使用体验,大量发消息的场景 (譬如系统监控报警) 可以将这些信息进行整合,通过markdown消息以摘要的形式发送到群里。
*/

import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.OapiRobotSendRequest;
import com.dingtalk.api.response.OapiRobotSendResponse;
import com.taobao.api.ApiException;

public class TestController {

    private static final String MSG_TYPE_TEXT = "text";
    private static final String MSG_TYPE_LINK = "link";
    private static final String MSG_TYPE_MARKDOWN = "markdown";
    private static final String MSG_TYPE_ACTION_CARD = "actionCard";
    private static final String MSG_TYPE_FEED_CARD = "feedCard";

    public static void main(String[] args)
            throws NoSuchAlgorithmException, InvalidKeyException, UnsupportedEncodingException, ApiException {

        Long timestamp = System.currentTimeMillis();
        String secret = "";
        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");
        DingTalkClient client = new DefaultDingTalkClient(
                "https://oapi.dingtalk.com/robot/send?access_token=&sign="
                        + sign + "&timestamp=" + timestamp);
        
        boolean isAtAll=true;
        List<String> mobileList = new ArrayList<String>();
        mobileList.add("13xxxxxxx51");
        
        
        //发送文本示例
//        String content="你好呀,我是属于你的钉小蜜";
//        OapiRobotSendRequest request = sendMessageByText(content, mobileList, isAtAll);
        
        //发送link类型示例
//        String title="Hello Mr li";
//        String content="你好呀,我是属于你的钉小蜜";
//        String messageUrl="http://www.ruiwen.com/wenxue/loushiming/";
//        String picUrl="http://pic.ruiwen.com/allimg/copyright/lanmu/lm150.jpg?x-oss-process=style/qr.ruiwen";
//        OapiRobotSendRequest request = sendMessageByLink(title,content,messageUrl,picUrl);
//        
        
        //markdown类型
//        String title="Mr li";
//        String content=" 你好呀,我是属于你的钉小蜜";
//        OapiRobotSendRequest request = sendMessageByMarkdown(title,content,isAtAll,mobileList);
        
        
        //整体跳转ActionCard类型
        String title="Hello Mr li";
        String content="你好呀,我是属于你的钉小蜜";
        String btnOrientation="1";
        String hideAvatar="0";
        String singleTitle="内容不错";
        String singleURL="http://pic.ruiwen.com/allimg/copyright/lanmu/lm150.jpg?x-oss-process=style/qr.ruiwen";
        OapiRobotSendRequest request = sendMessageByActionCardSingle(title,content,singleTitle,singleURL,btnOrientation,hideAvatar);
        
        
        
        OapiRobotSendResponse response = client.execute(request);

    }

    /**
     * @description: 发送普通文本消息
     * @param content    文本消息
     * @param mobileList 指定@ 联系人
     * @param isAtAll    是否@ 全部联系人
     * @return: com.dingtalk.api.response.OapiRobotSendResponse
     */
    public static OapiRobotSendRequest sendMessageByText(String content, List<String> mobileList, boolean isAtAll) {
        if (StringUtils.isBlank(content)) {
            return null;
        }

        // 参数 参数类型 必须 说明
        // msgtype String 是 消息类型,此时固定为:text
        // content String 是 消息内容
        // atMobiles Array 否 被@人的手机号(在content里添加@人的手机号)
        // isAtAll bool 否 @所有人时:true,否则为:false
        OapiRobotSendRequest.Text text = new OapiRobotSendRequest.Text();
        text.setContent(content);
        OapiRobotSendRequest request = new OapiRobotSendRequest();
        if (!CollectionUtils.isEmpty(mobileList)) {
            // 发送消息并@ 以下手机号联系人
            OapiRobotSendRequest.At at = new OapiRobotSendRequest.At();
            at.setAtMobiles(mobileList);
            at.setIsAtAll(isAtAll ? "true" : "false");
            request.setAt(at);
        }
        request.setMsgtype(MSG_TYPE_TEXT);
        request.setText(text);
        return request;
    };

    /**
     * @description: 发送link 类型消息
     * @param title      消息标题
     * @param text       消息内容
     * @param messageUrl 点击消息后跳转的url
     * @param picUrl     插入图片的url
     * @return: com.dingtalk.api.response.OapiRobotSendResponse
     */
    public static OapiRobotSendRequest sendMessageByLink(String title, String text, String messageUrl, String picUrl) {
        if (StringUtils.isBlank(title)) {
            return null;
        }
        if (StringUtils.isBlank(text)) {
            return null;
        }
        if (StringUtils.isBlank(messageUrl)) {
            return null;
        }
        // 参数 参数类型 必须 说明
        // msgtype String 是 消息类型,此时固定为:link
        // title String 是 消息标题
        // text String 是 消息内容。如果太长只会部分展示
        // messageUrl String 是 点击消息跳转的URL
        // picUrl String 否 图片URL
        OapiRobotSendRequest.Link link = new OapiRobotSendRequest.Link();
        link.setTitle(title);
        link.setText(text);
        link.setMessageUrl(messageUrl);
        link.setPicUrl(picUrl);
        OapiRobotSendRequest request = new OapiRobotSendRequest();
        request.setMsgtype(MSG_TYPE_LINK);
        request.setLink(link);
        return request;
    }

    /**
     * 发送markdown类型消息
     * 
     * @param title     发送显示标题,
     * @param content   发送显示内容,
     * @param isAtAll   所有人时:true,否则为:false,
     * @param atMobiles 被@人的手机号(在text内容里要有@手机号)
     * @contentStyle 内容样式: 标题 # 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 ##### 五级标题 ######
     *               六级标题
     * 
     *               引用 > A man who stands for nothing will fall for anything.
     * 
     *               文字加粗、斜体 **bold** *italic*
     * 
     *               链接 [this is a link](http://name.com)
     * 
     *               图片 ![](http://name.com/pic.jpg)
     * 
     *               无序列表 - item1 - item2
     * 
     *               有序列表 1. item1 2. item2
     * @return
     * 
     * 
     */
    public static OapiRobotSendRequest sendMessageByMarkdown(String title, String content, boolean isAtAll,
            List<String> atMobiles) {
        OapiRobotSendRequest request = new OapiRobotSendRequest();
        request.setMsgtype(MSG_TYPE_MARKDOWN);
        OapiRobotSendRequest.Markdown markdown = new OapiRobotSendRequest.Markdown();
        markdown.setTitle(title);
        markdown.setText(content);
        request.setMarkdown(markdown);
        if (!CollectionUtils.isEmpty(atMobiles)) {
            OapiRobotSendRequest.At at = new OapiRobotSendRequest.At();
            at.setIsAtAll(isAtAll ? "true" : "false");
            at.setAtMobiles(atMobiles);
            request.setAt(at);
        }
        return request;
    }

    /**
     * @description: 整体跳转ActionCard类型的消息发送
     * @param title          消息标题, 会话消息会展示标题
     * @param markdownText   markdown格式的消息
     * @param singleTitle    单个按钮的标题
     * @param singleURL      单个按钮的跳转链接
     * @param btnOrientation 是否横向排列(1 横向排列, 0 纵向排列)
     * @param hideAvatar     是否隐藏发消息者头像(1 隐藏头像, 0 不隐藏)
     * @return: com.dingtalk.api.response.OapiRobotSendResponse
     */
    public static OapiRobotSendRequest sendMessageByActionCardSingle(String title, String markdownText,
            String singleTitle, String singleURL, String btnOrientation, String hideAvatar) {
        if (StringUtils.isBlank(title)) {
            return null;
        }
        if (StringUtils.isBlank(markdownText)) {
            return null;
        }
        // 参数 类型 必选 说明
        // msgtype string true 此消息类型为固定actionCard
        // title string true 首屏会话透出的展示内容
        // text string true markdown格式的消息
        // singleTitle string true 单个按钮的方案。(设置此项和singleURL后btns无效)
        // singleURL string true 点击singleTitle按钮触发的URL
        // btnOrientation string false 0-按钮竖直排列,1-按钮横向排列
        // hideAvatar string false 0-正常发消息者头像,1-隐藏发消息者头像
        OapiRobotSendRequest.Actioncard actionCard = new OapiRobotSendRequest.Actioncard();
        actionCard.setTitle(title);
        actionCard.setText(markdownText);
        actionCard.setSingleTitle(singleTitle);
        actionCard.setSingleURL(singleURL);
        actionCard.setBtnOrientation(btnOrientation);
        actionCard.setHideAvatar(hideAvatar);
        OapiRobotSendRequest request = new OapiRobotSendRequest();
        request.setMsgtype(MSG_TYPE_ACTION_CARD);
        request.setActionCard(actionCard);
        return request;
    }

    /**
     * @description: 独立跳转ActionCard类型 消息发送
     * @param title          标题
     * @param markdownText   文本
     * @param btns           按钮列表
     * @param btnOrientation 是否横向排列(true 横向排列, false 纵向排列)
     * @param hideAvatar     是否隐藏发消息者头像(true 隐藏头像, false 不隐藏)
     * @return: com.dingtalk.api.response.OapiRobotSendResponse
     */
    public static OapiRobotSendRequest sendMessageByActionCardMulti(String title, String markdownText,
            List<OapiRobotSendRequest.Btns> btns, boolean btnOrientation, boolean hideAvatar) {
        if (StringUtils.isBlank(title)) {
            return null;
        }
        if (StringUtils.isBlank(markdownText)) {
            return null;
        }
        if (CollectionUtils.isEmpty(btns)) {
            return null;
        }
        // 参数 类型 必选 说明
        // msgtype string true 此消息类型为固定actionCard
        // title string true 首屏会话透出的展示内容
        // text string true markdown格式的消息
        // btns array true 按钮的信息:title-按钮方案,actionURL-点击按钮触发的URL
        // btnOrientation string false 0-按钮竖直排列,1-按钮横向排列
        // hideAvatar string false 0-正常发消息者头像,1-隐藏发消息者头像
        OapiRobotSendRequest.Actioncard actionCard = new OapiRobotSendRequest.Actioncard();
        actionCard.setTitle(title);
        actionCard.setText(markdownText);
        // 此处默认为0
        actionCard.setBtnOrientation(btnOrientation ? "1" : "0");
        // 此处默认为0
        actionCard.setHideAvatar(hideAvatar ? "1" : "0");
        actionCard.setBtns(btns);
        OapiRobotSendRequest request = new OapiRobotSendRequest();
        request.setMsgtype(MSG_TYPE_ACTION_CARD);
        request.setActionCard(actionCard);
        return request;

    }

    /**
     * @description: 发送FeedCard类型消息
     * @param links
     * @return: com.dingtalk.api.response.OapiRobotSendResponse
     */
    public static OapiRobotSendRequest sendMessageByFeedCard(List<OapiRobotSendRequest.Links> links) {
        if (CollectionUtils.isEmpty(links)) {
            return null;
        }

        // msgtype string true 此消息类型为固定feedCard
        // title string true 单条信息文本
        // messageURL string true 点击单条信息到跳转链接
        // picURL string true 单条信息后面图片的URL
        OapiRobotSendRequest.Feedcard feedcard = new OapiRobotSendRequest.Feedcard();
        feedcard.setLinks(links);
        OapiRobotSendRequest request = new OapiRobotSendRequest();
        request.setMsgtype(MSG_TYPE_FEED_CARD);
        request.setFeedCard(feedcard);
        return request;

    }

}
 

 

以上需要引用jar包:commons-codec  与 taobao-sdk-java-auto_1479188381469

commons-codec 下载地址:https://mvnrepository.com/artifact/commons-codec/commons-codec

taobao-sdk-java-auto_1479188381469下载地址:https://ding-doc.dingtalk.com/doc#/faquestions/vzbp02

 

参考技术文档 :https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mhi()

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值