钉钉作为企业办公越来越常用的软件,对于企业内部自研系统提供接口支持,以此来打通多平台下的数据,本次先使用最简单的钉钉群机器人完成多种形式的消息推送,参考钉钉开发文档中自定义机器人环节,此次尝试所花的时间不多,但有几个地方是需要注意的。

  

一、钉钉群中建立机器人获取WebHook地址

  首先得有一个钉钉群,如果没有得自行创建一个了,通过群内右上角菜单中找到群机器人然后添加一个自定义机器人

  

  并设置消息推送开启(默认是开启),复制下一行的webhook地址,该地址将作为后面消息推送的地址

  

  完成即可,如果不确定该地址是否有效可以用命令测试一下,比如在Linux平台下,通过该命令并将自己的webhook_token替换

  1. curl 'https://oapi.dingtalk.com/robot/send?access_token=cd1eb120c459ced6a65491af7b1eebbc84790fb672077a969bae8bb203aa1c52' \
  2. -H 'Content-Type: application/json' \
  3. -d '
  4. {"msgtype": "text",
  5. "text": {
  6. "content": "我就是我, 是不一样的烟火"
  7. }
  8. }'

  然后回车进行测试,即刻收到群机器人推送的消息  

  

二、参考文档完成基础类的封装并处理相关字段

  接下来开始在代码中完成对WebHook地址的调用,可以先分析一下群机器人的文档,可以获悉有五种消息类型:文本 (text)、连接 (link)、markdown (markdown)、ActionCard、FeedCard消息类型,其中的actionCard分整体和独立两类。针对这些类型及给出的参数要求完成基础类的设计和封装,以text类型为例:

  

  其中的msgtype是五种消息类型的字符串,因此针对该部分设计一个枚举,作为消息类型的区分。

  1. /// <summary>
  2. /// 钉钉群机器人消息类型枚举
  3. /// </summary>
  4. public enum MsgTypeEnum
  5. {
  6. text,
  7. link,
  8. markdown,
  9. actionCard,
  10. feedCard
  11. }

  设计一个text类并给定一个属性Content,在设计时我们喜欢使用帕斯卡命名法,但是钉钉接口却不允许,如果不做一些处理,直接使用Content属性将会调用不通接口,这点需要注意,使用Newtonjson提供的打包成json时用指定的名称替换来满足钉钉接口需求。

  1. /// <summary>
  2. /// 文本类型
  3. /// </summary>
  4. public class Text
  5. {
  6. /// <summary>
  7. /// 文本内容
  8. /// </summary>
  9. [JsonProperty(PropertyName = "content")]
  10. public string Content { get; set; }
  11. }

  其次对指定人群做一个类的封装,同样需要处理其中的属性在序列化时的替换名称。

  1. /// <summary>
  2. /// @指定人
  3. /// </summary>
  4. public class At
  5. {
  6. /// <summary>
  7. /// @的联系人
  8. /// </summary>
  9. [JsonProperty(PropertyName = "atMobiles")]
  10. public List<string> AtMobiles { set; get; }
  11.  
  12. /// <summary>
  13. /// 是否@所有人
  14. /// </summary>
  15. [JsonProperty(PropertyName = "isAtAll")]
  16. public bool IsAtAll { set; get; }
  17. }

  通过分析五种消息类型,其中的一些参数可以完成共用,对自定义钉钉机器人文档的一系列挖掘后,确定了这几个类和枚举

  

  接下来可以完成对机器人调用了并使用不同消息类型推送到钉钉群中。

