为什么想着去捣腾这个玩意呢?因为最近有一些定时任务每天都需要重复的人工去执行、审核,于是就想到了能不能有一个定时任务执行完,但是需要一个机器人通知我,之前想到用邮箱(玩腻了),但是这次想看下 DingTalk 的能力——机器人
首先在钉钉软件里创建一个群聊,这个比较简单就不多说啥了,主要注意的地方是一个群聊至少三个人,但是如何做到 1 个人创建一个群呢?也很简单,只要一开始拉 2 个人进来,然后创建成功后把他们踢出去就行,这样就实现 1 个人在一个群里,就可以和机器人愉快地玩耍啦~
因为我们这篇主要讲解的是自定义机器人,其他机器人也半斤八两的操作,所以我们还是拿自定义机器人来举例说明,如图所是,完全傻瓜式操作
Ps1:这一步安全设置有三种安全设置可供选择,这里只演示加签安全设置(推荐)
Ps2:记得先复制来这串密钥,下文会用到
Ps1:这一步也一样,提前复制好 Webhook 信息,下文需要用到
Ps2:当然如果以上密钥和Webhook都忘记了的话,可以重新打开上面的机器人那边可以重新查看的噢
- <dependency>
- <groupId>com.aliyun</groupId>
- <artifactId>alibaba-dingtalk-service-sdk</artifactId>
- <version>2.0.0</version>
- </dependency>
Ps:添加依赖
- import com.dingtalk.api.DefaultDingTalkClient;
- import com.dingtalk.api.DingTalkClient;
- import com.dingtalk.api.request.OapiRobotSendRequest;
- import com.dingtalk.api.response.OapiRobotSendResponse;
- import com.taobao.api.ApiException;
- import org.apache.commons.codec.binary.Base64;
- 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;
-
- /**
- * @author Lux Sun
- * @date 2022/7/5
- */
- public class DingUtil {
-
- private static final String SECRET = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxd2233f6165930cfd78539369";
- private static final String URL = "https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxxxxxxxx7e1d6e711a3a5ef8e9908467a0f667";
-
- public static void send(String content) throws ApiException, NoSuchAlgorithmException, UnsupportedEncodingException, InvalidKeyException {
- 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(Base64.encodeBase64(signData)), "UTF-8");
- String signResult = "×tamp=" + timestamp + "&sign=" + sign;
- // 得到拼接后的 URL
- String url = URL + signResult;
-
- DingTalkClient client = new DefaultDingTalkClient(url);
- OapiRobotSendRequest request = new OapiRobotSendRequest();
- request.setMsgtype("text");
- OapiRobotSendRequest.Text text = new OapiRobotSendRequest.Text();
- text.setContent(content);
- request.setText(text);
- // OapiRobotSendRequest.At at = new OapiRobotSendRequest.At();
- // at.setAtMobiles(Arrays.asList("132xxxxxxxx"));
- // isAtAll类型如果不为Boolean,请升级至最新SDK
- // at.setIsAtAll(true);
- // at.setAtUserIds(Arrays.asList("109929","32099"));
- // request.setAt(at);
-
- // request.setMsgtype("link");
- // OapiRobotSendRequest.Link link = new OapiRobotSendRequest.Link();
- // link.setMessageUrl("https://www.dingtalk.com/");
- // link.setPicUrl("");
- // link.setTitle("时代的火车向前开");
- // link.setText("这个即将发布的新版本,创始人xx称它为红树林。而在此之前,每当面临重大升级,产品经理们都会取一个应景的代号,这一次,为什么是红树林");
- // request.setLink(link);
- //
- // request.setMsgtype("markdown");
- // OapiRobotSendRequest.Markdown markdown = new OapiRobotSendRequest.Markdown();
- // markdown.setTitle("杭州天气");
- // markdown.setText("#### 杭州天气 @156xxxx8827\n" +
- // "> 9度,西北风1级,空气良89,相对温度73%\n\n" +
- // "> ![screenshot](https://gw.alicdn.com/tfs/TB1ut3xxbsrBKNjSZFpXXcXhFXa-846-786.png)\n" +
- // "> ###### 10点20分发布 [天气](http://www.thinkpage.cn/) \n");
- // request.setMarkdown(markdown);
- OapiRobotSendResponse response = client.execute(request);
- }
- }
Ps:中间注释掉的部分,一个是 @ 功能,还有一些是其他的传参内容方式,因为我这边只需要用到 Text 方式即可
DingUtil.send("测试文本消息");
Ps:运行后看如下效果图