釘釘機器人自定義調用


對於釘釘的自定義機器人,可以提供相關的報警預警提示消息推送的功能。

目前對於java語言開發做出一點整理。

首先可以在自己群里建立機器人。

 

設定好自定義的關鍵詞,用來做識別和觸發,當所發的信息內容沒有關鍵詞時是不會出發消息提醒的。

隨后會提供一個用於對接的api和附帶的token。注意保姆,因為有了這個token誰的可以識別你的那個群里的機器人,機器人是唯一的。

所以我就不貼出來。

其次就是使用java做開發了。

我做一個dome實例就不做過的細節。首先需要用到的包如下:

      <!--fastjson-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.67</version>
        </dependency>
        <!-- httpclient -->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.6</version>
        </dependency>

對於api調用我采用簡單點的httpclient這個可以用其他的代替,當然json解析也可以。

重點http調用,以及解析。

我封裝了一個工具類可以直接調用使用,

詳細的功能也有在代碼理解介紹,工程師還是要在代碼里解釋代碼

import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

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.List;
import java.util.Map;

/**
 * @Author huaiyu yin
 * @Date 2021/6/17 2:44 下午
 * @Version 1.0
 */
public class DingDingRobotUtil {
    private static final Logger logger = LoggerFactory.getLogger(DingDingRobotUtil.class);
    /**
     *
     * @param webhook
     * @param secret     安全設置 3選1【方式一,自定義關鍵詞 】 【方式二,加簽 ,創建機器人時選擇加簽 secret以SE開頭】【方式三,IP地址(段)】
     * @param content    發送內容 注意帶上關鍵詞
     * @param isAtAll    通知所有人
     * @return
     */
    public static void sendMsg(String webhook, String secret, String content, boolean isAtAll) {
        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();
            }
            //組裝請求內容
            String reqStr = buildReqStr(content, isAtAll, null);
            //推送消息(http請求)
            HttpClientUtil.postJsonData(webhook,reqStr);
        } catch (Exception e) {
            logger.info("發送群通知異常 異常原因:{}", e.getStackTrace());
        }
    }

    public static void 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();
            }
            //是否通知所有人
            boolean isAtAll = false;
            //組裝請求內容
            String reqStr = buildReqStr(content, isAtAll, mobileList);
            //推送消息(http請求)
            HttpClientUtil.postJsonData(webhook,reqStr);
        } catch (Exception e) {
            logger.info("發送群通知異常 異常原因:{}", e.getStackTrace());
        }
    }

    /**
     * 組裝請求報文
     * 發送消息類型 text
     *
     * @param content
     * @return
     */
    private static String buildReqStr(String content, boolean isAtAll, List<String> mobileList) {
        //消息內容
        Map<String, String> contentMap = Maps.newHashMap();
        contentMap.put("content", content);
        //通知人
        Map<String, Object> atMap = Maps.newHashMap();
        //1.是否通知所有人
        atMap.put("isAtAll", isAtAll);
        //2.通知具體人的手機號碼列表
        atMap.put("atMobiles", mobileList);
        Map<String, Object> reqMap = Maps.newHashMap();
        reqMap.put("msgtype", "text");
        reqMap.put("text", contentMap);
        reqMap.put("at", atMap);
        return JSONObject.toJSONString(reqMap);
    }

    /**
     *
     * 自定義機器人獲取簽名
     * 創建機器人時選擇加簽獲取secret以xxxx開頭
     *
     * @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");
        return sign;
    }

    public static void main(String[] args) {
        String webhook =  "自己的webhook";
        String secret = "SECxxxxx";
        String content = "老道提示: 優秀的一天!";
        List<String> mobileList = Lists.newArrayList();
        mobileList.add("18******");
//        DingDingRobotUtil.sendMsg(webhook,secret,content, mobileList);
        DingDingRobotUtil.sendMsg(webhook,secret,content, true);
    }
}

由於at部分目前我知道也就只有通過手機決定艾特的人,姓名好像不太行。

代碼可以直接拉下去嘗試。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM