什么是钉钉消息推送?
我是3y,一年CRUD经验用十年的markdown程序员👨🏻💻常年被誉为职业八股文选手
在前阵子我就已经接入了钉钉的群机器人和工作消息推送,一直没写文章同步到给大家。
像这种接入渠道的工作,虽然我没接入过,但可预见性地就是看看官方文档,然后对着文档一顿学习,复制下接入的代码,然后调试,最后就完事了。老实说,有点枯燥。
基于原有的架构上,感觉没啥技术性可言,对于新增发送渠道这种需求也不会有代码的创新。所以,我一直不太积极干这事,但是,没人愿意干啊。
为了系统的完整性,我还是花时间去接入了。比如渠道可发送不同的消息类型(图片/markown/音频等等),基于不同的消息类型可能我们要有素材管理相关的功能。
目前这种多类型的发送渠道,由于我前端用的是低代码平台,在前端组装参数的时候不太灵活,但都一一克服了
所以,一个比较完整的消息推送平台要干、要解决的事情还是蛮多的,不要小看它。
可以到Git仓库看看源代码,配合文章食用更加哟:
消息推送平台🔥推送下发【邮件】【短信】【微信服务号】【微信小程序】【企业微信】【钉钉】等消息类型。
- https://gitee.com/zhongfucheng/austin
- https://github.com/ZhongFuCheng3y/austin
01、群机器人
1、阅读官方文档:https://open.dingtalk.com/document/group/custom-robot-access
2、创建智能群助手,得到Webhook地址和加密的值
3、HTTP调用尝试是否发送成功


02、钉钉工作消息
1、在官网文档了解基础概念:https://open.dingtalk.com/document/org/basic-concepts
2、进入企业管理后台: https://open-dev.dingtalk.com/fe/app#/corp/app ,随后创建应用

3、查看消息通知发送的文档:https://open.dingtalk.com/document/orgapp-server/asynchronous-sending-of-enterprise-session-messages
4、直接引入钉钉的SDK开发(主要是方便后续其他的操作,SDK会比HTTP方便不少)
5、对于拼装参数调用工作消息接口,没什么好值得说的,大家把代码拉下来就看得一清二楚了。
6、从文档发现调用接口需要access_token这个参数,还发现这个参数是会过期的(2个小时)
有了这个access_token参数之后,我们就需要考虑怎么去“维护”它,毕竟它会过期的,不能当做一个静态参数写死在代码或者配置文件上。
我当时是发这个问题到小群里,看看大伙们都是怎么“维护”的。毕竟,我们不可能每次在调用接口的时候都去远程拿到最新的(一般外部的API都会有限制调用频率的,没过期的前提下也没必要去调用外界的接口取)
分析后,依我看来,就两种思路:
- 定时任务刷新,每隔一段时间去获取最新的
access_token,将最新的token开放接口给有需要的人使用。 - 调用接口的时候拿到上一次的
access_token,如果发现access_token失效了再重新获取并重试接口。
我一想,肯定是定时任务刷新比较合适啊,反正我已经接入了xxl-job了,新增一个定时任务不就完事了?

不过也有小伙伴说他们是第二种思路,如果发现access_token失效了,再重新获取并重试接口。我让他们来聊下为什么要这么干的时候,他们也说不出个所以然。(懂的老哥可以在评论区交流交流)


03、支持撤回和多种类型消息
在这个过程中,有的同学会给我留言,会问我是不是消息类型设计得有问题,只支持文本类型的:

其实并不是,在之前的文章提到了,接入渠道其实是个很枯燥的过程,很苦逼的过程。既然都被说到了,没办法,卷了几天把钉钉渠道的群机器人和工作消息官方所支持的所有消息类型都给写了。


又因为工作消息可能会发图片/语音/文件这种消息类型,而这些的消息类型需要把素材先发到钉钉,才能进行消息下发,所以我这边也已经写了素材上传的模块

在后端实现上,这块代码量并不大,因为整个架构都基本写好了,只要适配下参数调用接口下发就完事了,花了一周左右时间都在前端上了(:
前端要做联动,要根据不同的渠道不同的消息类型提交不同的参数格式到Java接口,真的写死我了。不过,逐渐把消息推送平台的功能完善,看到stars也在不断的提升,感觉还是不错的。
代码写得比较多的其实是在钉钉应用工作消息撤回这个功能上,在最开始设计接入层代码的时候,我用的是责任链设计模式。那时候我已经预留了可能会有某些请求走不同的责任链,所以会有code这个参数
/*** 发送/撤回接口的参数* @author 3y*/
@Data
@Accessors(chain = true)
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class SendRequest {
/*** 执行业务类型* send:发送消息* recall:撤回消息*/private String code;
/*** 消息模板Id* 【必填】*/private Long messageTemplateId;
/*** 消息相关的参数* 当业务类型为"send",必传*/private MessageParam messageParam;}
而对于消息撤回而言其实就是复用了责任链的其中两个节点,没有普通消息下发时的参数校验逻辑;后续其他渠道的消息撤回如果变化不大,则在这些节点上扩展。如果变化比较大,可能就要单独新增对应的责任链节点做统一的处理比较合适了。

/*** pipeline流程控制器* 后续扩展则加BusinessCode和ProcessTemplate* @return*/@Beanpublic ProcessController processController() {ProcessController processController = new ProcessController();Map<String, ProcessTemplate> templateConfig = new HashMap<>(4);templateConfig.put(BusinessCode.COMMON_SEND.getCode(), commonSendTemplate());templateConfig.put(BusinessCode.RECALL.getCode(), recallMessageTemplate());processController.setTemplateConfig(templateConfig);return processController;}
推荐项目
如果想学Java项目的,我还是强烈推荐我的开源项目消息推送平台Austin,可以用作毕业设计,可以用作校招,可以看看生产环境是怎么推送消息的。
开源项目消息推送平台austin仓库地址:
消息推送平台🔥推送下发【邮件】【短信】【微信服务号】【微信小程序】【企业微信】【钉钉】等消息类型。
- https://gitee.com/zhongfucheng/austin/
- https://github.com/ZhongFuCheng3y/austin
相关文章:
什么是钉钉消息推送?
我是3y,一年CRUD经验用十年的markdown程序员👨🏻💻常年被誉为职业八股文选手 在前阵子我就已经接入了钉钉的群机器人和工作消息推送,一直没写文章同步到给大家。 像这种接入渠道的工作,虽然我没接入过&…...
利用 NVIDIATAO 和 WeightBias 加速AI开发
利用 NVIDIATAO 和 Weight&Bias 加速AI开发 利用图像分类、对象检测、自动语音识别 (ASR) 和其他形式的 AI 可以推动公司和商业部门内部的大规模转型。 然而,从头开始构建人工智能和深度学习模型是一项艰巨的任务。 构建这些模型的一个共同先决条件是拥有大量高…...
token - 令牌
文章目录token - 令牌学前须知:1,base64 防君子不防小人2,SHA-256 安全散列算法的一种(hash)3,HMAC-SHA2564,RSA256 非对称加密2.1 JWT - json-web-token1,三大组成2,jwt…...
应用模型开发指南上新介绍
Module、HAP、Ability、AbilitySta-ge、Context……您是否曾经被这些搞不懂又绕不开的知识点困扰? 现在,全新的《应用程序包基础知识》及《应用模型开发指南》为您答疑解惑! 这里有您关注的概念解析、原理机制阐述,也有丰富的…...
Dbeaver连接Hive数据库操作指导
背景:由于工作需要,当前分析研究的数据基于Hadoop的Hive数据库中,且Hadoop服务端无权限进行操作且使用安全模式,在研究了Dbeaver、Squirrel和Hue三种连接Hive的工具,在无法绕开useKey认证的情况下,只能使用…...
【RabbitMQ笔记09】消息队列RabbitMQ之常见方法的使用
这篇文章,主要介绍消息队列RabbitMQ之常见方法的使用。 目录 一、消息队列常见方法 1.1、连接工厂ConnectionFactory 1.2、连接Connection 1.3、通道Channel 1.4、交换机相关方法 (1)exchangeDeclare()声明交换机 1.5、队列相关方法 …...
Linux字符设备驱动模型之设备号
从上文中可知,在Linux用户空间中,如若需要操作硬件设备,均通过/dev目录下的设备文件节点进行操作,基本上每一种设备都会存在一个或者多个的设备节点。 并且在Linux内核中,其表示字符设备的结构成员也提供了相应的设备号…...
C++多态原理
请看下面的程序,该程序演示了多态类对象存储空间的大小。 #include <iostream> using namespace std; class A {public:int i;virtual void func() {}virtual void func2() {} }; class B : public A {int j;void func() {} }; int main() {cout << si…...
PMP认证与NPDP认证哪个含金量高?
两个证涉及的领域不一样的,一个是项目管理,对应的是项目经理;一个是产品管理,对应的是产品经理。含金量不能相比,但在各自的领域的含金量是很高的,至少专业程度或者知名度是最高的。 我来分别说一下PMP认证…...
改进YOLOv7-Tiny系列:首发改进结合BiFPN结构的特征融合网络,网络融合更多有效特征,高效涨点
💡该教程为改进进阶指南,属于《芒果书》📚系列,包含大量的原创首发改进方式, 所有文章都是全网首发原创改进内容🚀 内容出品:CSDN博客独家更新 @CSDN芒果汁没有芒果 💡本篇文章 基于 YOLOv5、YOLOv7芒果改进YOLO系列:芒果改进YOLOv7-Tiny系列:首发改进结合BiFPN结…...
PPC Insights系列:洞见安全多方图联邦
开放隐私计算开放隐私计算开放隐私计算OpenMPC是国内第一个且影响力最大的隐私计算开放社区。社区秉承开放共享的精神,专注于隐私计算行业的研究与布道。社区致力于隐私计算技术的传播,愿成为中国 “隐私计算最后一公里的服务区”。183篇原创内容公众号知…...
SQLite注入记录(目前最全、核心函数用法、布尔盲注、时间盲注、webshell、动态库,绕过方式)
目录 与Mysql区别 全部核心函数 普通注入 查询所有列 查看所有表名...
Java简单的生成/解析二维码(zxing qrcode)
Hi I’m Shendi Java简单的生成/解析二维码(zxing qrcode) 在之前使用 qrcode.js 方式生成二维码,但在不同设备上难免会有一些兼容问题,于是改为后端(Java)生成二维码图片 这里使用 Google 的 zxing包 Jar…...
若依项目导出后端响应的Excel文件流处理
若依开源项目:http://doc.ruoyi.vip/ruoyi-vue 问题 前端 1. download.js 添加自定义方法 /*** 自定义方法:导出后端响应的 excel 文件流* param url 请求后端的接口地址 例如:"/downloadExcel"* param name 响应后的文件名称&…...
华为OD机试【独家】提供C语言题解 - 数组排序
最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧文章目录 最近更新的博客使用说明数组…...
JVM详解——内存结构
文章目录内存结构1、 运行时数据区2、虚拟机栈3、本地方法栈4、程序计数器5、 堆6、方法区7、运行时常量池8、内存溢出和内存泄漏9、 堆溢出内存结构 1、 运行时数据区 Java虚拟机在运行Java程序期间将管理的内存划分为不同的数据区,不同的区域负责不同的职能&…...
Jvisualvm监控Tomcat以及相关参数优化
Tomcat阻塞模式 阻塞模式(BIO) 客户端和服务器创建一个连接,它就会创建一个线程来处理这个连接,以为这客户端创建了几个连接,服务端就需要创建几个线程来处理你,导致线程会产生很多,有很多线程…...
界面组件DevExpress WinForms v22.2 - 全面升级数据展示功能
DevExpress WinForms拥有180组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜…...
正点原子第一期
ZYNQ是一个fpga用来硬件编程,外加一个软件编程 FPGA是可通过编程来修改其逻辑功能的数字集成电路 第三篇语法篇 第七章 verilog HDL语法 Verilog的简介 可编程逻辑电路:允许用户自行修改内部连接的集成电路,其内部的电路结构可以通过编程数…...
「mysql是怎样运行的」第24章 一条记录的多幅面孔---事务的隔离级别与MVCC
「mysql是怎样运行的」第24章 一条记录的多幅面孔—事务的隔离级别与MVCC 文章目录「mysql是怎样运行的」第24章 一条记录的多幅面孔---事务的隔离级别与MVCC一、事前准备二、事务的隔离级别事务并发执行遇到的问题SQL标准中的四种隔离级别MySQL中支持的四种隔离级别三、MVCC原…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
