C#實(shí)現(xiàn)釘釘消息推送過程
前言
想起之前有個(gè)項(xiàng)目需要使用釘釘消息推送報(bào)警數(shù)據(jù)到群里,提醒群里人員知道設(shè)備報(bào)警。
這篇是通過C#實(shí)現(xiàn)釘釘消息推送,因?yàn)獒斸敊C(jī)器人設(shè)定需設(shè)置安全設(shè)置,有三個(gè)(自定義關(guān)鍵詞、加簽、IP地址(段)),目前是設(shè)置自定義關(guān)鍵詞通過C#消息推送。
一、釘釘機(jī)器人如何設(shè)置
1、釘釘機(jī)器人設(shè)置需建群(在群里才能機(jī)器人)
2、點(diǎn)擊群設(shè)置,在群管理里點(diǎn)擊機(jī)器人管理。
3、點(diǎn)擊添加機(jī)器人選擇自定義機(jī)器人點(diǎn)擊添加。
4、在添加釘釘機(jī)器人時(shí)需要確定加密方式有以下幾種:
- 自定義關(guān)鍵字
- 加簽
- IP地址段
注:因目前所選方式為第一種,所以需輸入自定義關(guān)鍵字,如:"報(bào)警:"
5、點(diǎn)擊完成后,釘釘會(huì)給出一個(gè)webhook,需復(fù)制webhook在C#中使用。
6、如果自定義機(jī)器人在群里發(fā)送招呼話語,說明已建造設(shè)置成功。
二、C#實(shí)現(xiàn)釘釘消息推送
1.釘釘消息類型
釘釘消息有六種消息類型,總結(jié)如下:
類型 | 是否支持交互 | 關(guān)鍵特性 | 適用場景 |
---|---|---|---|
文本(text) | ? | 純文本,支持@成員 | 簡單通知、報(bào)警 |
Markdown | ? | 支持Markdown格式化 | 復(fù)雜內(nèi)容(如日志報(bào)告) |
鏈接(link) | ? | 標(biāo)題+圖片+跳轉(zhuǎn)鏈接 | 帶縮略圖的通知 |
ActionCard | ? | 單、多 1-2個(gè)可點(diǎn)擊按鈕 | 審批、任務(wù)處理 |
FeedCard | ? | 多條鏈接列表 | 聚合通知(如新聞列表) |
2.代碼實(shí)現(xiàn)
使用C#控制臺(tái)實(shí)現(xiàn)釘釘機(jī)器人消息推送。
1)DingTalkRobot類型
釘釘機(jī)器人信息推送,代碼如下(示例):
using System; using System.Net.Http; using System.Text; using System.Threading.Tasks; public class DingTalkRobot { private readonly string _webhookUrl; private readonly HttpClient _httpClient; public DingTalkRobot(string webhookUrl) { _webhookUrl = webhookUrl ?? throw new ArgumentNullException(nameof(webhookUrl)); _httpClient = new HttpClient(); } /// <summary> /// 發(fā)送文本消息 /// </summary> /// <param name="content">消息內(nèi)容</param> /// <param name="atMobiles">需要@的手機(jī)號(hào)數(shù)組</param> /// <param name="isAtAll">是否@所有人</param> public async Task SendTextMessageAsync(string content, string[] atMobiles = null, bool isAtAll = false) { var message = new { msgtype = "text", text = new { content = content }, at = new { atMobiles = atMobiles ?? Array.Empty<string>(), isAtAll = isAtAll } }; await SendMessageAsync(message); } /// <summary> /// 發(fā)送Markdown消息 /// </summary> /// <param name="title">標(biāo)題</param> /// <param name="text">Markdown格式內(nèi)容</param> /// <param name="atMobiles">需要@的手機(jī)號(hào)數(shù)組</param> /// <param name="isAtAll">是否@所有人</param> public async Task SendMarkdownMessageAsync(string title, string text, string[] atMobiles = null, bool isAtAll = false) { var message = new { msgtype = "markdown", markdown = new { title = title, text = text }, at = new { atMobiles = atMobiles ?? Array.Empty<string>(), isAtAll = isAtAll } }; await SendMessageAsync(message); } /// <summary> /// 發(fā)送鏈接消息 /// </summary> /// <param name="title">標(biāo)題</param> /// <param name="text">內(nèi)容</param> /// <param name="messageUrl">跳轉(zhuǎn)鏈接</param> /// <param name="picUrl">圖片鏈接(可選)</param> public async Task SendLinkMessageAsync(string title, string text, string messageUrl, string picUrl = "") { var message = new { msgtype = "link", link = new { title = title, text = text, messageUrl = messageUrl, picUrl = picUrl } }; await SendMessageAsync(message); } /// <summary> /// 發(fā)送 單按鈕 ActionCard?消息 /// </summary> /// <param name="title">消息標(biāo)題,顯示在消息頂部</param> /// <param name="text">消息內(nèi)容,支持Markdown語法</param> /// <param name="singleTitle">單個(gè)按鈕的文本(不超過20字符)</param> /// <param name="singleUrl">按鈕跳轉(zhuǎn)鏈接(需HTTP/HTTPS)</param> /// <param name="atMobiles">需要@的群成員手機(jī)號(hào)數(shù)組</param> /// <param name="isAtAll">是否@所有人(慎用)</param> /// <returns></returns> public async Task SendActionCardAsync(string title, string text, string singleTitle, string singleUrl, string[] atMobiles = null, bool isAtAll = false) { var message = new { msgtype = "actionCard", actionCard = new { title = title, text = text, singleTitle = singleTitle, singleURL = singleUrl, btnOrientation = "0" // "0"垂直按鈕,"1"水平按鈕 }, at = new { atMobiles = atMobiles ?? Array.Empty<string>(), isAtAll = isAtAll } }; await SendMessageAsync(message); } /// <summary> /// 發(fā)送 多按鈕 ActionCard消息 /// </summary> /// <param name="title">消息標(biāo)題</param> /// <param name="text">消息內(nèi)容</param> /// <param name="buttons">按鈕列表(最多2個(gè))</param> /// <param name="btnOrientation">按鈕排列方向:“0”(垂直,默認(rèn)) 或 “1”(水平)</param> /// <param name="atMobiles">需要@的手機(jī)號(hào)數(shù)組</param> /// <param name="isAtAll">是否@所有人</param> /// <returns></returns> public async Task SendMultiActionCardAsync(string title, string text, List<DingTalkButton> buttons, string btnOrientation = "0", // "0"垂直,"1"水平 string[] atMobiles = null, bool isAtAll = false) { var message = new { msgtype = "actionCard", actionCard = new { title = title, text = text, btns = buttons.Select(b => new { title = b.Title, actionURL = b.Url }).ToArray(), btnOrientation = btnOrientation }, at = new { atMobiles = atMobiles ?? Array.Empty<string>(), isAtAll = isAtAll } }; await SendMessageAsync(message); } /// <summary> /// 發(fā)送FeedCard消息 /// </summary> /// <param name="links">鏈接列表(最多5條)</param> /// <returns></returns> public async Task SendFeedCardAsync(List<FeedCardLink> links) { var message = new { msgtype = "feedCard", feedCard = new { links = links.Select(link => new { title = link.Title, messageURL = link.MessageUrl, picURL = link.PicUrl }).ToArray() } }; await SendMessageAsync(message); } // FeedCard 鏈接定義類 public class FeedCardLink { //鏈接標(biāo)題(小于等于64字符) public string Title { get; set; } //跳轉(zhuǎn)鏈接(需HTTP/HTTPS) public string MessageUrl { get; set; } //圖片鏈接(可選,建議尺寸:520x275像素) public string PicUrl { get; set; } } // 按鈕定義類 public class DingTalkButton { //按鈕文本(小于等于20字符) public string Title { get; set; } //跳轉(zhuǎn)鏈接(需HTTP/HTTPS) public string Url { get; set; } } private async Task SendMessageAsync(object message) { var json = Newtonsoft.Json.JsonConvert.SerializeObject(message); var content = new StringContent(json, Encoding.UTF8, "application/json"); var response = await _httpClient.PostAsync(_webhookUrl, content); response.EnsureSuccessStatusCode(); var responseContent = await response.Content.ReadAsStringAsync(); Console.WriteLine($"釘釘機(jī)器人響應(yīng): {responseContent}"); } }
2)Program類型
釘釘機(jī)器人發(fā)送消息實(shí)現(xiàn)類,代碼如下:
using static DingTalkRobot; using static System.Net.Mime.MediaTypeNames; public class Program { static async Task Main(string[] args) { // 實(shí)際Webhook URL var webhookUrl = "https://oapi.dingtalk.com/robot/send?access_token=ea8b2fe200c23a4ec8a9569c88ca9561d4f7ebe9bb10d1146ed07e49904c0627\r\n"; var dingTalkRobot = new DingTalkRobot(webhookUrl); try { //關(guān)鍵字 = “報(bào)警:” 需在title、content參數(shù)加關(guān)鍵字 //1、發(fā)送文本消息(消息長度不超過20kb) await dingTalkRobot.SendTextMessageAsync("報(bào)警:這是一條測(cè)試消息", atMobiles: new[] { "13812345678" }, isAtAll: false); //2、發(fā)送Markdown消息(1、不支持HTML和復(fù)雜表格 2、總長度不超過8192字節(jié)) await dingTalkRobot.SendMarkdownMessageAsync( "報(bào)警:項(xiàng)目更新通知", "### 項(xiàng)目狀態(tài)更新\n" + "> 項(xiàng)目進(jìn)度: 80%\n\n" + "> 剩余時(shí)間: 2天\n\n" + "\n" + "###### [查看詳情](https://example.com)", atMobiles: new[] { "13812345678" }); //3、發(fā)送鏈接消息(最后兩個(gè) 跳轉(zhuǎn)鏈接 圖片鏈接) await dingTalkRobot.SendLinkMessageAsync( "報(bào)警:系統(tǒng)報(bào)警通知", "生產(chǎn)環(huán)境出現(xiàn)異常,請(qǐng)及時(shí)處理", "https://www.bilibili.com/video/BV1ZU4y1q7sn/?share_source=copy_web&vd_source=ad0206b6bbe094bb6fa542017f2e474b", "https://www.bilibili.com/opus/366829175324803541?from=search&spm_id_from=333.337.0.0"); //4、發(fā)送單按鈕 ActionCard消息 await dingTalkRobot.SendActionCardAsync( title: "報(bào)警:任務(wù)審批", text: "**申請(qǐng)人**: 張三\n**內(nèi)容**: 采購申請(qǐng)\n請(qǐng)及時(shí)處理!", singleTitle: "點(diǎn)擊審批", singleUrl: "https://example.com/approve?id=123"); //5、發(fā)送多按鈕 ActionCard消息 var buttons = new List<DingTalkButton> { new DingTalkButton { Title = "同意", Url = "https://example.com/agree" }, new DingTalkButton { Title = "拒絕", Url = "https://example.com/reject" } }; await dingTalkRobot.SendMultiActionCardAsync( title: "報(bào)警:請(qǐng)假審批", text: "**員工**: 李四\n**天數(shù)**: 3天", buttons: buttons, btnOrientation: "1" // 水平排列按鈕 ); //6、發(fā)送FeedCard消息 var links = new List<FeedCardLink> { new FeedCardLink { Title = "報(bào)警:系統(tǒng)報(bào)警", MessageUrl = "https://example.com/alert1", PicUrl = "https://example.com/alert.png" }, new FeedCardLink { Title = "報(bào)警:新任務(wù)", MessageUrl = "https://example.com/task1", PicUrl = "https://example.com/task.png" } }; await dingTalkRobot.SendFeedCardAsync(links); } catch (Exception ex) { Console.WriteLine($"發(fā)送釘釘消息失敗: {ex.Message}"); } } }
3)運(yùn)行結(jié)果
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C#實(shí)現(xiàn)程序等待延遲執(zhí)行的方法
這篇文章主要介紹了C#實(shí)現(xiàn)程序等待延遲執(zhí)行的方法,涉及C#動(dòng)態(tài)鏈接庫的使用及延遲的實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-09-09C# WinForm程序設(shè)計(jì)簡單計(jì)算器
這篇文章主要為大家詳細(xì)介紹了C# WinForm程序設(shè)計(jì)簡單計(jì)算器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02c# 從內(nèi)存中釋放Selenium chromedriver.exe
這篇文章主要介紹了c# 從內(nèi)存中釋放Selenium chromedriver.exe的方法,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下2021-01-01C#監(jiān)控文件夾并自動(dòng)給圖片文件打水印的方法
這篇文章主要介紹了C#監(jiān)控文件夾并自動(dòng)給圖片文件打水印的方法,涉及C#針對(duì)文件夾及圖片操作的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-05-05