小程序入门4—钉钉群机器人消息通知和钉钉工作通知

程序,入门,机器人,消息,通知,工作 · 浏览次数 : 66

小编点评

# 生成工作通知内容 **1. 获取小程序的accessToken** ```java DefaultDingTalkClient client1 = new DefaultDingTalkClient("https://oapi.dingtalk.com/service/get_corp_token"); OapiServiceGetCorpTokenRequest req = new OapiServiceGetCorpTokenRequest(); req.setAuthCorpid("dingxxxx"); // suiteTicket获取比较麻烦,后续我会单独写文章说明 OapiServiceGetCorpTokenResponse execute = client1.execute(req, "xxx", "xxx", "xxx"); ``` **2. 构建工作通知推送Client** ```java DingTalkClient client2 = new DefaultDingTalkClient( "https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2" ); ``` **3. 构建消息模板** ```java OapiMessageCorpconversationAsyncsendV2Request.Msg msg = new OapiMessageCorpconversationAsyncsendV2Request.Msg(); msg.setMsgtype("text"); msg.setText(new OapiMessageCorpconversationAsyncsendV2Request.Text()); msg.getText().setContent("test123"); ``` **4. 构建消息内容** ```java msg.setMsgtype("image"); msg.setImage(new OapiMessageCorpconversationAsyncsendV2Request.Image()); msg.getImage().setMediaId("@lADOdvRYes0CbM0CbA"); ``` **5. 构建消息内容** ```java msg.setMsgtype("file"); msg.setFile(new OapiMessageCorpconversationAsyncsendV2Request.File()); msg.getFile().setMediaId("@lADOdvRYes0CbM0CbA"); ``` **6. 构建消息内容** ```java msg.setMsgtype("link"); msg.setLink(new OapiMessageCorpconversationAsyncsendV2Request.Link()); msg.getLink().setTitle("test"); msg.getLink().setText("test"); msg.getLink().setMessageUrl("test"); ``` **7. 构建消息内容** ```java msg.setMarkdown(new OapiMessageCorpconversationAsyncsendV2Request.Markdown()); msg.getMarkdown().setText("##### text"); msg.getMarkdown().setTitle("### Title"); ``` **8. 构建消息内容** ```java msg.setOa(new OapiMessageCorpconversationAsyncsendV2Request.OA()); msg.getOa().setHead(new OapiMessageCorpconversationAsyncsendV2Request.Head()); msg.getOa().getHead().setText("head"); msg.getOa().setBody(new OapiMessageCorpconversationAsyncsendV2Request.Body()); msg.getOa().getBody().setContent("xxx"); ``` **9. 构建消息内容** ```java msg.settype("oa"); msg.setActionCard(new OapiMessageCorpconversationAsyncsendV2Request.ActionCard()); msg.getActionCard().setTitle("xxx123411111"); msg.getActionCard().setMarkdown("### 测试123111"); msg.getActionCard().setSingleTitle("测试测试"); msg.getActionCard().setSingleUrl("https://www.dingtalk.com"); ``` **10. 生成工作通知内容** ```java OapiMessageCorpconversationAsyncsendV2Response rsp = client2.execute(msg, execute.getAccessToken()); ``` # 打印工作通知内容

正文

前言

在消息通知这块,钉钉可谓是玩出了花,比如工作通知、群机器人通知,还有那万恶的Ding一下。钉钉的通知不仅花样多,而且大部分渠道都支持自定义,也即可以自定义设置发送时间、发送内容,并且还支持多种样式的消息如文本、卡片、Markdown等。
这篇文章我主要介绍一下常用的两类:钉钉群机器人通知和钉钉工作通知。

钉钉群机器人通知效果图

钉钉工作通知效果图

具体的区别和对比我就不写了,简单来说钉钉群机器人消息通知发的消息所有人都可以看到,钉钉工作通知只有选择到的人才可以看到,所以钉钉群机器人消息通知适合发公告通知所有人,钉钉工作通知适合发工作安排通知到具体人,不过具体怎么用还得看业务的需要。

钉钉群机器人通知实现

官方文档链接

自定义机器人接入https://open.dingtalk.com/document/robots/custom-robot-access

