一、前言
废话不多的实现简单的钉钉机器人。我们分为下面几个步骤来逐步讲解。
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; }}
参数 | 是否必填 | 类型 | 描述 |
msgtype | 是 | String | 目前只支持text |
content | 是 | String | 消息文本 |
msgId | 是 | String | 加密的消息ID |
createAt | 是 | String | 消息的时间戳,单位ms |
conversationType | 是 | String | 1-单聊、2-群聊 |
conversationId | 是 | String | 加密的会话ID |
conversationTitle | 否 | String | 会话标题(群聊时才有) |
senderId | 是 | String | 加密的发送者ID |
senderNick | 是 | String | 发送者昵称 |
senderCorpId | 否 | String | 发送者当前群的企业corpId(企业内部群有) |
senderStaffId | 否 | String | 发送者在企业内的userid(企业内部群有) |
chatbotUserId | 是 | String | 加密的机器人ID |
atUsers | 否 | Array | 被@人的信息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; }//@}
参数 | 是否必填 | 类型 | 描述 |
msgtype | 是 | String | text |
content | 是 | String | 消息文本 |
atMobiles | 否 | Array | 被@人的手机号 |
isAtAll | 否 | Boolean | @所有人是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条,超过的无法发送,钉钉会进行限流一段时间。