zoukankan      html  css  js  c++  java
  • 从零开始打造专属钉钉机器人

    一、前言

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

    二、钉钉机器人的类型

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

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

    首先用通知类型的机器人为例子。
    1. 打开一个你想创建机器人的钉钉群。
    2.在右边栏选择更多选项,点击群助手的打开:
    37B7EE90-7FBF-46d3-9530-18ECC3CE3DFC
    然后选择添加机器人
    D15FAB5C-16C4-4294-96E0-96E9280F73CD

    选择自定义机器人

    A1405494-506A-4dc8-8955-C699DB24502F

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

    拷贝标记出来的完整链接【Webhook】,然后选择完成
    7840AC4C-22E9-4126-8182-F6A171AB8B4F
    钉钉机器人的配置就完成了。

    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;
            }
    

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

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

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

    2.选择创建机器人:
    487B9865-4298-4806-B360-79B0AB79049D
    选择应用类型是机器人,想一个机器人的名称等等,然后直接点击【确定创建】,机器人就创建好了。

    3.机器人简易配置:
    810D1400-A778-4a96-A0D2-0D4CFDD01F22

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

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

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

    在测试群中,新增一个刚刚建好的机器人,保存好Webhook
    D158AEC6-9AA5-4d40-BEAD-17C87E3E0248

    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
            }
    
    

    D158AEC6-9AA5-4d40-BEAD-17C87E3E0248

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

    DABE1809-942B-41c6-87D1-886A97798C80

    6.上线:

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

    889E6980-D18E-43df-9225-179656B816AF

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

    福禄ICH·ERP项目部 福小智
  • 相关阅读:
    SP338 ROADS
    [Usaco2008 Mar]牛跑步
    [Cerc2005]Knights of the Round Table
    [Poi2005]Piggy Banks小猪存钱罐
    Pku1236 Network of Schools
    PKU2186 Popular Cows 受欢迎的牛
    黑暗城堡
    入门OJ:最短路径树入门
    Sqli-labs
    Sqli-labs
  • 原文地址:https://www.cnblogs.com/fulu/p/13749745.html
Copyright © 2011-2022 走看看