自定义机器人安全设置https://open.dingtalk.com/document/robots/customize-robot-security-settings

配置流程

1. 选择需要添加机器人的群聊,然后依次单击群设置 > 机器人。

2. 点击添加机器人,然后找到自定义机器人

3. 输入配置,安全设置需要注意一下

由于创建自定义机器人必须选择安全设置,这里注意不要乱输,如果明白安全设置是啥最好,如果不懂建议选择加签的方式,然后看一下说明文档,不然测试的时候有可能会发送不成功。

4. 点击完成,会生成Webhook

开发机器人

1. 保存好安全设置的token和Webhook

2. 导入maven旧版依赖

    <!-- 使用旧版钉钉开放api -->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>alibaba-dingtalk-service-sdk</artifactId>
            <version>2.0.0</version>
        </dependency>
    </dependencies>

3. 编写测试类

package com.example.dingtalkmsg.service;

import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.OapiRobotSendRequest;
import com.dingtalk.api.request.OapiRobotSendRequest.Links;
import com.dingtalk.api.response.OapiRobotSendResponse;
import org.apache.tomcat.util.codec.binary.Base64;

public class DingTalkRobotSendService {

    public static void main(String[] args) throws Exception {
        //安全设置加签
        Long timestamp = System.currentTimeMillis();
        String secret = "xxx ";
        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");

        //构建消息发送Client
        DingTalkClient client = new DefaultDingTalkClient(
            "https://oapi.dingtalk"
                + ".com/robot/send?access_token=xxx"
                + "&timestamp="
                + timestamp + "&sign=" + sign);
        //创建发送请求体
        OapiRobotSendRequest request = new OapiRobotSendRequest();
        request.setMsgtype("text");
        //文本消息
        OapiRobotSendRequest.Text text = new OapiRobotSendRequest.Text();
        text.setContent("测试文本消息");
        request.setText(text);
        OapiRobotSendRequest.At at = new OapiRobotSendRequest.At();
        at.setAtMobiles(Arrays.asList("xxxxx"));
        // isAtAll类型如果不为Boolean,请升级至最新SDK
        //at.setIsAtAll(true);
        //at.setAtUserIds(Arrays.asList("109929","32099"));

        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);

        request.setMsgtype("feedCard");
        OapiRobotSendRequest.Feedcard feedcard = new OapiRobotSendRequest.Feedcard();
        OapiRobotSendRequest.Links links1 = new OapiRobotSendRequest.Links();
        links1.setTitle("时代的火车向前开1");
        links1.setMessageURL("https://www.dingtalk.com/");
        links1.setPicURL("https://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png");

        OapiRobotSendRequest.Links links2 = new OapiRobotSendRequest.Links();
        links2.setTitle("时代的火车向前开2");
        links2.setMessageURL("https://www.dingtalk.com/");
        links2.setPicURL("https://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png");
        List<Links> links = new ArrayList<>();
        links.add(links1);
        links.add(links2);
        feedcard.setLinks(links);
        request.setFeedCard(feedcard);

        OapiRobotSendResponse response = client.execute(request);
        System.out.println(response);
    }
}

总体来说,钉钉机器人推送消息的开发没有那些弯弯绕绕的设置,基本上能看懂文档就可以开发出来,也不需要什么特殊的环境支持。

钉钉工作通知实现

官方文档链接

第三方企业应用开发https://open.dingtalk.com/document/isvapp/send-job-notification

配置流程

1. 创建一个第三方企业应用

我本来以为企业内应用和第三方企业应用一样,创建应用之后都有一个工作通知。创建应用后发现,确实都有一个,但是区别非常大。企业内应用通知就是机器人群消息,而第三方企业应用则是模板消息。

2. 依次点击应用功能—>消息推送—>新增

3. 选择Markdown模板进行创建—>发送测试消息

4. 保存好消息模板后点击提交审核,审核一般半天左右会通过

开发工作通知

1. 导入maven旧版依赖

    <!-- 使用旧版钉钉开放api -->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>alibaba-dingtalk-service-sdk</artifactId>
            <version>2.0.0</version>
        </dependency>
    </dependencies>

2. 编写测试类

package com.example.dingtalkmsg.service;

