需求:
實作每個作業日的下午六點推送指定內容至釘釘群
①找到你需要推送的群 - 智能群助手
為群新增一個自定義機器人

②對于你的機器人進行設定(名字啊頭像啊

- 安全設定我一般勾【加簽】也可以勾選自定義關鍵冊或者ip限制 最后都是在轉發到釘釘API介面的時候做校驗用的 為了安全 dddd
③ 給你的專案匯入釘釘開放的SDK包
Pom檔案如下:
<dependency>
<groupId>lippi-oapi-encrpt</groupId>
<artifactId>dingtalk</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>alibaba-dingtalk-service-sdk</artifactId>
<version>1.0.1</version>
</dependency>
現在可以正式開始開發了
需求分解:
- 每個作業日
- 每天下午六點
- 資料文本
- 發送釘釘群
一、 每個作業日
由于內部用自己研發的考勤系統,有自己設定的排班考勤介面
如果是按照法定作業日 可以呼叫 http://timor.tech/api/holiday/info/2020-10-08 這個api去獲取某天是否為國家法定假日

他的含義如下:
| 引數名 | 含義 |
|---|---|
| type | 0:作業日 1:周末 2:假日 |
| name | 本日的名稱如果部署法定假日則會顯示周幾 |
| week | 周一為1以此類推 |
| holiday | 假日專有 普通日期為null |
現在就算是能知道今天是否是作業日了
如果是作業日就進行接下來的操作
二、每天下午六點
可以當作這個推送資料是定時生成的
使用SpringBoot基于注解來創建定時任務, 代碼如下:
@Configuration //1.主要用于標記配置類,兼備Component的效果,
@EnableScheduling // 2.開啟定時任務
public class DingTalkSchedule {
/**
* 作業日下午6點推送資料
*/
@Scheduled(cron = "0 0 18 * * ? ")
@Async
public void pushData() {
//今天是否是作業日
if (!isWorkDay(DateUtils.getDate(new Date(), "yyyy-MM-dd"))) {
return;
}
//推送相關 資料來源你的機器人設定(僅設定安全密鑰
String webhook = "";
String sercetKey= "";
messagePush(webhook,sercetKey);
}
}
三、銷售資料文本組織
假設我們今天要推送的資料大致如下:
張元英在參加produce48前剛剛小學畢業
以圖片+文本的形式進行推送
查閱釘釘開發檔案的話我們能知道機器人推送的格式有下面幾個

具體這些訊息發出來的樣式參考釘釘開發者檔案:
釘釘機器人開發
需求所需推送的是圖片+文本的形式
我們這里就采用【actioncard】的訊息型別
- 為什么不用markdown形式?
答:當然可以用markdown形式,但是markdown和actioncard的展現方式不一樣 為了好看我還是選擇用actioncard型別


然后就是做推送了
/**
* @Description: 推送iz*one 冷知識訊息
* @Param: [webhook,sercetKey] 創建機器人的時候生成的機器人webhook和密鑰如果是別的安全設定則參考別的方式
* @return: void
* @Author: Nipppppp
* @Date: 2021/2/26 14:13
*/
public void messagePush(String webhook,String sercetKey){
//文本內容組織
StringBuilder text = new StringBuilder();
//圖片
text.append(");
//換行
text.append("\n");
//文本
text.append("#### 張元英在參加produce48前剛剛小學畢業");
//釘釘actionCard推送物件
OapiRobotSendRequest.Actioncard actionCard = new OapiRobotSendRequest.Actioncard();
//推送透出首頁標題 (你收到這條推送的時候會顯示的初內容
actionCard.setTitle("IZ*ONE 冷知識");
//放入你組織好的內容
actionCard.setText(text.toString());
//做推送
OapiRobotSendResponse resp = robotPushActionCardMessage(webhook,sercetKey,actionCard);
//TODO 有需要的話可以保存一下發送的歷史記錄啥的
}
/**
* @Description: 推送actionCard訊息模版
* @Param: [webhook,sercetKey,actionCard]
* @return: void
* @Author: Nipppppp
* @Date: 2021/2/26 14:15
*/
public OapiRobotSendResponse robotPushActionCardMessage(String webhook,String sercetKey, OapiRobotSendRequest.Actioncard actionCard) {
try {
DingTalkClient client = getDingTalkClient(webhook, sercetKey);
OapiRobotSendRequest request = new OapiRobotSendRequest();
request.setMsgtype("actionCard");
request.setActionCard(actionCard);
OapiRobotSendResponse response = client.execute(request);
if (!ObjectUtils.isEmpty(response) && response.isSuccess()) {
log.info("釘釘機器人推送actionCard成功:{}", actionCard.getText());
} else {
log.error("釘釘機器人推送actionCard失敗:{},{}", actionCard.getText(), response.getErrmsg());
}
return response;
} catch (NoSuchAlgorithmException e) {
log.error("=======釘釘機器人推送actionCard例外:{}======", e.getMessage());
} catch (UnsupportedEncodingException e) {
log.error("=======釘釘機器人推送actionCard例外:{}========", e.getMessage());
} catch (InvalidKeyException e) {
log.error("=======釘釘機器人推送actionCard例外:{}=======", e.getMessage());
} catch (ApiException e) {
log.error("=======釘釘機器人推送actionCard例外:{}=====", e.getErrMsg());
}
return null;
}
/**
* 獲取釘釘物件 機器人僅設定密鑰
*
* @param webHook 機器人webHook
* @param secretKey 機器人密鑰
* @return
* @throws NoSuchAlgorithmException
* @throws InvalidKeyException
* @throws UnsupportedEncodingException
*/
private DingTalkClient getDingTalkClient(String webHook, String secretKey) throws NoSuchAlgorithmException, InvalidKeyException, UnsupportedEncodingException {
Map<String, String> sign = sign(secretKey);
String aceRobotUrl = webHook + ("×tamp=" + sign.get("timestamp") + "&sign=" + sign.get("sign"));
DingTalkClient client = new DefaultDingTalkClient(aceRobotUrl);
return client;
}
/**
* 計算簽名
*
* @return
* @throws NoSuchAlgorithmException
* @throws UnsupportedEncodingException
* @throws InvalidKeyException
*/
public static Map<String, String> sign(String robotSecret) throws NoSuchAlgorithmException, UnsupportedEncodingException, InvalidKeyException {
Long timestamp = System.currentTimeMillis();
//機器人加簽密鑰
String stringToSign = timestamp + "\n" + robotSecret;
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(robotSecret.getBytes("UTF-8"), "HmacSHA256"));
byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)), "UTF-8");
Map<String, String> map = new HashMap<>(2);
map.put("timestamp", timestamp.toString());
map.put("sign", sign);
return map;
}
actionCard里面填裝你自己的內容即可
最后就是撰寫測驗方法或者自啟動springboot任務呼叫一下方法看看推出來的東西咯

就醬
如果推送業務或者機器人變多的話 最好寫一個管理界面去管理你的機器人關聯你推送的業務
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/264266.html
標籤:其他

