需求:
实现每个工作日的下午六点推送指定内容至钉钉群
①找到你需要推送的群 - 智能群助手
为群新增一个自定义机器人
②对于你的机器人进行设置(名字啊头像啊
③ 给你的项目导入钉钉开放的SDK包
Pom文件如下:
lippi-oapi-encrpt
dingtalk
1.0.0
com.aliyun
alibaba-dingtalk-service-sdk
1.0.1
现在可以正式开始开发了
需求分解:
一、 每个工作日
由于内部用自己研发的考勤系统,有自己设定的排班考勤接口
如果是按照法定工作日 可以调用 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);
}
}
三、销售数据文本组织
假设我们今天要推送的数据大致如下:
以图片+文本的形式进行推送
查阅钉钉开发文档的话我们能知道机器人推送的格式有下面几个
具体这些消息发出来的样式参考钉钉开发者文档:
钉钉机器人开发
需求所需推送的是图片+文本的形式
我们这里就采用【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("![screenshot](https://img-blog.csdnimg.cn/20210226132655473.png"));
//换行
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任务调用一下方法看看推出来的东西咯
就酱
如果推送业务或者机器人变多的话 最好写一个管理界面去管理你的机器人关联你推送的业务