从零开始打造专属钉钉机器人

一、前言

废话不多的实现简单的钉钉机器人。我们分为下面几个步骤来逐步讲解。
1.钉钉机器人的类型
2.如何打造一个最最简单的钉钉机器人

二、钉钉机器人的类型

常用的钉钉机器人有两种,
1、通知类型的机器人:适合在群内进行一些通知,推荐消息等内容。
2、可以回复消息的机器人:能够回复@机器人的消息,机器人会将响应内容发送到群里。
本次,我们分别讲解两种机器人是如何实现的

三、打造一个最简单的通知类型钉钉机器人

首先用通知类型的机器人为例子。
1. 打开一个你想创建机器人的钉钉群。
2.在右边栏选择更多选项,点击群助手的打开:


然后选择添加机器人

选择自定义机器人

然后需要注意!在这个配置页面中。
安全设置我们选择【自定义关键词】
只要每次发送的消息带有该自定义关键词,消息就能成功发送。接下来选择同意并完成。

拷贝标记出来的完整链接【Webhook】,然后选择完成


钉钉机器人的配置就完成了。

3.第三步开始开始写代码:
直接上发起的示例代码:
apiurl 就是获取的完整链接【Webhook】

jsonString是发起的请求内容,json格式示例如下:

{"msgtype": "text",     //钉钉的发送样式"text": {"content": "我就是我, 是不一样的烟火@156xxxx8827"   //发送到群中的内容},"at": {      //需要消息@对应人的手机号"atMobiles": ["156xxxx8827","189xxxx8325"],"isAtAll": false   //如果需要@所有人 这个值设置为true}}

下面就是发送代码:

/// <summary>/// 以Post方式发送请求/// </summary>/// <param name="apiurl">请求的URL</param>/// <param name="jsonString">请求的json参数</param>/// <param name="headers">请求头的key-value字典</param>public static string PostDingDing(string jsonString, string apiurl = null, Dictionary<String, String> headers = null){if (apiurl == null){apiurl = AppSettings.WebHook;//机器人的webhook}WebRequest request = WebRequest.Create(@apiurl);request.Method = "POST";request.ContentType = "application/json";if (headers != null){foreach (var keyValue in headers){if (keyValue.Key == "Content-Type"){request.ContentType = keyValue.Value;continue;}request.Headers.Add(keyValue.Key, keyValue.Value);}}if (String.IsNullOrEmpty(jsonString)){request.ContentLength = 0;}else{byte[] bs = Encoding.UTF8.GetBytes(jsonString);request.ContentLength = bs.Length;Stream newStream = request.GetRequestStream();newStream.Write(bs, 0, bs.Length);newStream.Close();}WebResponse response = request.GetResponse();Stream stream = response.GetResponseStream();Encoding encode = Encoding.UTF8;StreamReader reader = new StreamReader(stream, encode);string resultJson = reader.ReadToEnd();return resultJson;}

好了,我们的钉钉机器人消息就发起成功了,如下图:

四、打造一个最简单的自动回复机器人

自动回复消息的机器人,能够回复@机器人的消息,机器人会将响应内容发送到群里。
该功能能够直接在钉钉中就实现简单的数据查询与交互。
接下来我们实现一个简单的自动回复机器人的例子。
1. 首先需要登陆钉钉开发者后台,创建一个机器人。
登录钉钉开发者后台,
选择应用开发-企业内部开发-机器人,点击创建机器人。

2.选择创建机器人:


选择应用类型是机器人,想一个机器人的名称等等,然后直接点击【确定创建】,机器人就创建好了。

3.机器人简易配置:

参数描述
服务器出口IP填写本企业服务器的公网IP
消息接收地址填写一个公网可访问的本企业HTTPS服务地址,用于接收POST过来的消息

只用配置如上两个参数。一个简单的机器人配置就完成了。

4.后端代码配置:
机器人配好了,但是目前还是调试模式,正式上线前,可以在测试群进行调试。

在测试群中,新增一个刚刚建好的机器人,保存好Webhook

5.接下来是代码了:
首先构建一个接收类

public class dingRotBotDto{public string msgtype { get; set; }public dingText text { get; set; }public string msgId { get; set; }public string createAt { get; set; }public string conversationType { get; set; }public string conversationId { get; set; }public string conversationTitle { get; set; }public string senderId { get; set; }public string senderNick { get; set; }public string senderCorpId { get; set; }public string senderStaffId { get; set; }public string chatbotUserId { get; set; }public List<dingUser> atUsers { get; set; }}public class dingText{public string content { get; set; }}public class dingUser{public string dingtalkId { get; set; }public string staffId { get; set; }}
参数是否必填类型描述
msgtypeString目前只支持text
contentString消息文本
msgIdString加密的消息ID
createAtString消息的时间戳,单位ms
conversationTypeString1-单聊、2-群聊
conversationIdString加密的会话ID
conversationTitleString会话标题(群聊时才有)
senderIdString加密的发送者ID
senderNickString发送者昵称
senderCorpIdString发送者当前群的企业corpId(企业内部群有)
senderStaffIdString发送者在企业内的userid(企业内部群有)
chatbotUserIdString加密的机器人ID
atUsersArray被@人的信息dingtalkId: 加密的发送者IDstaffId: 发送者在企业内的userid(企业内部群有)

然后构建一个返回消息类:

public class DingDingMessage{public DingDingMessage(){this.at = new At();this.text = new Text();this.markdown = new MarkDown();}public string msgtype { set; get; }//消息类型public Text text { set; get; }//text类型public MarkDown markdown { set; get; }//markdown类型public At at { set; get; }//@}
参数是否必填类型描述
msgtypeStringtext
contentString消息文本
atMobilesArray被@人的手机号
isAtAllBoolean@所有人是true,否则为false

现在开始写一个接收钉钉机器人消息的方法:

[HttpPost("GetDingRoBot")]public async Task<IActionResult> GetDingRoBot([FromBody] dingRotBotDto input){var phone=await _fuluDing.GetUserPhone(input.senderStaffId);//获取发送人的电话,回复消息的时候可以@对应的发送人。if (input.text.content.Contains("[XXXX]"))///input.text.content就是接受到的消息,  可以通过改字段进行消息过滤{var s = input.text.content.Split(']')[1];var text=await todo...;//调用自己的方法,返回需要回复的消息SendMessage(text, phone); //发送回复的消息}else{await SendMessage("请输入正确的命令:[流水上账查询]XXXX", phone);}return Ok(ResponseResult.Execute("0", null, $"发送成功"));}public  SendMessage(string text,string atMobiles)//发送消息{DingDingMessage message = new DingDingMessage();message.msgtype = "text";message.text.content = text;message.at.atMobiles.Add(atMobiles);String data = JsonConvert.SerializeObject(message);//Json将对象序列化var json = await _client.PostAsync("xxxxx", new StringContent(data, Encoding.UTF8, "application/json"));//post 发起一个请求到 配置该机器人群的 Webhook 地址xxxxx}

这样 ,一个可以回复消息的机器人就配置好了。我们可以试一试。

6.上线:

好了,当我们一切弄好就可以正式上线了

只要我们点击管理页面的上线。机器人就正式上线了。
文章的最后,顺带分享下几个踩坑问题
1.发起的消息中一定要带上【自定义关键词】的内容,不然发起不成功。
2.钉钉机器人发送消息有限制,1min最多20条,超过的无法发送,钉钉会进行限流一段时间。

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

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

相关文章

Azure 内容审查器之文本审查

内容审查器Azure 内容审查器也是一项认知服务。它支持对文本、图形、视频进行内容审核。可以过滤出某些不健康的内容&#xff0c;关键词。使你的网站内容符合当地的法律法规&#xff0c;提供更好的用户体验。文本内容审核其中文本内容的审核应用比较广泛。比如在审核游戏中的群…

java并发之CAS

文章目录1:何为CAS2:CAS图示3:CAS和Volatile的关系4:为何CAS效率更高一些5:CAS的特点7:受保护得共享数据类型(1):原子基本数据类型(2):原子引用数据类型7:ABA问题(1):什么是ABA(2):如何解决呢&#xff1f;1:何为CAS CAS(Compare And Swap)&#xff0c;即比较并交换。是解决多线…

快速了解 ASP.NET Core Blazor

最近在几个微信 .NET 交流群里大家讨论比较频繁的话题就是这几天自己的面试经历。面试官&#xff1a;“你刚说你喜欢研究新技术&#xff0c;那你有了解过 Blazor 吗&#xff1f;”作为一位专注于 .NET 开发的软件工程师&#xff0c;你好意思说你对 Blazor 一点也不解吗&#xf…

ASP.NET Core集成Nacos配置中心之适配多格式配置

前言 默认情况下&#xff0c;用nacos-sdk-csharp集成ASP.NET Core的配置系统&#xff0c;是基于JSON格式的数据。随着业务系统的多样化&#xff0c;可能用的配置格式也是各有千秋的。有的会用yaml/yml&#xff0c;有的会用ini&#xff0c;有的会用xml&#xff0c;等等。那么如果…

Git的使用(快速入门)

文章目录[TOC]一:将本地的项目提交到Git上二:GIt的基本操作1:建立一个本地仓库(1):类别(2):创建全新的仓库(3):克隆远程仓库2:查看文件的状态3:在桌面上的文件提交到远程仓库4:在idea中的文件提交到远程仓库5:分支(1):何为分支(2):常用命令(3)注意6:解决合并冲突(1):问题展示(2…

为什么这么忙,还依然做不好事情?

一直都很喜欢《重来》系列&#xff0c;最近出了《重来3&#xff1a;跳出疯狂的忙碌》&#xff0c;第一时间在微信读书中阅读了&#xff0c;让我们印象比较深刻的就是「冷静」和「效率」&#xff0c;本文主要说说效率的问题。书的作者是贾森弗里德&#xff08;Jason Fried&#…

开源特训营 - Lesson 6 - 如何提交一个合格的PR

编辑&#xff1a;李明康责编&#xff1a;袁睿斌作者&#xff1a;课程助教 - 苏斌主讲教师&#xff1a;张齐勋&#xff08;北京大学&#xff09;、赵生宇&#xff08;同济大学&#xff09;本次课程的主题为《如何提交一个合格的PR》&#xff0c;主讲者为来自北京大学的张齐勋老师…

改进程架构,Edge优化浏览器内存问题

微软 Edge 团队称&#xff0c;“今天的浏览器更像是操作系统&#xff0c;而不是文档查看器。用户正在浏览器中执行越来越多的任务&#xff0c;而在桌面应用程序中执行的任务越来越少。与此同时&#xff0c;每个网页、Web 应用程序和扩展程序都在使用内存&#xff0c;这也会使用…

中芯国际第二代FinFET工艺有望与2020年底试产

媒体报道&#xff0c;第一代FinFET 14纳米已于2019年四季度量产&#xff1b;第二代FinFET N1已进入客户导入阶段&#xff0c;可望于2020年底小批量试产。梁孟松披露&#xff0c;中芯国际的下一代N1工艺和14nm相比&#xff0c;性能提升了20%&#xff0c;功耗降低了57%&#xff0…

gRPC-微服务间通信实践

微服务间通信常见的两种方式由于微服务架构慢慢被更多人使用后&#xff0c;迎面而来的问题是如何做好微服务间通信的方案。我们先分析下目前最常用的两种服务间通信方案。gRPC&#xff08;rpc远程调用&#xff09;场景&#xff1a;A服务主动发起请求到B服务&#xff0c;同步方式…

移动 Azure 资源后如何快速修复 Dashboard

点击上方蓝字关注“汪宇杰博客”导语Azure 用户经常因为不够有钱&#xff0c;需要把资源移动到另一个资源组或订阅中。移动完成后&#xff0c;会导致资源对应的 Dashboard 失效。通常&#xff0c;我们都需要从 Dashboard 上将找不到的资源删除&#xff0c;并逐个重建。有没有快…

八大排序算法之插入排序

一:直接插入排序 1:思想 首先选择一个哨兵,我们默认将第一个数作为哨兵,随着循环的进行,我们一直将我们待插入数的前一个数作为哨兵然后就是插入的数与哨兵比较&#xff0c;比哨兵小的话&#xff0c;就将哨兵后移&#xff0c;然后再与哨兵前面的数进行比较&#xff0c;直到遇…

跟我一起学Redis之五种基本类型及其应用场景举例(干了6个小时)

前言来啦&#xff0c;老弟&#xff1f;来啦&#xff0c;上一篇就当唠唠嗑&#xff0c;接下来就开始进行实操撸命令&#xff0c;计划是先整体单纯说说Redis的各种用法和应用&#xff0c;最后再结合代码归纳总结。Redis默认有16个数据库(编号为0~15)&#xff0c;默认使用第0个&am…

leetcode周赛6070. 计算字符串的数字和

一:题目 二:上码 class Solution { public:/**思路:1.设置一个while循环&#xff0c;循环的条件是s.length<k2.while里面进行 1>:将字符串按k个进行拆分成个单个字符&#xff0c;并将其转换成数字,然后计算将计算结果再组成字符串 */string digitSum(string s, int k) {…

ASP.NET Core 中的 User Agent 识别及搜索引擎爬虫鉴定方法

User Agent中文名为用户代理&#xff0c;简称 UA&#xff0c;它是一个特殊字符串头&#xff0c;使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。百度百科在 ASP.NET Core 中&#xff0c;可以通过以下代码在 …

leetcode周赛6071. 完成所有任务需要的最少轮数

一:题目 二:上码 class Solution { public:/**思路:1.如果x1的话,那么的话 直接返回-12.如果x2的话&#xff0c;那么就一次执行3.如果x是3的倍数的话,那么就直接执行 x/3 次4.如果x/3 余数是1的话 那就执行 x/31,比方说是4 其实是两个2&#xff0c;但是我们求数的的时候,我们求…

netcore使用 jenkins + supervisor 实现standalone下多副本自动化发布

前面的文章聊过用 jenkins 做了一个简单的自动化发布&#xff0c;在shell中采用的是 BUILD_IDdontKillMe nohup dotnet xxx.dll & 这种简单的后台承载&#xff0c;如果你的业务量相对比较小&#xff0c;可以用这个方法玩一玩&#xff0c;但存在二个问题&#xff1a;1. 无法…

实战解读ASP.NET Core身份认证

长话短说&#xff1a;上文我们聊了 ASP.NET Core 基于声明的访问控制到底是什么鬼&#xff1f;今天我们乘胜追击&#xff1a;聊一聊ASP.NET Core 中的身份验证。身份验证是确定用户身份的过程。授权是确定用户是否有权访问资源的过程。1. 万变不离其宗显而易见&#xff0c;一个…

Java并发之AQS

文章目录一:AQS简介二:了解AQS 上锁和释放锁的原理1:前言2:上锁(非公平锁)(1):我们从main主函数中点进去(2):从lock进入(3):找到非公平锁中的lock(4):查看acquire()方法(5):查看tryAcquire(arg)方法a:前言介绍b:进入ReentrantLock类中的nonfairTryAcquire方法(6):addWaiter(Nod…

网络知识 | 《图解TCP/IP》读书笔记(上)

【网络知识】| 作者 / Edison Zhou这是EdisonTalk的第290篇原创内容作为一个专业的IT技术人&#xff0c;一个Web应用开发者&#xff0c;不了解网络基础和协议&#xff0c;怎么能行&#xff1f;本文是我2016年阅读《图解TCP/IP》一书的读书笔记&#xff0c;希望对你有所帮助&…