釘釘做爲企業辦公愈來愈經常使用的軟件,對於企業內部自研系統提供接口支持,以此來打通多平臺下的數據,本次先使用最簡單的釘釘羣機器人完成多種形式的消息推送,參考釘釘開發文檔中自定義機器人環節,這次嘗試所花的時間很少,但有幾個地方是須要注意的。java
首先得有一個釘釘羣,若是沒有得自行建立一個了,經過羣內右上角菜單中找到羣機器人而後添加一個自定義機器人git
並設置消息推送開啓(默認是開啓),複製下一行的webhook地址,該地址將做爲後面消息推送的地址web
完成便可,若是不肯定該地址是否有效能夠用命令測試一下,好比在Linux平臺下,經過該命令並將本身的webhook_token替換json
curl 'https://oapi.dingtalk.com/robot/send?access_token=cd1eb120c459ced6a65491af7b1eebbc84790fb672077a969bae8bb203aa1c52' \ -H 'Content-Type: application/json' \ -d ' {"msgtype": "text", "text": { "content": "我就是我, 是不同的煙火" } }'
而後回車進行測試,即刻收到羣機器人推送的消息 api
接下來開始在代碼中完成對WebHook地址的調用,能夠先分析一下羣機器人的文檔,能夠獲悉有五種消息類型:文本 (text)、鏈接 (link)、markdown (markdown)、ActionCard、FeedCard消息類型,其中的actionCard分總體和獨立兩類。針對這些類型及給出的參數要求完成基礎類的設計和封裝,以text類型爲例:微信
其中的msgtype是五種消息類型的字符串,所以針對該部分設計一個枚舉,做爲消息類型的區分。markdown
/// <summary> /// 釘釘羣機器人消息類型枚舉 /// </summary> public enum MsgTypeEnum { text, link, markdown, actionCard, feedCard }
設計一個text類並給定一個屬性Content,在設計時咱們喜歡使用帕斯卡命名法,可是釘釘接口卻不容許,若是不作一些處理,直接使用Content屬性將會調用不通接口,這點須要注意,使用Newtonjson提供的打包成json時用指定的名稱替換來知足釘釘接口需求。app
/// <summary> /// 文本類型 /// </summary> public class Text { /// <summary> /// 文本內容 /// </summary> [JsonProperty(PropertyName = "content")] public string Content { get; set; } }
其次對指定人羣作一個類的封裝,一樣須要處理其中的屬性在序列化時的替換名稱。curl
/// <summary> /// @指定人 /// </summary> public class At { /// <summary> /// @的聯繫人 /// </summary> [JsonProperty(PropertyName = "atMobiles")] public List<string> AtMobiles { set; get; } /// <summary> /// 是否@全部人 /// </summary> [JsonProperty(PropertyName = "isAtAll")] public bool IsAtAll { set; get; } }
經過分析五種消息類型,其中的一些參數能夠完成共用,對自定義釘釘機器人文檔的一系列挖掘後,肯定了這幾個類和枚舉async
接下來能夠完成對機器人調用了並使用不一樣消息類型推送到釘釘羣中。
首先在ConfigureService方法中完成對HttpClientFactory的注入
本次直接在Asp.Net Core WebApi下完成機器人的調用,新建一個DingTalk的控制器,而後完成對IHttpClientFactory的注入工做,便開始接下來的服務調用了,對於釘釘的WebHook_Token的存放能夠選擇配置文件或是若是隻是嘗試,能夠直接用一個變量保存便可。
/// <summary> /// 發送釘釘消息接口 /// </summary> [Route("api/[controller]")] [ApiController] public class DingTalkController : ControllerBase { private readonly string WebHook_Token = "https://oapi.dingtalk.com/robot/send?access_token=cd1eb120c459ced6a65491af7b1eebbc84790fb672077a969bae8bb203aa1c52"; private readonly IHttpClientFactory _httpClientFactory; public DingTalkController(IHttpClientFactory httpClientFactory) { _httpClientFactory = httpClientFactory; } }
再次以text文本爲例並完成文本消息的推送,創建一個action,用來發送文本消息,在其中完成對釘釘接口須要參數的組裝工做,最終使用統一的發送方法完成消息推送。
/// <summary> /// 調用釘釘機器人發送文本內容 /// </summary> /// <returns></returns> [HttpGet] [Route(nameof(TextContent))] public async Task<ActionResult> TextContent() { //消息類型 var msgtype = MsgTypeEnum.text.ToString(); //文本內容 var text = new Text { Content = "看萬山紅遍,層林盡染;漫江碧透,百舸爭流@15675120617" }; //指定目標人羣 var at = new At() { AtMobiles = new List<string>() { "15675120617" }, IsAtAll = false }; var response = await SendDingTalkMessage(new { msgtype, text, at }); return Ok(response); }
對於發送方法內須要根據釘釘文檔的一些要求完成設計,如文檔指明須要使用Post提交請求並使用UTF8編碼,我直接在控制器內新建了一個方法(儘管不太合理),首先對內容進行序列化並封裝,而後經過HttpClientFactory新建client並完成發送消息。
/// <summary> /// 執行發送消息 /// </summary> /// <param name="sendMessage"></param> /// <returns></returns> private async Task<HttpResponseMessage> SendDingTalkMessage(object value) { var sendMessage = JsonConvert.SerializeObject(value); var request = new HttpRequestMessage(HttpMethod.Post, WebHook_Token) { //釘釘文檔需指定UTF8編碼 Content = new StringContent(sendMessage, Encoding.UTF8, "application/json") }; var client = _httpClientFactory.CreateClient(); var response = await client.SendAsync(request); return response; }
啓動程序並經過url訪問控制器內的相應方法完成消息推送,注意各屬性的命名方式或經過特性轉換後的命名方式須要知足釘釘接口文檔(文檔中FeedCard類型後兩個參數不太標準)。
倉庫地址:https://gitee.com/530521314/Partner.TreasureChest/tree/master/DingTalk(已切換到該地址,文章中的部分代碼與該地址中有所誤差,進行了更改)
歡迎關注微信訂閱號,有新的文章將同步到訂閱號中
2019-03-02,望技術有成後能回來看見本身的腳步