三、完成对钉钉群机器人的调用

  首先在ConfigureService方法中完成对HttpClientFactory的注入

  

  本次直接在Asp.Net Core WebApi下完成机器人的调用,新建一个DingTalk的控制器,然后完成对IHttpClientFactory的注入工作,便开始接下来的服务调用了,对于钉钉的WebHook_Token的存放可以选择配置文件或是如果只是尝试,可以直接用一个变量保存即可。

  1. /// <summary>
  2. /// 发送钉钉消息接口
  3. /// </summary>
  4. [Route("api/[controller]")]
  5. [ApiController]
  6. public class DingTalkController : ControllerBase
  7. {
  8. private readonly string WebHook_Token = "https://oapi.dingtalk.com/robot/send?access_token=cd1eb120c459ced6a65491af7b1eebbc84790fb672077a969bae8bb203aa1c52";
  9.  
  10. private readonly IHttpClientFactory _httpClientFactory;
  11.  
  12. public DingTalkController(IHttpClientFactory httpClientFactory)
  13. {
  14. _httpClientFactory = httpClientFactory;
  15. }
  16. }

  再次以text文本为例并完成文本消息的推送,建立一个action,用来发送文本消息,在其中完成对钉钉接口需要参数的组装工作,最终使用统一的发送方法完成消息推送。

  1. /// <summary>
  2. /// 调用钉钉机器人发送文本内容
  3. /// </summary>
  4. /// <returns></returns>
  5. [HttpGet]
  6. [Route(nameof(TextContent))]
  7. public async Task<ActionResult> TextContent()
  8. {
  9. //消息类型
  10. var msgtype = MsgTypeEnum.text.ToString();
  11.  
  12. //文本内容
  13. var text = new Text
  14. {
  15. Content = "看万山红遍,层林尽染;漫江碧透,百舸争流@15675120617"
  16. };
  17.  
  18. //指定目标人群
  19. var at = new At()
  20. {
  21. AtMobiles = new List<string>() { "" },
  22. IsAtAll = false
  23. };
  24.  
  25. var response = await SendDingTalkMessage(new { msgtype, text, at });
  26.  
  27. return Ok(response);
  28. }

  对于发送方法内需要根据钉钉文档的一些要求完成设计,如文档指明需要使用Post提交请求并使用UTF8编码,我直接在控制器内新建了一个方法(尽管不太合理),首先对内容进行序列化并封装,然后通过HttpClientFactory新建client并完成发送消息。

  1. /// <summary>
  2. /// 执行发送消息
  3. /// </summary>
  4. /// <param name="sendMessage"></param>
  5. /// <returns></returns>
  6. private async Task<HttpResponseMessage> SendDingTalkMessage(object value)
  7. {
  8. var sendMessage = JsonConvert.SerializeObject(value);
  9.  
  10. var request = new HttpRequestMessage(HttpMethod.Post, WebHook_Token)
  11. {
  12. //钉钉文档需指定UTF8编码
  13. Content = new StringContent(sendMessage, Encoding.UTF8, "application/json")
  14. };
  15.  
  16. var client = _httpClientFactory.CreateClient();
  17. var response = await client.SendAsync(request);
  18.  
  19. return response;
  20. }

  启动程序并通过url访问控制器内的相应方法完成消息推送,注意各属性的命名方式或通过特性转换后的命名方式需要满足钉钉接口文档(文档中FeedCard类型后两个参数不太标准)。

  

  仓库地址:https://gitee.com/530521314/Partner.TreasureChest/tree/master/DingTalk(已切换到该地址,文章中的部分代码与该地址中有所偏差,进行了更改)

 欢迎关注微信订阅号,有新的文章将同步到订阅号中

 

  1. 2019-03-02,望技术有成后能回来看见自己的脚步

Asp.Net Core对接钉钉群机器人的更多相关文章

  1. ASP.NET Core使用Docker-Swarm集群部署实现负载均衡实战演练

    一.需求背景 人生苦短,我用.NET Core!阿笨对Docker是这样评价的:Docker在手,环境我有!Docker出手,集群我有!前面的Doc基础课程我们学习了如何使用Docker来部署搭建单机 ...

  2. asp.net core 负载均衡集群搭建(centos7+nginx+supervisor+kestrel)

    概述 本文目的是搭建三台asp.net core 集群, 并配上 nginx做负载均衡   首先准备要运行的源码 http://pan.baidu.com/s/1c20x0bA 准备三台服务器(或则虚 ...

  3. 实战中的asp.net core结合Consul集群&Docker实现服务治理

    0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 一.前言 在写这篇文章之前,我看了很多关于consul的服务治理,但发现基本上都是直接在powershell或者以命令工具的方式在 ...

  4. 关于ASP.NET Core WebSocket实现集群的思考

    前言 提到WebSocket相信大家都听说过,它的初衷是为了解决客户端浏览器与服务端进行双向通信,是在单个TCP连接上进行全双工通讯的协议.在没有WebSocket之前只能通过浏览器到服务端的请求应答 ...

  5. Asp.Net Core&钉钉开发系列

    阿里钉钉在商业领域的规模越来越大,基于钉钉办公的企业越来越多,将一个企业内现有用到的工具(如钉钉)能够更融入到他们的工作中,提高工作效率,那便需要开发者不断的学习.应用了,同时,个人也有一个预感,未来 ...

  6. nodejs通过钉钉群机器人推送消息

    nodejs 通过钉钉群机器人推送消息 Intro 最近在用 nodejs 写爬虫,之前的 nodejs 爬虫代码用 js 写的,感觉可维护性太差,也没有智能提示,于是把js改用ts(typescri ...

  7. Zabbix通过与微信、钉钉整合实现实时告警

    abbix可以通过多种方式把告警信息发送到指定人,常用的有邮件,短信报警方式,但是越来越多的企业开始使用zabbix结合微信.钉钉作为主要的告警方式,这样可以及时有效的把告警信息推送到接收人,方便告警 ...

  8. ASP.NET Core 2.0 支付宝当面付之扫码支付

    前言 自从微软更换了CEO以后,微软的战略方向有了相当大的变化,不再是那么封闭,开源了许多东西,拥抱开源社区,.NET实现跨平台,收购xamarin并免费提供给开发者等等.我本人是很喜欢.net的,并 ...

  9. asp.net core 二 Nginx Supervisor 负载,监听

           ASP.NET Core负载均衡集群搭建(CentOS7+Nginx+Supervisor+Kestrel)          asp.net core在linux运行下,一但命令行退出 ...

随机推荐

  1. C#文件和字节流的转换方法

    1.读取文件,并转换为字节流 FileStream fs = new FileStream(filename,FileMode.Open,FileAccess.Read); byte[] infbyt ...

  2. 详解Java的Spring框架中的注解的用法

    转载:http://www.jb51.net/article/75460.htm 1. 使用Spring注解来注入属性 1.1. 使用注解以前我们是怎样注入属性的 类的实现: class UserMa ...

  3. string to int

    problem describe: given a string , first find the first word which is not white space;then there wil ...

  4. [ Java面试题 ] 框架篇

    1.谈谈你对Struts的理解. 1. struts是一个按MVC模式设计的Web层框架,其实它就是一个Servlet,这个Servlet名为ActionServlet,或是ActionServlet ...

  5. 三级菜单python写法(递归写法)

    数据结构: menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, 'google':{} }, '中关村':{ '爱奇艺':{}, '汽车之家':{}, ...

  6. python new和init知识点

    __new__ 方法是什么?如果将类比喻为工厂,那么__init__()方法则是该工厂的生产工人,__init__()方法接受的初始化参 数则是生产所需原料,__init__()方法会按照方法中的语句 ...

  7. 使用VirtualBox调试项目踩过的坑

    当我们完成项目后 通常需要做其他系统的测试 例如win10下测试完成后要在win7中测试 这时,安装一个虚拟机是较为明智的选择 本文将讲述在使用虚拟机测试Unity发布的exe(所有的3D文件都适用) ...

  8. Spring+Mybatis多数据源的一种实现方式,支持事务

    最近一个项目用到了多个数据库,所以需要实现动态切换数据源来查询数据,http://www.cnblogs.com/lzrabbit/p/3750803.html这篇文章让我受益匪浅,提供了一种自动切换 ...

  9. 网络营销行业十大看了就想吐的“滥词”

    网络营销行业在国内的互联网界已"猖獗"数年之久,它是一个让企业爱让用户恨的行业.有互联网的地方,就有网络营销的机会,有了机会就有了相关产业的存在,只不过是业大业小的问题.但是随着互 ...

  10. USB/GPIO/SDIO

    通用串行总线(英语:Universal Serial Bus,缩写:USB)是连接计算机系统与外部设备的一种串口总线标准,也是一种输入输出接口的技术规范.它只有4根线,两个电源(5V,地线),两个数据 ...