import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.OapiMessageCorpconversationAsyncsendV2Request;
import com.dingtalk.api.request.OapiServiceGetCorpTokenRequest;
import com.dingtalk.api.response.OapiMessageCorpconversationAsyncsendV2Response;
import com.dingtalk.api.response.OapiServiceGetCorpTokenResponse;

public class DingTalkWorkNoticeSendService {

    public static void main(String[] args) throws Exception {
        //获取小程序的accessToken
        DefaultDingTalkClient client1 = new DefaultDingTalkClient("https://oapi.dingtalk.com/service/get_corp_token");
        OapiServiceGetCorpTokenRequest req = new OapiServiceGetCorpTokenRequest();
        req.setAuthCorpid("dingxxxx");
        //suiteTicket获取比较麻烦,后续我会单独写文章说明
        OapiServiceGetCorpTokenResponse execute = client1.execute(req, "xxx", "xxx", "xxx");

        //构建工作通知推送Client
        DingTalkClient client2 = new DefaultDingTalkClient(
            "https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2");
        OapiMessageCorpconversationAsyncsendV2Request request = new OapiMessageCorpconversationAsyncsendV2Request();
        request.setAgentId(836390886L);
        request.setUseridList("user123");
        request.setToAllUser(false);

        //构建消息模板
        OapiMessageCorpconversationAsyncsendV2Request.Msg msg = new OapiMessageCorpconversationAsyncsendV2Request.Msg();
        msg.setMsgtype("text");
        msg.setText(new OapiMessageCorpconversationAsyncsendV2Request.Text());
        msg.getText().setContent("test123");
        request.setMsg(msg);

        msg.setMsgtype("image");
        msg.setImage(new OapiMessageCorpconversationAsyncsendV2Request.Image());
        msg.getImage().setMediaId("@lADOdvRYes0CbM0CbA");
        request.setMsg(msg);

        msg.setMsgtype("file");
        msg.setFile(new OapiMessageCorpconversationAsyncsendV2Request.File());
        msg.getFile().setMediaId("@lADOdvRYes0CbM0CbA");
        request.setMsg(msg);

        msg.setMsgtype("link");
        msg.setLink(new OapiMessageCorpconversationAsyncsendV2Request.Link());
        msg.getLink().setTitle("test");
        msg.getLink().setText("test");
        msg.getLink().setMessageUrl("test");
        msg.getLink().setPicUrl("test");
        request.setMsg(msg);

        msg.setMsgtype("markdown");
        msg.setMarkdown(new OapiMessageCorpconversationAsyncsendV2Request.Markdown());
        msg.getMarkdown().setText("##### text");
        msg.getMarkdown().setTitle("### Title");
        request.setMsg(msg);

        msg.setOa(new OapiMessageCorpconversationAsyncsendV2Request.OA());
        msg.getOa().setHead(new OapiMessageCorpconversationAsyncsendV2Request.Head());
        msg.getOa().getHead().setText("head");
        msg.getOa().setBody(new OapiMessageCorpconversationAsyncsendV2Request.Body());
        msg.getOa().getBody().setContent("xxx");
        msg.setMsgtype("oa");
        request.setMsg(msg);

        msg.setActionCard(new OapiMessageCorpconversationAsyncsendV2Request.ActionCard());
        msg.getActionCard().setTitle("xxx123411111");
        msg.getActionCard().setMarkdown("### 测试123111");
        msg.getActionCard().setSingleTitle("测试测试");
        msg.getActionCard().setSingleUrl("https://www.dingtalk.com");
        msg.setMsgtype("action_card");
        request.setMsg(msg);
        OapiMessageCorpconversationAsyncsendV2Response rsp = client2.execute(request, execute.getAccessToken());
        System.out.println(rsp.getBody());
    }
}

其实工作通知开发的难度也不高,但是由于这是个三方应用,所有三方应用的接口都需要一个accessToken。而这个accessToken也不是简单的拿ak/sk去获取就行了,钉钉那边还需要一个suiteTicket,这个suiteTicket才是开发的最大难点。
suiteTicket不是调用接口去获取的,而是钉钉主动推送过来的,所以我们还需要写一个回调接口供钉钉侧调用,这个回调接口会在后续文章中补充。

