欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#實(shí)現(xiàn)釘釘消息推送過程

 更新時(shí)間:2025年07月23日 14:21:46   作者:老農(nóng)民編程  
本文介紹通過C#實(shí)現(xiàn)釘釘消息推送報(bào)警數(shù)據(jù)至群聊的方法,重點(diǎn)講解機(jī)器人設(shè)置步驟(建群、添加自定義機(jī)器人、配置關(guān)鍵字和Webhook)及C#代碼實(shí)現(xiàn),支持文本、Markdown等消息類型,用于設(shè)備報(bào)警提醒場景

前言

想起之前有個(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" +
                "![screenshot](https://example.com/image.png)\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#泛型集合Dictionary<K,V>的使用方法

    C#泛型集合Dictionary<K,V>的使用方法

    這篇文章主要介紹了C#泛型集合Dictionary<K,V>的使用方法,本文講解了Dictionary的多種操作方法,需要的朋友可以參考下
    2014-10-10
  • C#中實(shí)體類與XML相互轉(zhuǎn)換方式

    C#中實(shí)體類與XML相互轉(zhuǎn)換方式

    這篇文章主要介紹了C#中實(shí)體類與XML相互轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • C#實(shí)現(xiàn)程序等待延遲執(zhí)行的方法

    C#實(shí)現(xiàn)程序等待延遲執(zhí)行的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)程序等待延遲執(zhí)行的方法,涉及C#動(dòng)態(tài)鏈接庫的使用及延遲的實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-09-09
  • C#讀取csv格式文件的方法

    C#讀取csv格式文件的方法

    這篇文章主要介紹了C#讀取csv格式文件的方法,包括針對(duì)csv文件操作的規(guī)則,實(shí)例代碼部分包含了數(shù)據(jù)有效性驗(yàn)證及行列驗(yàn)證等內(nèi)容,邏輯嚴(yán)謹(jǐn),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2014-10-10
  • C#合并多種格式文件為PDF的方法

    C#合并多種格式文件為PDF的方法

    這篇文章主要為大家詳細(xì)介紹了C#合并多種格式文件為PDF的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C#同步和異步調(diào)用方法實(shí)例

    C#同步和異步調(diào)用方法實(shí)例

    c#同步和異步很簡單,這里給大家提供一個(gè)小例子供大家參考
    2013-11-11
  • C# WinForm程序設(shè)計(jì)簡單計(jì)算器

    C# WinForm程序設(shè)計(jì)簡單計(jì)算器

    這篇文章主要為大家詳細(xì)介紹了C# WinForm程序設(shè)計(jì)簡單計(jì)算器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • c# 從內(nèi)存中釋放Selenium chromedriver.exe

    c# 從內(nèi)存中釋放Selenium chromedriver.exe

    這篇文章主要介紹了c# 從內(nèi)存中釋放Selenium chromedriver.exe的方法,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2021-01-01
  • 解析c# yield關(guān)鍵字

    解析c# yield關(guān)鍵字

    這篇文章主要介紹了c# yield關(guān)鍵字的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-08-08
  • C#監(jiān)控文件夾并自動(dòng)給圖片文件打水印的方法

    C#監(jiān)控文件夾并自動(dòng)給圖片文件打水印的方法

    這篇文章主要介紹了C#監(jiān)控文件夾并自動(dòng)給圖片文件打水印的方法,涉及C#針對(duì)文件夾及圖片操作的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-05-05

最新評(píng)論