1. 程式人生 > >從零開始打造專屬釘釘機器人

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

### 一、前言 廢話不多的實現簡單的釘釘機器人。我們分為下面幾個步驟來逐步講解。 1.釘釘機器人的型別 2.如何打造一個最最簡單的釘釘機器人 ### 二、釘釘機器人的型別 常用的釘釘機器人有兩種, 1、通知型別的機器人:適合在群內進行一些通知,推薦訊息等內容。 2、可以回覆訊息的機器人:能夠回覆@機器人的訊息,機器人會將響應內容傳送到群裡。 本次,我們分別講解兩種機器人是如何實現的 ### 三、打造一個最簡單的通知型別釘釘機器人 首先用通知型別的機器人為例子。 __1. 開啟一個你想建立機器人的釘釘群。__ __2.在右邊欄選擇更多選項,點選群助手的開啟:__ ![37B7EE90-7FBF-46d3-9530-18ECC3CE3DFC](https://fulu-item11-zjk.oss-cn-zhangjiakou.aliyuncs.com/images/37B7EE90-7FBF-46d3-9530-18ECC3CE3DFC.png) 然後選擇新增機器人 ![D15FAB5C-16C4-4294-96E0-96E9280F73CD](https://fulu-item11-zjk.oss-cn-zhangjiakou.aliyuncs.com/images/D15FAB5C-16C4-4294-96E0-96E9280F73CD.png) 選擇自定義機器人 ![A1405494-506A-4dc8-8955-C699DB24502F](https://fulu-item11-zjk.oss-cn-zhangjiakou.aliyuncs.com/images/A1405494-506A-4dc8-8955-C699DB24502F.png) 然後需要注意!在這個配置頁面中。 安全設定我們選擇【自定義關鍵詞】 只要每次傳送的訊息帶有該自定義關鍵詞,訊息就能成功傳送。接下來選擇同意並完成。 ![A4C5C025-556D-4456-88BF-A5A074700B0E](https://fulu-item11-zjk.oss-cn-zhangjiakou.aliyuncs.com/images/A4C5C025-556D-4456-88BF-A5A074700B0E.png) 拷貝標記出來的完整連結【Webhook】,然後選擇完成 ![7840AC4C-22E9-4126-8182-F6A171AB8B4F](https://fulu-item11-zjk.oss-cn-zhangjiakou.aliyuncs.com/images/7840AC4C-22E9-4126-8182-F6A171AB8B4F.png) 釘釘機器人的配置就完成了。 __3.第三步開始開始寫程式碼:__ 直接上發起的示例程式碼: apiurl 就是獲取的完整連結【Webhook】 jsonString是發起的請求內容,json格式示例如下: ``` { "msgtype": "text", //釘釘的傳送樣式 "text": { "content": "我就是我, 是不一樣的煙火@156xxxx8827" //傳送到群中的內容 }, "at": { //需要訊息@對應人的手機號 "atMobiles": [ "156xxxx8827", "189xxxx8325" ], "isAtAll": false //如果需要@所有人 這個值設定為true } } ``` 下面就是傳送程式碼: ``` /// /// 以Post方式傳送請求 /// /// 請求的URL /// 請求的json引數 /// 請求頭的key-value字典 public static string PostDingDing(string jsonString, string apiurl = null, Dictionary 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](https://fulu-item11-zjk.oss-cn-zhangjiakou.aliyuncs.com/images/TB1jFpqaRxRMKJjy0Fd.png) ### 四、打造一個最簡單的自動回覆機器人 自動回覆訊息的機器人,能夠回覆@機器人的訊息,機器人會將響應內容傳送到群裡。 該功能能夠直接在釘釘中就實現簡單的資料查詢與互動。 接下來我們實現一個簡單的自動回覆機器人的例子。 __1. 首先需要登陸釘釘開發者後臺,建立一個機器人。__ 登入[釘釘開發者後臺](https://open-dev.dingtalk.com/), 選擇應用開發-企業內部開發-機器人,點選建立機器人。 ![1577351408452-22fa418f-4f6c-44ac-aee6-acf925aab819](https://fulu-item11-zjk.oss-cn-zhangjiakou.aliyuncs.com/images/1577351408452-22fa418f-4f6c-44ac-aee6-acf925aab819.png) __2.選擇建立機器人:__ ![487B9865-4298-4806-B360-79B0AB79049D](https://fulu-item11-zjk.oss-cn-zhangjiakou.aliyuncs.com/images/487B9865-4298-4806-B360-79B0AB79049D.png) 選擇應用型別是機器人,想一個機器人的名稱等等,然後直接點選【確定建立】,機器人就建立好了。 __3.機器人簡易配置:__ ![810D1400-A778-4a96-A0D2-0D4CFDD01F22](https://fulu-item11-zjk.oss-cn-zhangjiakou.aliyuncs.com/images/810D1400-A778-4a96-A0D2-0D4CFDD01F22.png) | 引數 | 描述 | |-----------|----------- | |伺服器出口IP|填寫本企業伺服器的公網IP| |訊息接收地址|填寫一個公網可訪問的本企業HTTPS服務地址,用於接收POST過來的訊息| 只用配置如上兩個引數。一個簡單的機器人配置就完成了。 __4.後端程式碼配置:__ 機器人配好了,但是目前還是除錯模式,正式上線前,可以在測試群進行除錯。 ![8AB55669-FB3F-4c5c-8C84-307564EFF2CB](https://fulu-item11-zjk.oss-cn-zhangjiakou.aliyuncs.com/images/8AB55669-FB3F-4c5c-8C84-307564EFF2CB.png) 在測試群中,新增一個剛剛建好的機器人,儲存好Webhook ![D158AEC6-9AA5-4d40-BEAD-17C87E3E0248](https://fulu-item11-zjk.oss-cn-zhangjiakou.aliyuncs.com/images/D158AEC6-9AA5-4d40-BEAD-17C87E3E0248.png) __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 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 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](https://fulu-item11-zjk.oss-cn-zhangjiakou.aliyuncs.com/images/D158AEC6-9AA5-4d40-BEAD-17C87E3E0248.png) 這樣 ,一個可以回覆訊息的機器人就配置好了。我們可以試一試。 ![DABE1809-942B-41c6-87D1-886A97798C80](https://fulu-item11-zjk.oss-cn-zhangjiakou.aliyuncs.com/images/DABE1809-942B-41c6-87D1-886A97798C80.png) __6.上線:__ 好了,當我們一切弄好就可以正式上線了 ![889E6980-D18E-43df-9225-179656B816AF](https://fulu-item11-zjk.oss-cn-zhangjiakou.aliyuncs.com/images/889E6980-D18E-43df-9225-179656B816AF.png) 只要我們點選管理頁面的上線。機器人就正式上線了。 __文章的最後,順帶分享下幾個踩坑問題__ 1.發起的訊息中一定要帶上【自定義關鍵詞】的內容,不然發起不成功。 2.釘釘機器人傳送訊息有限制,1min最多20條,超過的無法傳送,釘釘會進行限流一段時間。 福祿ICH·ERP專案部 福小