钉钉发送消息(非群机器人)
钉钉发送消息(非群机器人)
保姆式记录,亲测
一、钉钉的准备工作
首先进入钉钉的开发者后台 https://open.dingtalk.com/
应用开发—> 企业应用开发
进入之后选择创建应用
小程序和h5微应用都可以。这里只是把他们作为一个载体,只需要他们的一些对应信息就可以了,不需要前端进行开发对应的应用,如果前端想开发那也可以。
接下来就是点击自己创建的应用
最重要的就是下面的三个参数
AgentId
AppKey
AppSecret
这里的服务器出口ip地址,就是你本地服务器的公网地址,如果是本地测试不知道的话,后面调用钉钉接口,获得access_token 时候,会报错(某某地址不是白名单ip,这是你把他提示的地址放在下面就好了)
然后就是下面的权限管理
一般是全部员工,然后,你想调用那个接口就申请那个权限。如果你不知道申请那个权限可以再他的官方文档里找,那里有提示。
(建议不管是新旧API,找到符合你需求的即可)
因为这里是做的发送消息通知,那么就需要通讯录的权限,找到通讯录,把需要的都选了。
二、开发的准备工作
pom的导入
<!-- 钉钉 --><dependency><groupId>com.aliyun</groupId><artifactId>dingtalk</artifactId><version>1.2.15</version></dependency><dependency><groupId>com.aliyun</groupId><artifactId>alibaba-dingtalk-service-sdk</artifactId><version>2.0.0</version></dependency>
配置文件(yml配置文件)
dingtalk: #钉钉--消息通知 agentId: 146xxxcsappKey: dingwxsssdcsappSecret: jHsdsBvsdsdsdccccsss
这里需要的参数,在前面已经说了再那里找
配置类
@Data @Configuration @ConfigurationProperties(prefix="dingtalk") public class DingTalkProperties {/*** AgentId*/private String agentId;/*** AppKey*/private String appKey;/*** AppSecret*/private String appSecret;}
工具类
首先获得对应的access_token
/*** @date 2022/2/15 10:31* 钉钉发送消息工具类*/ @Slf4j @Component @AllArgsConstructor public class DingTalkUtil {private final DingTalkProperties dingTalkProperties;/*** 使用钉钉自带的方法去获取通行证* 获取钉钉的token** @return access_token*/public String getAccessToken() {try {DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");OapiGettokenRequest request = new OapiGettokenRequest();request.setAppkey(dingTalkProperties.getAppKey());request.setAppsecret(dingTalkProperties.getAppSecret());request.setHttpMethod("GET");OapiGettokenResponse response = client.execute(request);return response.getAccessToken();} catch (ApiException e) {log.error("请求获取钉钉的access_token失败:{}", e.getErrMsg());}return null;}
根据这个access_token就是获得了对应的接口凭证,现在根据api
根据用户电话获得钉钉的userId
/*** 使用钉钉自带的方法,获取钉钉的用户的userid** @param phone 用户电话* @return 钉钉用户内部userId*/public String getDingTalkUserId(String phone) {String accessToken = this.getAccessToken();if (accessToken == null) {throw new CiErrorException(63001, "钉钉出现异常,没有获取到对应的access_token,请联系管理员进行检查!");}try {DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/getbymobile");OapiV2UserGetbymobileRequest req = new OapiV2UserGetbymobileRequest();req.setMobile(phone);OapiV2UserGetbymobileResponse rsp = client.execute(req, accessToken);//把userId存入数据库,这里的userId是不变的,可以存入数据库String userId = rsp.getResult().getUserid();return userId;} catch (ApiException e) {log.error("请求获取钉钉用户的userid失败:{}", e.getErrMsg());}return null;}
根据userId可以发送消息
这里采用的是工作消息(消息类型是oa)
/*** 多条发送消息* 钉钉发送工作通知(oa)* 注意请求接口的时候的参数配置,这里采用的是发送oa消息* 钉钉接口文档地址:https://open.dingtalk.com/document/orgapp-server/asynchronous-sending-of-enterprise-session-messages** @param userIdList 钉钉内部用户id列表,多个用户id用 ' ,' 分割* @param msgVO 内容(类型不同内容不同)*/public void sendDingTalkMsg(String userIdList, MsgVO msgVO) {String accessToken = this.getAccessToken();if (accessToken == null) {throw new CiErrorException(63001, "钉钉出现异常,没有获取到对应的access_token,请联系管理员进行检查!");}try {DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2");OapiMessageCorpconversationAsyncsendV2Request req = new OapiMessageCorpconversationAsyncsendV2Request();req.setAgentId(Long.parseLong(dingTalkProperties.getAgentId()));req.setUseridList(userIdList);//设置消息发送类型OapiMessageCorpconversationAsyncsendV2Request.Msg msg = new OapiMessageCorpconversationAsyncsendV2Request.Msg();msg.setMsgtype("oa");//设置跳转链接OapiMessageCorpconversationAsyncsendV2Request.OA oa = new OapiMessageCorpconversationAsyncsendV2Request.OA();oa.setPcMessageUrl(msgVO.getPcMessageUrl());oa.setMessageUrl(msgVO.getMessageUrl());//设置消息主题OapiMessageCorpconversationAsyncsendV2Request.Body body = new OapiMessageCorpconversationAsyncsendV2Request.Body();//设置作者body.setAuthor("xxxx");//设置通知消息标题body.setTitle(msgVO.getTitle());//设置表单内容body.setForm(this.setMsgForm(msgVO.getFormVOList()));oa.setBody(body);//设置状态提示栏OapiMessageCorpconversationAsyncsendV2Request.StatusBar statusBar = new OapiMessageCorpconversationAsyncsendV2Request.StatusBar();//设置状态提示颜色statusBar.setStatusBg("0xFFF65E5E");//设置状态提示内容statusBar.setStatusValue(msgVO.getStatusContent());oa.setStatusBar(statusBar);//设置头部内容OapiMessageCorpconversationAsyncsendV2Request.Head head = new OapiMessageCorpconversationAsyncsendV2Request.Head();head.setBgcolor("0xFFF65E5E");oa.setHead(head);msg.setOa(oa);req.setMsg(msg);OapiMessageCorpconversationAsyncsendV2Response rsp = client.execute(req, accessToken);} catch (ApiException e) {log.error("发送钉钉消息失败:{}", e.getErrMsg());}}/*** 设置发送消息的表单** @param list 消息表单* @return 处理表单*/private List<OapiMessageCorpconversationAsyncsendV2Request.Form> setMsgForm(List<FormVO> list) {List<OapiMessageCorpconversationAsyncsendV2Request.Form> formList = new ArrayList<>(7);for (FormVO formVO : list) {OapiMessageCorpconversationAsyncsendV2Request.Form form = new OapiMessageCorpconversationAsyncsendV2Request.Form();form.setKey(formVO.getKey());form.setValue(formVO.getValue());formList.add(form);}return formList;}
这里对应的vo
import lombok.Data;/*** @author zwh* @date 2022/2/15 20:21* 钉钉发送消息表单实体类** 钉钉最多展示是6个,多的就会折叠不显示*/ @Data public class FormVO {/*** 键*/private String key;/*** 值*/private String value; }
import lombok.Data;import java.util.List;/*** @date 2022/2/15 20:35* 钉钉发送消息实体类*/ @Data public class MsgVO {/*** 移动端跳转url*/private String messageUrl;/*** PC端跳转url*/private String pcMessageUrl;/*** body参数中的正文标题*/private String title;/*** body参数中的表单数据*/private List<FormVO> formVOList;/*** 状态提示消息*/private String statusContent;}
然后只要调用这里面的发送消息的方法就可以了,但是必须满足对应的参数。
当前也可以使用其他方式的消息类型,我这边使用了最复杂的一个,因为业务需要。
三、总结
这里的所有方法都是从钉钉的调试里面进行修改的,可以直接现在钉钉的调试中进行调试,然后再把代码借鉴过来,然后进行修改,符合自己的需求就可以了。
(1)、获取企业内部的access_token https://open.dingtalk.com/document/orgapp-server/obtain-orgapp-token
(2)、根据用户phone获得userId https://open.dingtalk.com/document/orgapp-server/query-users-by-phone-number
(3)、发送工作通知 https://open.dingtalk.com/document/orgapp-server/asynchronous-sending-of-enterprise-session-messages
消息类型 https://open.dingtalk.com/document/orgapp-server/message-types-and-data-format
一定要好好的阅读钉钉的接口文档,并且使用他们的原生方法,节省时间(自己能力不足,所以直接那人家的方法用)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ItIm7NeO-1645434398518)(C:\Users\Yuki\AppData\Roaming\Typora\typora-user-images\image-20220221170307997.png)]
ment/orgapp-server/query-users-by-phone-number>
(3)、发送工作通知 https://open.dingtalk.com/document/orgapp-server/asynchronous-sending-of-enterprise-session-messages
消息类型 https://open.dingtalk.com/document/orgapp-server/message-types-and-data-format
一定要好好的阅读钉钉的接口文档,并且使用他们的原生方法,节省时间(自己能力不足,所以直接那人家的方法用)
注意: 这里的消息不会发送重复消息,比如你把一条消息发给三个人,但是你在把这样的消息发给其他的四个人,那么这后面的四个人是收不到消息的,因为钉钉任务你在发送重复消息。
资源连接 https://download.csdn.net/download/zhuwenaptx/81739940
钉钉发送消息(非群机器人)相关推荐
- 【AIO】使用ORACLE数据库存储过程发送企业微信群机器人消息
前言 为了对标阿里系的钉钉,腾讯于2016年4月18日推出了企业微信 专注企业内部通讯(目前已加入客户管理及客户通讯功能),替代原有的RTX腾讯通 企业微信由于微信的生态及其易用性,已被很多企业使用, ...
- python调用钉钉API发送消息
#!/usr/bin/env python # -*- coding: utf-8 -*- # 2017-8-20 钉钉API发送消息import urllib, urllib2 import req ...
- https open api_钉钉API发送消息
前言 Orchestrator有Call外部REST API/OPEN API的功能,利用钉钉开放的API,可以实现JDE内容转化成消息进行发送.此文档没有实现,只是整理如何Call API,这样在O ...
- 调用钉钉API发送消息通知给个人或部门 ,钉钉后台
https://www.pianshen.com/article/22171673623/
- python微信群发_更新新年祝福群发!小白转战Python微信定时发送消息给群或是个人!...
本帖最后由 新手小白学编程 于 2020-1-24 21:07 编辑 {:301_998:} 过年了发点祝福短信发现人太多了,老代码改一改直接定时群发走起! [Python] 纯文本查看 复制代码im ...
- python企业微信群聊_给企业微信加个群机器人
现在很多企业在使用企业微信或钉钉进行工作交流,我们可以在群里添加一个自定义群机器人,定时发送一些提醒或咨询信息,它可以作为一个小组手,也为工作增加一点乐趣. 群机器人 下面是企业微信和钉钉的群机器人文 ...
- Java教程:如何对接自定义钉钉机器人并实现群聊消息发送
正文: 钉钉对机器人提供了多种使用场景,但目前我们只针对群聊消息的发送,@所有 或 @某某 以实现目的,此场景只需实现自定义机器人介入即可! 这是官方介绍: 点击此处直达 **自定义机器人支持5种消息 ...
- python钉钉机器人发送excel附件_Python自动化办公|如何在钉钉上自动发送定制消息或通知给同事...
日常工作中,你是否遇到以下情形: 想要第一时间获悉竞品app的最新版本的更新内容 想要监测行业最新资讯,并与同事分享 想要对某些业务数据进行阈值监控及报警 想要将同事在钉钉上反馈的问题自动同步到jir ...
- python 使用钉钉机器人发送消息至钉钉
如果你在使用钉钉,并且经常需要发送某些消息到钉钉群中,例如在监控某些数据,当出现异常的时候,及时发送消息通知钉钉群:或者在完成某些操作,发送消息到钉钉群中,那么我们可以使用钉钉机器人,实现自动化信息同 ...
最新文章
- 20+ 家标杆车企实践总结,数字化转型的秘诀都在这儿
- 对管理学的认识 知乎摘抄
- linux环境编程 学习,学习linux环境高级编程首先学习的是文件的操作。因为有.pdf...
- 关于JavaScript,这10条血与泪的建议大家一定要看
- 课程学习:程序设计与算法
- Android设计模式之——中介者模式
- java word转图片tiff_Word 2010中将文档保存为TIFF图片的方法
- 思科路由器端口映射配置实例
- linux下.a/.so/.la目标库区别-转
- JavaScript-bind-call-apply改变this指向
- Nacos教程_2 讲解
- 【IoT】 产品研发:位深为1的BMP格式图片详解
- mysql主键约束(primary key)
- Coloring Torus(Atcoder Grand Contest 030 C)
- 数据库面试复习_数据科学面试复习
- jQuery实现 自动滚屏操作
- 《寒江独钓》内核学习笔记(1)-- IRP - .Little Hann
- linux解压7z文件,linux 中解压7z文件
- 防复制防破解小区门禁梯控升级非联网CPU卡脱机写卡门禁梯控一卡通系统92HID623CPU V5.00操作说明之软件功能说明
- Egret 2d 实现黑暗下光照效果