钉钉自定义机器人-后台开发

#钉钉自定义机器人-后台开发,我们通过配置就好了,方便操作!下面实例是22点22分发送不同的消息。

官方文档https://open-doc.dingtalk.com/docs/doc.htm?treeId=257&articleId=106438&docType=1

这里写图片描述

这里写图片描述

这里写图片描述


后台界面

这里写图片描述

开发步骤

1) 先拿到机器人的webhock

这里写图片描述

2) 对消息封装,然后post请求发送
package io.renren.modules.job.task;

import io.renren.common.exception.BizException;
import io.renren.common.exception.RRException;
import io.renren.modules.robot.message.*;
import io.renren.modules.robot.service.DingtalkChatbotClient;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;


/**
 * @author lanxinghua
 * @date 2018/08/04 14:15
 * @description 钉钉机器人测试
 */
@Component("dDRobotTask")
public class DDRobotTask {
    private Logger logger = LoggerFactory.getLogger(getClass());
    @Resource
    private DingtalkChatbotClient dingtalkChatbotClient;

    public void sendTextMessage(String param){
        try {
            JSONObject json = JSONObject.fromObject(param);
            String webhock = json.getString("webhock");
            Message message = new TextMessage(json.getString("message"));
            JSONArray array = JSONArray.fromObject(json.getString("toUser"));
            if (array.size()==0){
                ((TextMessage) message).setIsAtAll(true);
            }else {
               ((TextMessage) message).setAtMobiles(JSONArray.toList(array,new String(),new JsonConfig()));
            }
            dingtalkChatbotClient.send(webhock,message);
            logger.info("发送成功!sendTextMessage");
        } catch (Exception e) {
            throw new BizException("数据填写有误!",0);
        }
    }

    public void sendLinkMessage(String param){
        try {
            LinkMessage message = new LinkMessage();
            JSONObject json = JSONObject.fromObject(param);
            message.setTitle(json.getString("title"));
            message.setText(json.getString("text"));
            if (param.contains("picUrl")){
                message.setPicUrl(json.getString("picUrl"));
            }
            message.setMessageUrl(json.getString("messageUrl"));
            String webhock = json.getString("webhock");
            dingtalkChatbotClient.send(webhock,message);
            logger.info("发送成功!sendLinkMessage");
        } catch (Exception e) {
            throw new BizException("数据填写有误!",1);
        }
    }

    public void sendMarkdownMessage(String param){
        try {
            MarkdownMessage message = new MarkdownMessage();
            JSONObject json = JSONObject.fromObject(param);
            message.setTitle(json.getString("title"));
            message.add(json.getString("text"));
            String webhock = json.getString("webhock");
            dingtalkChatbotClient.send(webhock,message);
            logger.info("发送成功!sendMarkdownMessage");
        } catch (Exception e) {
            throw new BizException("数据填写有误!",1);
        }
    }

    public void sendActionCardMessage(String param){
        try {
            SingleTargetActionCardMessage message = new SingleTargetActionCardMessage();
            JSONObject json = JSONObject.fromObject(param);
            String webhock = json.getString("webhock");
            message.setTitle(json.getString("title"));
            message.setHideAvatar(json.getString("hideAvatar").equals("0")?false:true);
            message.setBriefText(json.getString("text"));
            message.setSingleTitle(json.getString("singleTitle"));
            message.setSingleURL(json.getString("singleURL"));
            dingtalkChatbotClient.send(webhock,message);
            logger.info("发送成功!sendActionCardMessage");
        } catch (Exception e) {
            throw new BizException("数据填写有误!",1);
        }
    }

    public void sendFeedCardMessage(String param){
        try {
            FeedCardMessage message = new FeedCardMessage();
            List<FeedCardMessageItem> items = new ArrayList<FeedCardMessageItem>();
            JSONObject json = JSONObject.fromObject(param);
            String webhock = json.getString("webhock");
            JSONArray array = JSONArray.fromObject(json.getString("links"));
            for (int i = 0; i <array.size() ; i++) {
                FeedCardMessageItem item1 = new FeedCardMessageItem();
                JSONObject jsonObject = array.getJSONObject(i);
                item1.setTitle(jsonObject.getString("title"));
                item1.setPicURL(jsonObject.getString("picURL"));
                item1.setMessageURL(jsonObject.getString("messageURL"));
                items.add(item1);
            }
            message.setFeedItems(items);
            dingtalkChatbotClient.send(webhock,message);
            logger.info("发送成功!sendFeedCardMessage");
        } catch (Exception e) {
            throw new BizException("数据填写有误!",1);
        }
    }
}