与小程序入门4—钉钉群机器人消息通知和钉钉工作通知相似的内容:

小程序入门4—钉钉群机器人消息通知和钉钉工作通知

前言 在消息通知这块,钉钉可谓是玩出了花,比如工作通知、群机器人通知,还有那万恶的Ding一下。钉钉的通知不仅花样多,而且大部分渠道都支持自定义,也即可以自定义设置发送时间、发送内容,并且还支持多种样式的消息如文本、卡片、Markdown等。 这篇文章我主要介绍一下常用的两类:钉钉群机器人通知和钉钉

uniapp引入高德地图或腾讯地图以及map在真机中常见问题汇总

以下是必须肯定会用到的官方地址 腾讯地图API开发文档:微信小程序JavaScript SDK | 腾讯位置服务 (qq.com) 高德地图API开发文档:开发 | 高德地图API (amap.com) 高德地图小程序配置指南:入门指南-微信小程序插件|高德地图API (amap.com) 小程序后

Blazor技术入门

曾写过点儿前后端分离的项目(Vue+.NET Core Web API)、WPF和WinForm。因为Blazor不支持小程序的原因(相对于uniapp),所以只是大概知道Blazor可以写Web、PC和移动端项目,最大的特点就是使用C#代替JS。本文算是通过几个默认例子入门Blazor技术吧。 一

钉钉小程序三方企业应用事件与回调

事件回调 订阅事件后,开放平台将会在事件发生时(如:机器人入群)向请求网址推送消息。 钉钉三方企业应用事件与回调配置界面如下: 推送方式有三种: Http 推送(官方不推荐) SyncHttp 推送 (官方推荐) RDS 推送(官方推荐) Http和SyncHttp没有太大的区别,按钉钉的说法是:与

Kotlin 编程语言详解:特点、应用领域及语法教程

**Kotlin**是JetBrains于2016年推出的编程语言,兼容Java,广泛用于移动(尤其是Android)、Web、服务器及数据科学。它的语法简洁安全,支持多平台,学习曲线平缓,且拥有活跃的社区。`main()`函数是程序入口,`println()`用于输出,而`print()`不换行。...

逆向wechat

本篇博客园地址https://www.cnblogs.com/bbqzsl/p/18171552 计划来个wechat的逆向系列,包括主程序WeChat,以及小程序RadiumWMPF。 开篇,对WeChat入口进行分析。 depends显示WeChat.exe并没有依赖CRT,入口地址也找到那个S

小程序的小组件技术能力和场景解析

随着移动互联网的快速发展,小程序等轻量级应用平台日益成为用户获取信息和服务的重要渠道。而小组件也在其中扮演了至关重要的角色,不仅能够提升用户的交互体验,还能帮助开发者高效地构建功能丰富、界面美观的小程序。

小程序排名第三-我又焦虑了

不给搜索-只有无奈 3月底,趁着春风十里,一时头脑发热,写了个小程序 — 文字转语音实用工具。本来也没啥期待,渐渐得每天有7-8的自然流量进来,成为活跃用户。这反倒又让我有了期望,每天起初第一件事儿就是看昨日数据。直到有一天,没有任何新增用户,原来除了用全称搜索,其他任何关键字都无法搜索到。问了一圈

小程序中使用 lottie 动画 | 踩坑经验分享

最近被拉去支援紧急需求(赶在五一节假日前上线的,双休需要加班),参与到项目中才知道,开发的项目是微信小程序技术栈的。由于是临时支援,笔者也很久没开发过微信小程序了,所以挑选了相对独立,业务属性相对轻薄的模块参与。 其中有个营销活动(领红包)的弹窗动画就要用到 lottie 动画。 本文就

京东小程序数据中心架构设计与最佳实践

小程序平台是怎么保证商家业务的稳定、健康发展,服务好这些外部商家的呢?这里面非常重要的是我们平台对小程序基本流量的运营与监控。如何不让业务的小程序在线上裸奔?如何帮助业务对自身小程序流量的冲高回落有一种直观的把握和监测?如何基于海量数据指导业务去进行一个精细化的运营?实际上,京东小程序数据中心就扮演了一个这样的小程序数据问题终结者的角色,充分利用各类数据手段,解决这些痛点问题。