钉钉发送消息(非群机器人)

保姆式记录,亲测

一、钉钉的准备工作

首先进入钉钉的开发者后台 https://open.dingtalk.com/

应用开发—> 企业应用开发

进入之后选择创建应用

小程序和h5微应用都可以。这里只是把他们作为一个载体,只需要他们的一些对应信息就可以了,不需要前端进行开发对应的应用,如果前端想开发那也可以。

接下来就是点击自己创建的应用

最重要的就是下面的三个参数

AgentId

AppKey

AppSecret

这里的服务器出口ip地址,就是你本地服务器的公网地址,如果是本地测试不知道的话,后面调用钉钉接口,获得access_token 时候,会报错(某某地址不是白名单ip,这是你把他提示的地址放在下面就好了)

然后就是下面的权限管理

一般是全部员工,然后,你想调用那个接口就申请那个权限。如果你不知道申请那个权限可以再他的官方文档里找,那里有提示。

(建议不管是新旧API,找到符合你需求的即可)

因为这里是做的发送消息通知,那么就需要通讯录的权限,找到通讯录,把需要的都选了。

二、开发的准备工作

  1. 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>
  2. 配置文件(yml配置文件)

    dingtalk:    #钉钉--消息通知 agentId: 146xxxcsappKey: dingwxsssdcsappSecret: jHsdsBvsdsdsdccccsss

    这里需要的参数,在前面已经说了再那里找

  3. 配置类

    
    @Data
    @Configuration
    @ConfigurationProperties(prefix="dingtalk")
    public class DingTalkProperties {/*** AgentId*/private String agentId;/*** AppKey*/private String appKey;/*** AppSecret*/private String appSecret;}
  4. 工具类

    1. 首先获得对应的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;}
    2. 根据这个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;}
    3. 根据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;}
  5. 然后只要调用这里面的发送消息的方法就可以了,但是必须满足对应的参数。

    当前也可以使用其他方式的消息类型,我这边使用了最复杂的一个,因为业务需要。

三、总结

这里的所有方法都是从钉钉的调试里面进行修改的,可以直接现在钉钉的调试中进行调试,然后再把代码借鉴过来,然后进行修改,符合自己的需求就可以了。

(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

钉钉发送消息(非群机器人)相关推荐

  1. 【AIO】使用ORACLE数据库存储过程发送企业微信群机器人消息

    前言 为了对标阿里系的钉钉,腾讯于2016年4月18日推出了企业微信 专注企业内部通讯(目前已加入客户管理及客户通讯功能),替代原有的RTX腾讯通 企业微信由于微信的生态及其易用性,已被很多企业使用, ...

  2. python调用钉钉API发送消息

    #!/usr/bin/env python # -*- coding: utf-8 -*- # 2017-8-20 钉钉API发送消息import urllib, urllib2 import req ...

  3. https open api_钉钉API发送消息

    前言 Orchestrator有Call外部REST API/OPEN API的功能,利用钉钉开放的API,可以实现JDE内容转化成消息进行发送.此文档没有实现,只是整理如何Call API,这样在O ...

  4. 调用钉钉API发送消息通知给个人或部门 ,钉钉后台

    https://www.pianshen.com/article/22171673623/

  5. python微信群发_更新新年祝福群发!小白转战Python微信定时发送消息给群或是个人!...

    本帖最后由 新手小白学编程 于 2020-1-24 21:07 编辑 {:301_998:} 过年了发点祝福短信发现人太多了,老代码改一改直接定时群发走起! [Python] 纯文本查看 复制代码im ...

  6. python企业微信群聊_给企业微信加个群机器人

    现在很多企业在使用企业微信或钉钉进行工作交流,我们可以在群里添加一个自定义群机器人,定时发送一些提醒或咨询信息,它可以作为一个小组手,也为工作增加一点乐趣. 群机器人 下面是企业微信和钉钉的群机器人文 ...

  7. Java教程:如何对接自定义钉钉机器人并实现群聊消息发送

    正文: 钉钉对机器人提供了多种使用场景,但目前我们只针对群聊消息的发送,@所有 或 @某某 以实现目的,此场景只需实现自定义机器人介入即可! 这是官方介绍: 点击此处直达 **自定义机器人支持5种消息 ...

  8. python钉钉机器人发送excel附件_Python自动化办公|如何在钉钉上自动发送定制消息或通知给同事...

    日常工作中,你是否遇到以下情形: 想要第一时间获悉竞品app的最新版本的更新内容 想要监测行业最新资讯,并与同事分享 想要对某些业务数据进行阈值监控及报警 想要将同事在钉钉上反馈的问题自动同步到jir ...

  9. python 使用钉钉机器人发送消息至钉钉

    如果你在使用钉钉,并且经常需要发送某些消息到钉钉群中,例如在监控某些数据,当出现异常的时候,及时发送消息通知钉钉群:或者在完成某些操作,发送消息到钉钉群中,那么我们可以使用钉钉机器人,实现自动化信息同 ...

最新文章

  1. 20+ 家标杆车企实践总结,数字化转型的秘诀都在这儿
  2. 对管理学的认识 知乎摘抄
  3. linux环境编程 学习,学习linux环境高级编程首先学习的是文件的操作。因为有.pdf...
  4. 关于JavaScript,这10条血与泪的建议大家一定要看
  5. 课程学习:程序设计与算法
  6. Android设计模式之——中介者模式
  7. java word转图片tiff_Word 2010中将文档保存为TIFF图片的方法
  8. 思科路由器端口映射配置实例
  9. linux下.a/.so/.la目标库区别-转
  10. JavaScript-bind-call-apply改变this指向
  11. Nacos教程_2 讲解
  12. 【IoT】 产品研发:位深为1的BMP格式图片详解
  13. mysql主键约束(primary key)
  14. Coloring Torus(Atcoder Grand Contest 030 C)
  15. 数据库面试复习_数据科学面试复习
  16. jQuery实现 自动滚屏操作
  17. 《寒江独钓》内核学习笔记(1)-- IRP - .Little Hann
  18. linux解压7z文件,linux 中解压7z文件
  19. 防复制防破解小区门禁梯控升级非联网CPU卡脱机写卡门禁梯控一卡通系统92HID623CPU V5.00操作说明之软件功能说明
  20. Egret 2d 实现黑暗下光照效果

热门文章

  1. 唐纳德和他的数学老师
  2. (swing读书笔记)Swing Look And Feel(3)
  3. Window cmd
  4. 数学之美11--拼音输入法的数学原理
  5. ROS----小乌龟画爱心
  6. Android的Google地图开发
  7. CSDN,我的良师益友
  8. [蓝桥杯python] 无聊的逗:逗志芃在干了很多事情后终于闲下来了,然后就陷入了深深的无聊中。不过他想到了一个游戏来使他更无聊。他拿出n个木棍,然后选出其中一些粘成一根长的,然后再选一些粘成另一个长
  9. 计算机网络部分复习题
  10. swagger no content