一、前言

废话不多的实现简单的钉钉机器人。我们分为下面几个步骤来逐步讲解。
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条,超过的无法发送,钉钉会进行限流一段时间。

福禄ICH·ERP项目部
福小智