钉钉机器人发送折线图卡片 工具类代码

news2024/11/15 8:45:09
钉钉机器人 “创建并投放卡片 接口 ”   可以  发送折线图、柱状图

官方文档:创建并投放卡片 - 钉钉开放平台

0依赖、1模板、2机器人放到内部应用、3放开这个权限 、4工具类、5调用工具类 拼接入参

卡片模板 自己看文档创建,卡片模板的id 有用

0、依赖 
<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>dingtalk</artifactId>
  <version>2.0.87</version>
</dependency>

        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>alibaba-dingtalk-service-sdk</artifactId>
            <version>2.0.0</version>
        </dependency>
1、找到你的机器人,迁移到内部应用

2、放开这个权限    Card.Instance.Write

3、参数要求,重要 (这是发给个人的)

3.1 发给群的参数这样写 (看红框里的)

3.2其他参数

3.3 你的入参是这样的就对了
{
  "cardData":{
    "cardParamMap":{
        "count":"{\"data\":[{\"x\":\"N0\",\"type\":\"line\",\"y\":48},{\"x\":\"N1\",\"type\":\"line\",\"y\":74}],\"type\":\"histogram\",\"config\":{}}"
            }
  },
  "outTrackId":"test23",
  "cardTemplateId":"785b7cec-c8c5-4bba-99be-6da77befb022.schema",
  "openSpaceId":"dtv1.card//im_group.cid4cUEK93zmHMHb1ycvDESQQ==",

  "imRobotOpenDeliverModel":{
    "spaceType":"IM_ROBOT"
  },
  "imGroupOpenSpaceModel":{
    "supportForward":false
  },
  "imGroupOpenDeliverModel":{
    "robotCode":"ding0a8fitygi7torxla"
  }
}
4、柱状图效果

卡片模板 自己看文档创建,卡片模板的id 有用

5、工具类代码
import com.aliyun.dingtalkcard_1_0.models.CreateAndDeliverHeaders;
import com.aliyun.dingtalkcard_1_0.models.CreateAndDeliverRequest;
import com.aliyun.dingtalkcard_1_0.models.CreateAndDeliverResponse;
import com.aliyun.tea.TeaException;
import com.aliyun.teautil.models.RuntimeOptions;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.RandomStringUtils;

import java.util.Map;

/**
 * @author szl
 * @date 2024/2/29 0029 10:38
 */
@Slf4j
public class DingCardUtils {
    public static final String APP_KEY = "dinwergsdfrx";
    public static final String APP_SECRET = "G8Gasdfsdfasd";
    public static String cardTemplateId_personal = "3b8besadfsdf-85asdff1.schema";
    public static String cardTemplateId_principal = "96sadf9.schema";

    public static com.aliyun.dingtalkcard_1_0.Client createClient() throws Exception {
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
        config.protocol = "https";
        config.regionId = "central";
        return new com.aliyun.dingtalkcard_1_0.Client(config);
    }

    /**
     * 给某个人 创建并投放卡片
     */
    public static void sendDingcard(String receiveUserId, String outTrackId, Map<String, String> cardDataCardParamMap, String cardTemplateId, String Key) throws Exception {
        com.aliyun.dingtalkcard_1_0.Client client = createClient();
        CreateAndDeliverHeaders createAndDeliverHeaders = new CreateAndDeliverHeaders();
        String accessToken = DingUtils.setAccessToken();
        createAndDeliverHeaders.xAcsDingtalkAccessToken = accessToken;
        CreateAndDeliverRequest.CreateAndDeliverRequestCardData cardData = new CreateAndDeliverRequest.CreateAndDeliverRequestCardData()
                .setCardParamMap(cardDataCardParamMap);
        CreateAndDeliverRequest.CreateAndDeliverRequestImRobotOpenDeliverModel imRobotOpenDeliverModel = new CreateAndDeliverRequest.CreateAndDeliverRequestImRobotOpenDeliverModel()
                .setSpaceType("IM_ROBOT");//折线图卡片需要这个
        CreateAndDeliverRequest.CreateAndDeliverRequestImRobotOpenSpaceModel imRobotOpenSpaceModel = new CreateAndDeliverRequest.CreateAndDeliverRequestImRobotOpenSpaceModel()
                .setSupportForward(false);
        CreateAndDeliverRequest.CreateAndDeliverRequestImGroupOpenDeliverModel imGroupOpenDeliverModel = new CreateAndDeliverRequest.CreateAndDeliverRequestImGroupOpenDeliverModel()
                .setRobotCode(APP_KEY);

        CreateAndDeliverRequest createAndDeliverRequest = new CreateAndDeliverRequest()
                .setOutTrackId(outTrackId)
                .setCardTemplateId(cardTemplateId)
                .setOutTrackId(outTrackId)
                .setCardData(cardData)
                .setImRobotOpenSpaceModel(imRobotOpenSpaceModel)
                .setOpenSpaceId("dtv1.card//IM_ROBOT." + receiveUserId + ";")
                .setImGroupOpenDeliverModel(imGroupOpenDeliverModel)
                .setImRobotOpenDeliverModel(imRobotOpenDeliverModel)
                .setUserIdType(1);
        try {
            CreateAndDeliverResponse andDeliverWithOptions = client.createAndDeliverWithOptions(createAndDeliverRequest, createAndDeliverHeaders, new RuntimeOptions());
            log.info("卡片id为:" + andDeliverWithOptions);
        } catch (TeaException err) {
            err.printStackTrace();
        }
    }

    /**
     * 获取消息id
     *
     * @return
     */
    public static String getOutTrackId() {
        return System.currentTimeMillis() + RandomStringUtils.randomAlphanumeric(6);
    }

5.2 获取token 的代码  不再详细描述  APP_KEY,   APP_SECRET  自己的

/**
     * 初始化--权限Client
     *
     * @return Client
     * @throws Exception
     */
    public static com.aliyun.dingtalkoauth2_1_0.Client createAuthClient() throws Exception {
        Config config = new Config();
        config.protocol = "https";
        config.regionId = "central";
        return new com.aliyun.dingtalkoauth2_1_0.Client(config);
    }

    /**
     * 获取并设置最新accessToken,每两小时失效
     */
    public static String setAccessToken() throws Exception {
        com.aliyun.dingtalkoauth2_1_0.Client client = createAuthClient();
        GetAccessTokenRequest getAccessTokenRequest = new GetAccessTokenRequest()
                .setAppKey(APP_KEY)
                .setAppSecret(APP_SECRET);
        try {
            GetAccessTokenResponse accessToken = client.getAccessToken(getAccessTokenRequest);
            System.out.println("000----:" + accessToken);
            //设置access_token
            return accessToken.getBody().accessToken;
        } catch (TeaException err) {
            System.out.println(err.message);
            return null;
        } catch (Exception _err) {
            TeaException err = new TeaException(_err.getMessage(), _err);
            System.out.println(err.message);
            return null;
        }
    }

5.3、拼接数据,调用工具类 (入参看不懂的,评论区问)

/**
     * 拼接数据后发送
     *
     * @param aname a name
     * @param dnum  a number
     */
    public void sendDingcard(String campusName, String receiveUserId, String cardTemplateId,
                             String aname, String bname, String cname, String dname,
                             Integer anum, Integer bnum, Integer cnum, Integer dnum) {
        try {
            List<JSONObject> data = new ArrayList<>();
            JSONObject json1 = new JSONObject();
            json1.put("x", aname);
            json1.put("y", anum);
            json1.put("type", aname);
            data.add(json1);
            JSONObject json2 = new JSONObject();
            json2.put("x", bname);
            json2.put("y", bnum);
            json2.put("type", bname);
            data.add(json2);
            JSONObject json3 = new JSONObject();
            json3.put("x", cname);
            json3.put("y", cnum);
            json3.put("type", cname);
            data.add(json3);
            JSONObject json4 = new JSONObject();
            json4.put("x", dname);
            json4.put("y", dnum);
            json4.put("type", dname);
            data.add(json4);
            JSONObject count = new JSONObject();
            count.put("data", data);
            count.put("type", "histogram");
            count.put("config", new JSONObject());
            Map<String, String> cardCreateParam = new HashMap<>();
            cardCreateParam.put("campusName", campusName);
            cardCreateParam.put("yifenpei", anum.toString());
            cardCreateParam.put("weifenpei", bnum.toString());
            cardCreateParam.put("yigoutong", bnum.toString());
            cardCreateParam.put("weigoutong", cnum.toString());
            cardCreateParam.put("weizhuanhua", dnum.toString());
            cardCreateParam.put("chartData", count.toString());
            DingCardUtils.sendDingcard(receiveUserId, DingCardUtils.getOutTrackId(), cardCreateParam, cardTemplateId, null);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

看不懂的,评论区问

2024年3月1日14:02:18

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1483502.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue2 设置keepAlive之后怎么刷新页面数据

场景&#xff1a;移动端有 A、B、C 三个页面&#xff0c;A、B 页面路由设置了keepAlive属性&#xff0c;有下面两个场景&#xff1a; 1、A 页面 --> B 页面&#xff0c;B 页面刷新。 2、C 页面 --> B页面&#xff0c;B 页面不刷新。 一、分为以下两个情况讨论&#xf…

Linux安装Nginx配置Keepalived高可用

Vmwaire 安装 Linux 解决启动没有IP地址问题 cd /etc/sysconfig/network-scripts vi ifcfg-ens33# 重启linux reboot # 再次查看ip ip addrLinux 镜像地址下载 ps: 发现阿里有一个工具箱&#xff0c;里面有各种镜像 阿里镜像地址 https://developer.aliyun.com/mirror/ 安装…

计算机设计大赛 深度学习图像修复算法 - opencv python 机器视觉

文章目录 0 前言2 什么是图像内容填充修复3 原理分析3.1 第一步&#xff1a;将图像理解为一个概率分布的样本3.2 补全图像 3.3 快速生成假图像3.4 生成对抗网络(Generative Adversarial Net, GAN) 的架构3.5 使用G(z)生成伪图像 4 在Tensorflow上构建DCGANs最后 0 前言 &#…

windows安装部署node.js以及搭建运行第一个Vue项目

一、官网下载安装包 官网地址&#xff1a;https://nodejs.org/zh-cn/download/ 二、安装程序 1、安装过程 如果有C/C编程的需求&#xff0c;勾选一下下图所示的部分&#xff0c;没有的话除了选择一下node.js安装路径&#xff0c;直接一路next 2、测试安装是否成功 【winR】…

cv_bridge连接自定义版本的opencv

在ros noetic版本中&#xff0c;默认的cv_bridge依赖的opencv版本为4.2.0&#xff0c;若要升级opencv版本&#xff0c;则无法使用cv_bridge&#xff0c;所以需要重新自编译cv_bridge。 一. 编译cv_bridge 1.通过网站 https://github.com/ros-perception/vision_opencv/tree/n…

MYSQL的优化学习,从原理到索引,在到事务和锁机制,最后的主从复制、读写分离和分库分表

mysql的优化学习 为什么选择Mysql不选择其他的数据库&#xff1f;还有哪些&#xff0c;有什么区别&#xff1f; Mysql&#xff1a;开源免费版本可用&#xff0c;适用于中小型应用 Oracle&#xff1a;适用于大型企业级应用&#xff0c;复杂的业务场景和大量数据的处理&#xf…

Acwing 每日一题 空调 差分 贪心

&#x1f468;‍&#x1f3eb; 空调 &#x1f468;‍&#x1f3eb; 参考题解 import java.util.Scanner;public class Main {static int N (int) 1e5 10;static int[] a new int[N];static int n;public static void main(String[] args){Scanner sc new Scanner(System.…

智能家居控制系统(51单片机)

smart_home_control_system 51单片机课设&#xff0c;智能家居控制系统 使用及转载请标明出处&#xff08;最好点个赞及star哈哈&#xff09; Github地址&#xff0c;带有PPT及流程图 Gitee码云地址&#xff0c;带有PPT及流程图 ​ 以STC89C52为主控芯片&#xff0c;以矩阵键…

【OpenCV C++】Mat img.total() 和img.cols * img.rows 意思一样吗?二者完全相等吗?

文章目录 1 结论及区别2 Mat img的属性 介绍1 结论及区别 在大多数情况下,img.total() 和 img.cols * img.rows 是相等的,但并不总是完全相等的。下面是它们的含义和一些区别: 1.img.total() 表示图像中像素的总数,即图像的总像素数量。2.img.cols * img.rows 也表示图像中…

C++学习笔记:二叉搜索树

二叉搜索树 什么是二叉搜索树?搜索二叉树的操作查找插入删除 二叉搜索树的应用二叉搜索树的代码实现K模型:KV模型 二叉搜索树的性能怎么样? 什么是二叉搜索树? 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树…

【go语言开发】swagger安装和使用

本文主要介绍go-swagger的安装和使用&#xff0c;首先介绍如何安装swagger&#xff0c;测试是否成功&#xff1b;然后列出常用的注释和给出使用例子&#xff1b;最后生成接口文档&#xff0c;并在浏览器上测试 文章目录 安装注释说明常用注释参考例子 文档生成格式化文档生成do…

代码随想录算法训练营第二十八天|93.复原IP地址 、78.子集、90.子集II

文章目录 [1.复原 IP 地址](https://leetcode.cn/problems/restore-ip-addresses/description/)2.子集[3.子集 II](https://leetcode.cn/problems/subsets-ii/) 1.复原 IP 地址 切割问题可以使用回溯&#xff0c;本题分别两步&#xff0c;切割字符串和判断IP 切割逻辑如下&…

微信小程序 --- 分包加载

分包加载 1. 什么是分包加载 什么是分包加载 ❓ 小程序的代码通常是由许多页面、组件以及资源等组成&#xff0c;随着小程序功能的增加&#xff0c;代码量也会逐渐增加&#xff0c;体积过大就会导致用户打开速度变慢&#xff0c;影响用户的使用体验。 分包加载是一种小程序…

MATLAB图像噪声添加与滤波

在 MATLAB 中添加图像噪声和进行滤波通常使用以下函数&#xff1a; 添加噪声&#xff1a;可以使用imnoise函数向图像添加各种类型的噪声&#xff0c;如高斯噪声、椒盐噪声等。 滤波&#xff1a;可以使用各种滤波器对图像进行滤波处理&#xff0c;例如中值滤波、高斯滤波等。 …

(三)电机控制之方波驱动无刷直流电机(BLDC)与正弦波驱动无刷直流电机(PMSM)的详细对比

电流控制方式和波形&#xff1a; 方波驱动&#xff1a;在每个换相周期内&#xff0c;定子绕组中的电流被切换为高或低两个状态&#xff0c;形成矩形波。通常采用六步换向法&#xff0c;即每60度电角度换相一次&#xff0c;从而产生转矩。正弦波驱动&#xff1a;定子绕组中流过的…

Doris实战——拈花云科的数据中台实践

前言 拈花云科 NearFar X Lab 团队调研并引进 Doris 作为新架构下的数据仓库选型方案。本文主要介绍了拈花云科数据中台架构从 1.0 到 2.0 的演变过程&#xff0c;以及 Doris 在交付型项目和 SaaS 产品中的应用实践。 一、业务背景 拈花云科的服务对象主要是国内各个景区、景点…

安卓虚拟机ART和Dalvik

目录 一、JVM和Dalvik1.1 基于栈的虚拟机字节码指令执行过程 1.2 基于寄存器的虚拟机 二、ART与Dalvikdex2aotAndroid N的运作方式 三、总结 一、JVM和Dalvik Android应用程序运行在Dalvik/ART虚拟机&#xff0c;并且每一个应用程序对应有一个单独的Dalvik虚拟机实例。 Dalvik…

四、西瓜书——支持向量机

第六章 支持向量机 1.间隔与支持向量 支持向量机的原理是寻找与支持向量具有最大间隔的划分超平面。支持向量机具有一个重要性质: 训练完成后,大部分的训练样本都不需保留,最终模型仅与支持向量有关. 首先&#xff0c;超平面的方程为&#xff1a; 点到超平面的距离为&#xff…

爬取博客的图片并且将它存储到响应的目录

目录 前言 思想 注意 不多说解释了&#xff0c;贴代码吧 config.json Get_blog_img.py 把之前的写的代码也贴上 Get_blog_id.py 主函数 main.py 运行结果 前言 在上一篇博客中我们介绍了如何爬取博客链接 利用python爬取本站的所有博客链接-CSDN博客文章浏览阅读74…

CSS转换(2D)transform属性及animation动画

1、倾斜效果&#xff0c;旋转效果 <style type"text/css"> .transrorm_bar{ padding:150px; display: flex; align-items: center;} .transrorm_bar div{ width: 120px; height: 120px; background-color: #eee; margin: 10px; display: flex; align-items: c…