從零開始打造專屬釘釘機器人


一、前言

廢話不多的實現簡單的釘釘機器人。我們分為下面幾個步驟來逐步講解。
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項目部 福小智


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM