@Slf4j
public class DingTalkUtilDemo {
/**
* 釘釘群設(shè)置 webhook, 支持重置
*/
private static final String ACCESS_TOKEN = "XXXXXX";
private static final String secret = "XXXXX";
/**
* 消息類(lèi)型
*/
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";
/**
* 客戶(hù)端實(shí)例
*/
public static DingTalkClient client = new DefaultDingTalkClient(ACCESS_TOKEN);
/**
* 初始化簽名
* @throws Exception 所有異常
*/
private static void init() throws Exception{
Long timestamp = System.currentTimeMillis();
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(cn.hutool.core.codec.Base64.encode(signData)),"UTF-8");
client = new DefaultDingTalkClient(ACCESS_TOKEN+"&sign=" + sign + "×tamp=" + timestamp);
}
/**
* @description: 官方演示示例
* title 是消息列表下透出的標(biāo)題
* text 是進(jìn)入群后看到的消息內(nèi)容
*/
public static void sdkDemoJava() throws Exception{
init();
DingTalkClient client = DingTalkUtilDemo.client;
OapiRobotSendRequest request = new OapiRobotSendRequest();
request.setMsgtype("text");
OapiRobotSendRequest.Text text = new OapiRobotSendRequest.Text();
text.setContent("測(cè)試文本消息");
request.setText(text);
OapiRobotSendRequest.At at = new OapiRobotSendRequest.At();
at.setAtMobiles(Arrays.asList("13261303345"));
request.setAt(at);
request.setMsgtype("link");
OapiRobotSendRequest.Link link = new OapiRobotSendRequest.Link();
link.setMessageUrl("https://www.dingtalk.com/");
link.setPicUrl("");
link.setTitle("時(shí)代的火車(chē)向前開(kāi)");
link.setText("這個(gè)即將發(fā)布的新版本,創(chuàng)始人陳航(花名“無(wú)招”)稱(chēng)它為“紅樹(shù)林”。\n" +
"而在此之前,每當(dāng)面臨重大升級(jí),產(chǎn)品經(jīng)理們都會(huì)取一個(gè)應(yīng)景的代號(hào),這一次,為什么是“紅樹(shù)林");
request.setLink(link);
request.setMsgtype("markdown");
OapiRobotSendRequest.Markdown markdown = new OapiRobotSendRequest.Markdown();
markdown.setTitle("杭州天氣");
markdown.setText("#### 杭州天氣 @156xxxx8827\n" +
"> 9度,西北風(fēng)1級(jí),空氣良89,相對(duì)溫度73%\n\n" +
"> \n" +
"> ###### 10點(diǎn)20分發(fā)布 [天氣](http://www.thinkpage.cn/) \n");
request.setMarkdown(markdown);
try {
client.execute(request);
} catch (ApiException e) {
log.error("[ApiException]: 消息發(fā)送演示示例, 異常捕獲{}", e.getMessage());
}
}
/**
* @description: 發(fā)送普通文本消息
* @param content 文本消息
* @param mobileList 指定@ 聯(lián)系人
* @param isAtAll 是否@ 全部聯(lián)系人
* @return: com.dingtalk.api.response.OapiRobotSendResponse
*
*
*/
public static OapiRobotSendResponse sendMessageByText(String content, List<String> mobileList, boolean isAtAll) {
OapiRobotSendResponse response = new OapiRobotSendResponse();
try {
init();
//參數(shù) 參數(shù)類(lèi)型 必須 說(shuō)明
//msgtype String 是 消息類(lèi)型,此時(shí)固定為:text
//content String 是 消息內(nèi)容
//atMobiles Array 否 被@人的手機(jī)號(hào)(在content里添加@人的手機(jī)號(hào))
//isAtAll bool 否 @所有人時(shí):true,否則為:false
OapiRobotSendRequest.Text text = new OapiRobotSendRequest.Text();
text.setContent(content);
OapiRobotSendRequest request = new OapiRobotSendRequest();
if (!CollectionUtils.isEmpty(mobileList)) {
// 發(fā)送消息并@ 以下手機(jī)號(hào)聯(lián)系人
OapiRobotSendRequest.At at = new OapiRobotSendRequest.At();
at.setAtMobiles(mobileList);
at.setIsAtAll(isAtAll);
request.setAt(at);
}
request.setMsgtype(DingTalkUtilDemo.MSG_TYPE_TEXT);
request.setText(text);
response = DingTalkUtilDemo.client.execute(request);
} catch (Exception e) {
log.error("[發(fā)送普通文本消息]: 發(fā)送消息失敗, 異常捕獲{}", e.getMessage());
}
return response;
}
/**
* @description: 發(fā)送link 類(lèi)型消息
* @param title 消息標(biāo)題
* @param text 消息內(nèi)容
* @param messageUrl 點(diǎn)擊消息后跳轉(zhuǎn)的url
* @param picUrl 插入圖片的url
* @return: com.dingtalk.api.response.OapiRobotSendResponse
*
*
*/
public static OapiRobotSendResponse sendMessageByLink(String title, String text, String messageUrl, String picUrl) throws Exception{
init();
/*if (!DataValidUtil.checkNotEmpty(title, text, messageUrl)) {
return null;
}*/
//參數(shù) 參數(shù)類(lèi)型 必須 說(shuō)明
//msgtype String 是 消息類(lèi)型,此時(shí)固定為:link
//title String 是 消息標(biāo)題
//text String 是 消息內(nèi)容。如果太長(zhǎng)只會(huì)部分展示
//messageUrl String 是 點(diǎn)擊消息跳轉(zhuǎn)的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(DingTalkUtilDemo.MSG_TYPE_LINK);
request.setLink(link);
OapiRobotSendResponse response = new OapiRobotSendResponse();
try {
response = DingTalkUtilDemo.client.execute(request);
} catch (ApiException e) {
log.error("[發(fā)送link 類(lèi)型消息]: 發(fā)送消息失敗, 異常捕獲{}", e.getMessage());
}
return response;
}
/**
* @description: 發(fā)送Markdown 編輯格式的消息
* @param title 標(biāo)題
* @param markdownText 支持markdown 編輯格式的文本信息
* @param mobileList 消息@ 聯(lián)系人
* @param isAtAll 是否@ 全部
* @return: com.dingtalk.api.response.OapiRobotSendResponse
*
*
*/
public static OapiRobotSendResponse sendMessageByMarkdown(String title, String markdownText, List<String> mobileList, boolean isAtAll) throws Exception{
init();
/*if (!DataValidUtil.checkNotEmpty(title, markdownText)) {
return null;
}*/
//參數(shù) 類(lèi)型 必選 說(shuō)明
//msgtype String 是 此消息類(lèi)型為固定markdown
//title String 是 首屏?xí)捦赋龅恼故緝?nèi)容
//text String 是 markdown格式的消息
//atMobiles Array 否 被@人的手機(jī)號(hào)(在text內(nèi)容里要有@手機(jī)號(hào))
//isAtAll bool 否 @所有人時(shí):true,否則為:false
OapiRobotSendRequest.Markdown markdown = new OapiRobotSendRequest.Markdown();
markdown.setTitle(title);
markdown.setText(markdownText);
OapiRobotSendRequest request = new OapiRobotSendRequest();
request.setMsgtype(DingTalkUtilDemo.MSG_TYPE_MARKDOWN);
request.setMarkdown(markdown);
if (!CollectionUtils.isEmpty(mobileList)) {
OapiRobotSendRequest.At at = new OapiRobotSendRequest.At();
at.setIsAtAll(isAtAll);
at.setAtMobiles(mobileList);
request.setAt(at);
}
OapiRobotSendResponse response = new OapiRobotSendResponse();
try {
response = DingTalkUtilDemo.client.execute(request);
} catch (ApiException e) {
log.error("[發(fā)送link 類(lèi)型消息]: 發(fā)送消息失敗, 異常捕獲{}", e.getMessage());
}
return response;
}
/**
* @description: 整體跳轉(zhuǎn)ActionCard類(lèi)型的消息發(fā)送
* @param title 消息標(biāo)題, 會(huì)話消息會(huì)展示標(biāo)題
* @param markdownText markdown格式的消息
* @param singleTitle 單個(gè)按鈕的標(biāo)題
* @param singleURL 單個(gè)按鈕的跳轉(zhuǎn)鏈接
* @param btnOrientation 是否橫向排列(true 橫向排列, false 縱向排列)
* @param hideAvatar 是否隱藏發(fā)消息者頭像(true 隱藏頭像, false 不隱藏)
* @return: com.dingtalk.api.response.OapiRobotSendResponse
*
*
*/
public static OapiRobotSendResponse sendMessageByActionCardSingle(String title, String markdownText, String singleTitle, String singleURL, boolean btnOrientation, boolean hideAvatar) throws Exception{
init();
/*if (!DataValidUtil.checkNotEmpty(title, markdownText)) {
return null;
}*/
//參數(shù) 類(lèi)型 必選 說(shuō)明
// msgtype string true 此消息類(lèi)型為固定actionCard
// title string true 首屏?xí)捦赋龅恼故緝?nèi)容
// text string true markdown格式的消息
// singleTitle string true 單個(gè)按鈕的方案。(設(shè)置此項(xiàng)和singleURL后btns無(wú)效)
// singleURL string true 點(diǎn)擊singleTitle按鈕觸發(fā)的URL
// btnOrientation string false 0-按鈕豎直排列,1-按鈕橫向排列
// hideAvatar string false 0-正常發(fā)消息者頭像,1-隱藏發(fā)消息者頭像
OapiRobotSendRequest.Actioncard actionCard = new OapiRobotSendRequest.Actioncard();
actionCard.setTitle(title);
actionCard.setText(markdownText);
actionCard.setSingleTitle(singleTitle);
actionCard.setSingleURL(singleURL);
// 此處默認(rèn)為0
actionCard.setBtnOrientation(btnOrientation ? "1" : "0");
// 此處默認(rèn)為0
actionCard.setHideAvatar(hideAvatar ? "1" : "0");
OapiRobotSendRequest request = new OapiRobotSendRequest();
request.setMsgtype(DingTalkUtilDemo.MSG_TYPE_ACTION_CARD);
request.setActionCard(actionCard);
OapiRobotSendResponse response = new OapiRobotSendResponse();
try {
response = DingTalkUtilDemo.client.execute(request);
} catch (ApiException e) {
log.error("[發(fā)送ActionCard 類(lèi)型消息]: 整體跳轉(zhuǎn)ActionCard類(lèi)型的發(fā)送消息失敗, 異常捕獲{}", e.getMessage());
}
return response;
}
/**
* @description: 獨(dú)立跳轉(zhuǎn)ActionCard類(lèi)型 消息發(fā)送
* @param title 標(biāo)題
* @param markdownText 文本
* @param btns 按鈕列表
* @param btnOrientation 是否橫向排列(true 橫向排列, false 縱向排列)
* @param hideAvatar 是否隱藏發(fā)消息者頭像(true 隱藏頭像, false 不隱藏)
* @return: com.dingtalk.api.response.OapiRobotSendResponse
*
*
*/
public static OapiRobotSendResponse sendMessageByActionCardMulti(String title, String markdownText, List<OapiRobotSendRequest.Btns> btns, boolean btnOrientation, boolean hideAvatar) throws Exception{
init();
/*if (!DataValidUtil.checkNotEmpty(title, markdownText) || CollectionUtils.isEmpty(btns)) {
return null;
}*/
//參數(shù) 類(lèi)型 必選 說(shuō)明
//msgtype string true 此消息類(lèi)型為固定actionCard
//title string true 首屏?xí)捦赋龅恼故緝?nèi)容
//text string true markdown格式的消息
//btns array true 按鈕的信息:title-按鈕方案,actionURL-點(diǎn)擊按鈕觸發(fā)的URL
//btnOrientation string false 0-按鈕豎直排列,1-按鈕橫向排列
//hideAvatar string false 0-正常發(fā)消息者頭像,1-隱藏發(fā)消息者頭像
OapiRobotSendRequest.Actioncard actionCard = new OapiRobotSendRequest.Actioncard();
actionCard.setTitle(title);
actionCard.setText(markdownText);
// 此處默認(rèn)為0
actionCard.setBtnOrientation(btnOrientation ? "1" : "0");
// 此處默認(rèn)為0
actionCard.setHideAvatar(hideAvatar ? "1" : "0");
actionCard.setBtns(btns);
OapiRobotSendRequest request = new OapiRobotSendRequest();
request.setMsgtype(DingTalkUtilDemo.MSG_TYPE_ACTION_CARD);
request.setActionCard(actionCard);
OapiRobotSendResponse response = new OapiRobotSendResponse();
try {
response = DingTalkUtilDemo.client.execute(request);
} catch (ApiException e) {
log.error("[發(fā)送ActionCard 類(lèi)型消息]: 獨(dú)立跳轉(zhuǎn)ActionCard類(lèi)型發(fā)送消息失敗, 異常捕獲{}", e.getMessage());
}
return response;
}
/**
* @description: 發(fā)送FeedCard類(lèi)型消息
* @param links
* @return: com.dingtalk.api.response.OapiRobotSendResponse
*
*
*/
public static OapiRobotSendResponse sendMessageByFeedCard(List<OapiRobotSendRequest.Links> links) throws Exception{
init();
if (CollectionUtils.isEmpty(links)) {
return null;
}
//msgtype string true 此消息類(lèi)型為固定feedCard
//title string true 單條信息文本
//messageURL string true 點(diǎn)擊單條信息到跳轉(zhuǎn)鏈接
//picURL string true 單條信息后面圖片的URL
OapiRobotSendRequest.Feedcard feedcard = new OapiRobotSendRequest.Feedcard();
feedcard.setLinks(links);
OapiRobotSendRequest request = new OapiRobotSendRequest();
request.setMsgtype(DingTalkUtilDemo.MSG_TYPE_FEED_CARD);
request.setFeedCard(feedcard);
OapiRobotSendResponse response = new OapiRobotSendResponse();
try {
response = DingTalkUtilDemo.client.execute(request);
} catch (ApiException e) {
log.error("[發(fā)送ActionCard 類(lèi)型消息]: 獨(dú)立跳轉(zhuǎn)ActionCard類(lèi)型發(fā)送消息失敗, 異常捕獲{}", e.getMessage());
}
return response;
}
public static void main(String args[]) {
//sdkDemoJava();
}
}
釘釘機(jī)器人DEMO
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 引子 今年的4月,對(duì)于美劇以及漫威迷來(lái)說(shuō)簡(jiǎn)直不要太爽?!稒?quán)游》最后一季迎來(lái)史詩(shī)之戰(zhàn),漫威的《復(fù)聯(lián)》也是EndGam...
- 簡(jiǎn)介 實(shí)現(xiàn)圖靈機(jī)器人,使用阿里云語(yǔ)音轉(zhuǎn)換及圖靈機(jī)器人接口。(無(wú)web頁(yè)面,請(qǐng)自行增加) 項(xiàng)目地址 GitHub :...
- 你有沒(méi)有想過(guò)如果你的App里邊有一個(gè)聊天機(jī)器人可以陪用戶(hù)聊天解決用戶(hù)的一般問(wèn)題,以及讓你更好的了解你的用戶(hù),這是一...
- 當(dāng)需要將系統(tǒng)的一些預(yù)警等信息推送到釘釘群時(shí),我們可以通過(guò)開(kāi)啟自定義機(jī)器人來(lái)通過(guò)API接口推送釘釘消息。 釘釘開(kāi)放平...
- 一、釘釘群機(jī)器人助手開(kāi)發(fā)的由來(lái) 自從2019年元旦釘釘社區(qū)薛勵(lì)凡推出了《早安語(yǔ)錄生成器》以來(lái),我對(duì)早安語(yǔ)錄生成器有...