釘釘機(jī)器人開發(fā)

釘釘機(jī)器人開發(fā)文檔API

一,先創(chuàng)建一個(gè)釘釘群
圖片.png
圖片.png
二,添加自定義機(jī)器人
圖片.png
三,安全設(shè)置(3選1)
圖片.png
四榴捡, 復(fù)制webhook作為發(fā)送通知的url
圖片.png

剩下的就是在代碼里實(shí)現(xiàn)了

因?yàn)橐l(fā)送網(wǎng)絡(luò)請求 我這邊使用的是hutool工具
添加maven

<!--糊涂工具-->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>4.0.12</version>
</dependency>

這里我封裝了一個(gè)DingDingUtil工具類作為釘釘發(fā)送通知的工具類


import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSON;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
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.List;
import java.util.Map;

/**
 * @ClassName DingDingUtil
 * @Description: 釘釘機(jī)器人消息通知
 * @Author Shuai.Zhang
 * @Date 2020/8/5
 * @Version
 **/
@Slf4j
public class DingDingUtil {
    //發(fā)送超時(shí)時(shí)間10s
    private static final int TIME_OUT = 10000;

    /**
     * 釘釘機(jī)器人文檔地址https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq
     *
     * @param webhook
     * @param secret     安全設(shè)置 3選1【方式一,自定義關(guān)鍵詞 】 【方式二朱浴,加簽 吊圾,創(chuàng)建機(jī)器人時(shí)選擇加簽 secret以SE開頭】【方式三,IP地址(段)】
     * @param content    發(fā)送內(nèi)容
     * @param mobileList 通知具體人的手機(jī)號碼列表 (可選)
     * @return
     */
    public static String sendMsg(String webhook, String secret, String content, List<String> mobileList) {
        try {
            //釘釘機(jī)器人地址(配置機(jī)器人的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;
            //組裝請求內(nèi)容
            String reqStr = buildReqStr(content, isAtAll, mobileList);
            //推送消息(http請求)
            String result = postJson(webhook, reqStr);
            log.info("推送結(jié)果result == " + result);
            return result;
        } catch (Exception e) {
            log.info("發(fā)送群通知異常 異常原因:{}", e.getStackTrace());
            return null;
        }
    }

    /**
     * 組裝請求報(bào)文
     * 發(fā)送消息類型 text
     *
     * @param content
     * @return
     */
    private static String buildReqStr(String content, boolean isAtAll, List<String> mobileList) {
        //消息內(nèi)容
        Map<String, String> contentMap = Maps.newHashMap();
        contentMap.put("content", content);
        //通知人
        Map<String, Object> atMap = Maps.newHashMap();
        //1.是否通知所有人
        atMap.put("isAtAll", isAtAll);
        //2.通知具體人的手機(jī)號碼列表
        atMap.put("atMobiles", mobileList);
        Map<String, Object> reqMap = Maps.newHashMap();
        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;
    }

    /**
     * 自定義機(jī)器人獲取簽名
     * 創(chuàng)建機(jī)器人時(shí)選擇加簽獲取secret以SE開頭
     *
     * @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");
        System.out.println("singn:" + sign);
        return sign;
    }


    public static void main(String[] args) {
        String webhook = "https://oapi.dingtalk.com/robot/send?access_token=xxxxx";
        String secret = "SECxxxxx";
        List<String> mobileList = Lists.newArrayList();
        mobileList.add("18888888888");
        DingDingUtil.sendMsg(webhook, null, "小哥翰蠢,你好", null);
    }
}

我們可以先使用main方法測試一下

圖片.png

Tips: 1請嚴(yán)格根據(jù)文檔來設(shè)計(jì)自己的需求 這個(gè)工具類僅僅作為參考项乒,如果需要更多文檔類型 比如markdown 需要稍微按照官方文檔修改一下即可
2.創(chuàng)建機(jī)器人流程的安全設(shè)置根據(jù)自己的實(shí)際情況選擇一種設(shè)置
3.官方文檔很簡單 多看官方文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市梁沧,隨后出現(xiàn)的幾起案子檀何,更是在濱河造成了極大的恐慌,老刑警劉巖趁尼,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件埃碱,死亡現(xiàn)場離奇詭異,居然都是意外死亡酥泞,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進(jìn)店門啃憎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來芝囤,“玉大人,你說我怎么就攤上這事辛萍∶蹑ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵贩毕,是天一觀的道長悯许。 經(jīng)常有香客問我,道長辉阶,這世上最難降的妖魔是什么先壕? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任瘩扼,我火速辦了婚禮,結(jié)果婚禮上垃僚,老公的妹妹穿的比我還像新娘集绰。我一直安慰自己,他們只是感情好谆棺,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布栽燕。 她就那樣靜靜地躺著,像睡著了一般改淑。 火紅的嫁衣襯著肌膚如雪碍岔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天朵夏,我揣著相機(jī)與錄音蔼啦,去河邊找鬼。 笑死侍郭,一個(gè)胖子當(dāng)著我的面吹牛询吴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播亮元,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼猛计,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了爆捞?” 一聲冷哼從身側(cè)響起奉瘤,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎煮甥,沒想到半個(gè)月后盗温,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡成肘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年卖局,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片双霍。...
    茶點(diǎn)故事閱讀 40,865評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡砚偶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出洒闸,到底是詐尸還是另有隱情染坯,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布丘逸,位于F島的核電站单鹿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏深纲。R本人自食惡果不足惜仲锄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一劲妙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧昼窗,春花似錦是趴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至掸驱,卻和暖如春肛搬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背毕贼。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工温赔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鬼癣。 一個(gè)月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓陶贼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親待秃。 傳聞我的和親對象是個(gè)殘疾皇子拜秧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評論 2 361