这段代码放在定时调度任务里面,在后台用cron表达式配置就好。

######SendResult

package io.renren.modules.robot.entity;

import com.alibaba.fastjson.JSON;

import java.util.HashMap;
import java.util.Map;

/**
 * @author lanxinghua
 * @date 2018/08/04 14:40
 * @description
 */
public class SendResult {
    private boolean isSuccess;
    private Integer errorCode;
    private String errorMsg;

    public SendResult(){
        this.isSuccess=false;
        this.errorCode=0;
    }

    public boolean isSuccess() {
        return isSuccess;
    }

    public void setSuccess(boolean success) {
        isSuccess = success;
    }

    public Integer getErrorCode() {
        return errorCode;
    }

    public void setErrorCode(Integer errorCode) {
        this.errorCode = errorCode;
    }

    public String getErrorMsg() {
        return errorMsg;
    }

    public void setErrorMsg(String errorMsg) {
        this.errorMsg = errorMsg;
    }

    @Override
    public String toString() {
        Map<String,Object> items = new HashMap<>();
        items.put("errorCode",errorCode);
        items.put("errorMsg",errorMsg);
        items.put("isSuccess",isSuccess);
        return JSON.toJSONString(items);
    }
}
消息类型
package io.renren.modules.robot.message;

/**
 * Created by dustin on 2017/3/17.
 */
public interface Message {

    /**
     * 返回消息的Json格式字符串
     *
     * @return 消息的Json格式字符串
     */
    String toJsonString();
}

package io.renren.modules.robot.message;

import com.alibaba.fastjson.JSON;
import org.apache.commons.lang.StringUtils;

import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * Created by dustin on 2017/3/17.
 */
public class TextMessage implements Message {

    private String text;
    private List<String> atMobiles;
    private boolean isAtAll;

    public TextMessage(String text) {
        this.text = text;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public List<String> getAtMobiles() {
        return atMobiles;
    }

    public void setAtMobiles(List<String> atMobiles) {
        this.atMobiles = atMobiles;
    }

    public boolean isAtAll() {
        return isAtAll;
    }

    public void setIsAtAll(boolean isAtAll) {
        this.isAtAll = isAtAll;
    }

    public String toJsonString() {
        Map<String, Object> items = new HashMap<String, Object>();
        items.put("msgtype", "text");

        Map<String, String> textContent = new HashMap<String, String>();
        if (StringUtils.isBlank(text)) {
            throw new IllegalArgumentException("text should not be blank");
        }
        textContent.put("content", text);
        items.put("text", textContent);

        Map<String, Object> atItems = new HashMap<String, Object>();
        if (atMobiles != null && !atMobiles.isEmpty()) {
            atItems.put("atMobiles", atMobiles);
        }
        if (isAtAll) {
            atItems.put("isAtAll", isAtAll);
        }
        items.put("at", atItems);

        return JSON.toJSONString(items);
    }
}

package io.renren.modules.robot.message;

import com.alibaba.fastjson.JSON;
import org.apache.commons.lang.StringUtils;

import java.util.HashMap;
import java.util.Map;

/**
 * Created by dustin on 2017/3/18.
 */
public class LinkMessage implements Message {

    private String title;
    private String text;
    private String picUrl;
    private String messageUrl;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public String getPicUrl() {
        return picUrl;
    }

    public void setPicUrl(String picUrl) {
        this.picUrl = picUrl;
    }

    public String getMessageUrl() {
        return messageUrl;
    }

    public void setMessageUrl(String messageUrl) {
        this.messageUrl = messageUrl;
    }


    public String toJsonString() {
        Map<String, Object> items = new HashMap<String, Object>();
        items.put("msgtype", "link");

        Map<String, String> linkContent = new HashMap<String, String>();
        if (StringUtils.isBlank(title)) {
            throw new IllegalArgumentException("title should not be blank");
        }
        linkContent.put("title", title);

        if (StringUtils.isBlank(messageUrl)){
            throw new IllegalArgumentException("messageUrl should not be blank");
        }
        linkContent.put("messageUrl", messageUrl);

        if (StringUtils.isBlank(text)){
            throw new IllegalArgumentException("text should not be blank");
        }
        linkContent.put("text", text);

        if (StringUtils.isNotBlank(picUrl)) {
            linkContent.put("picUrl", picUrl);
        }

        items.put("link", linkContent);

        return JSON.toJSONString(items);
    }
}
markdownMessage (补上)
package com.twodfire.boss.tool.util.message;
import com.alibaba.fastjson.JSON;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author lanxinghua
 * @date 2018/08/06 15:55
 * @description MarkdownMessage类型消息
 */
public class MarkdownMessage implements IMessage {
    private String title;
    private List<String> items = new ArrayList<String>();
    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
    public void add(String text) {
        items.add(text);
    }

    public static String getBoldText(String text) {
        return "**" + text + "**";
    }
    public static String getItalicText(String text) {
        return "*" + text + "*";
    }
    public static String getLinkText(String text, String href) {
        return "[" + text + "](" + href + ")";
    }
    public static String getImageText(String imageUrl) {
        return "![image](" + imageUrl + ")";
    }

    public static String getHeaderText(int headerType, String text) {
        if (headerType < 1 || headerType > 6) {
            throw new IllegalArgumentException("headerType should be in [1, 6]");
        }
        StringBuffer numbers = new StringBuffer();
        for (int i = 0; i < headerType; i++) {
            numbers.append("#");
        }
        return numbers + " " + text;
    }
    public static String getReferenceText(String text) {
        return "> " + text;
    }

    public static String getOrderListText(List<String> orderItem) {
        if (orderItem.isEmpty()) {
            return "";
        }

        StringBuffer sb = new StringBuffer();
        for (int i = 1; i <= orderItem.size() - 1; i++) {
            sb.append(String.valueOf(i) + ". " + orderItem.get(i - 1) + "\n");
        }
        sb.append(String.valueOf(orderItem.size()) + ". " + orderItem.get(orderItem.size() - 1));
        return sb.toString();
    }
    public static String getUnorderListText(List<String> unorderItem) {
        if (unorderItem.isEmpty()) {
            return "";
        }
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < unorderItem.size() - 1; i++) {
            sb.append("- " + unorderItem.get(i) + "\n");
        }
        sb.append("- " + unorderItem.get(unorderItem.size() - 1));
        return sb.toString();
    }

    public String toJsonString() {
        Map<String, Object> result = new HashMap<String, Object>();
        result.put("msgtype", "markdown");

        Map<String, Object> markdown = new HashMap<String, Object>();
        markdown.put("title", title);

        StringBuffer markdownText = new StringBuffer();
        for (String item : items) {
            markdownText.append(item + "\n");
        }
        markdown.put("text", markdownText.toString());
        result.put("markdown", markdown);
        return JSON.toJSONString(result);
    }
}

等等等等…


DingtalkChatbotClient
package io.renren.modules.robot.service;

import io.renren.modules.robot.entity.SendResult;
import io.renren.modules.robot.message.Message;

/**
 * @author lanxinghua
 * @date 2018/08/04 14:48
 * @description 钉钉机器人发送消息
 */
public interface DingtalkChatbotClient {
    /**
     * @param webhook 机器人url
     * @param message 发送的消息
     * @return
     */
    public SendResult send(String webhook, Message message);
}
DingtalkChatbotClientImpl
package io.renren.modules.robot.service.impl;

import com.alibaba.fastjson.JSONObject;
import io.renren.modules.robot.entity.SendResult;
import io.renren.modules.robot.message.Message;
import io.renren.modules.robot.service.DingtalkChatbotClient;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.springframework.stereotype.Service;

/**
 * @author lanxinghua
 * @date 2018/08/04 14:49
 * @description
 */
@Service
public class DingtalkChatbotClientImpl implements DingtalkChatbotClient {
    //获取httpclient
    private HttpClient getHttpclient() {
        return HttpClients.createDefault();
    }

    @Override
    public SendResult send(String webhook, Message message) {
        SendResult sendResult = new SendResult();
        try {
            HttpClient httpclient = getHttpclient();
            HttpPost httppost = new HttpPost(webhook);
            httppost.addHeader("Content-Type", "application/json; charset=utf-8");
            StringEntity se = new StringEntity(message.toJsonString(), "utf-8");
            httppost.setEntity(se);
            HttpResponse response = httpclient.execute(httppost);
            if (response.getStatusLine().getStatusCode()==HttpStatus.SC_OK){
                String result = EntityUtils.toString(response.getEntity());
                JSONObject obj = JSONObject.parseObject(result);
                Integer errcode = obj.getInteger("errcode");
                sendResult.setErrorCode(errcode);
                sendResult.setSuccess(errcode.equals(0));
                sendResult.setErrorMsg(obj.getString("errmsg"));
            }
            return sendResult;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return sendResult;
    }
}

这里写图片描述


总结

如果你公司的机器有多台,可以考虑一下分布式定时任务,Elastic-job.我后边的博客也有写到。

通用cron表达式

{秒数} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)}
秒 0-59 , - * /
分 0-59 , - * /
小时 0-23 , - * /
日期 1-31 , - * ? / L W C
月份 1-12 或者 JAN-DEC , - * /
星期 1-7 或者 SUN-SAT , - * ? / L C #
年(可选) 留空, 1970-2099 , - * /
*/5 * * * * ? 每隔5秒执行一次
0 */1 * * * ? 每隔1分钟执行一次
0 0 5-15 * * ? 每天5-15点整点触发
0 0/3 * * * ? 每三分钟触发一次
0 0-5 14 * * ? 在每天下午2点到下午2:05期间的每1分钟触发
0 0/5 14 * * ? 在每天下午2点到下午2:55期间的每5分钟触发
0 0/5 14,18 * * ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时
0 0 10,14,16 * * ? 每天上午10点,下午2点,4点

0 0 12 ? * WED 表示每个星期三中午12点
0 0 17 ? * TUES,THUR,SAT 每周二、四、六下午五点
0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发
0 15 10 ? * MON-FRI 周一至周五的上午10:15触发
0 0 23 L * ? 每月最后一天23点执行一次
0 15 10 L * ? 每月最后一日的上午10:15触发
0 15 10 ? * 6L 每月的最后一个星期五上午10:15触发
0 15 10 * * ? 2005 2005年的每天上午10:15触发
0 15 10 ? * 6L 2002-2005 2002年至2005年的每月的最后一个星期五上午10:15触发
0 15 10 ? * 6#3 每月的第三个星期五上午10:15触发


"30 * * * * ?" 每半分钟触发任务
"30 10 * * * ?" 每小时的10分30秒触发任务
"30 10 1 * * ?" 每天1点10分30秒触发任务
"30 10 1 20 * ?" 每月20号1点10分30秒触发任务
"30 10 1 20 10 ? *" 每年10月20号1点10分30秒触发任务
"30 10 1 20 10 ? 2011" 2011年10月20号1点10分30秒触发任务
"30 10 1 ? 10 * 2011" 2011年10月每天1点10分30秒触发任务
"30 10 1 ? 10 SUN 2011" 2011年10月每周日1点10分30秒触发任务
"15,30,45 * * * * ?" 每15秒,30秒,45秒时触发任务
"15-45 * * * * ?" 15到45秒内,每秒都触发任务
"15/5 * * * * ?" 每分钟的每15秒开始触发,每隔5秒触发一次
"15-30/5 * * * * ?" 每分钟的15秒到30秒之间开始触发,每隔5秒触发一次
"0 0/3 * * * ?" 每小时的第0分0秒开始,每三分钟触发一次
"0 15 10 ? * MON-FRI" 星期一到星期五的10点15分0秒触发任务
"0 15 10 L * ?" 每个月最后一天的10点15分0秒触发任务
"0 15 10 LW * ?" 每个月最后一个工作日的10点15分0秒触发任务
"0 15 10 ? * 5L" 每个月最后一个星期四的10点15分0秒触发任务
"0 15 10 ? * 5#3" 每个月第三周的星期四的10点15分0秒触发任务
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值