最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#調(diào)用釘釘API發(fā)送通知的實現(xiàn)示例

 更新時間:2025年11月27日 09:59:20   作者:阿登林  
本文介紹了使用C#調(diào)用釘釘API實現(xiàn)企業(yè)通知推送的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

在企業(yè)信息化建設(shè)中,實時通知是提升工作效率的重要手段。釘釘作為國內(nèi)流行的企業(yè)級通訊工具,提供了豐富的API接口,允許開發(fā)者通過代碼發(fā)送各類通知。本文將詳細(xì)介紹如何使用C#語言調(diào)用釘釘API發(fā)送通知,幫助企業(yè)實現(xiàn)自動化消息推送。

一、釘釘開放平臺配置

在開始編碼前,我們需要在釘釘開放平臺 完成相關(guān)配置,獲取調(diào)用API所需的憑證。

1.1 創(chuàng)建釘釘應(yīng)用

  • 登錄釘釘開放平臺
  • 進(jìn)入"應(yīng)用開發(fā)" -> "企業(yè)內(nèi)部開發(fā)" -> "應(yīng)用管理"
  • 點擊"創(chuàng)建應(yīng)用",填寫應(yīng)用名稱、描述等信息
  • 上傳應(yīng)用圖標(biāo),選擇應(yīng)用類型為"H5微應(yīng)用"
  • 點擊"確定創(chuàng)建"按鈕完成應(yīng)用創(chuàng)建

1.2 獲取應(yīng)用憑證

應(yīng)用創(chuàng)建成功后,我們需要獲取兩個重要的憑證:

  • AppKey:應(yīng)用的唯一標(biāo)識
  • AppSecret:應(yīng)用的密鑰,用于生成訪問令牌

這兩個憑證可以在應(yīng)用詳情頁的"憑證與基礎(chǔ)信息"中找到。

1.3 添加接口權(quán)限

為了能夠發(fā)送通知,我們需要為應(yīng)用添加相應(yīng)的接口權(quán)限:

在應(yīng)用詳情頁中,點擊"權(quán)限管理"

搜索并添加以下權(quán)限:

  • 企業(yè)消息通知
  • 獲取部門基礎(chǔ)信息(如需按部門發(fā)送通知)
  • 獲取用戶基本信息(如需指定用戶發(fā)送通知)

點擊"申請權(quán)限",等待管理員審核通過

1.4 創(chuàng)建自定義機器人(可選)

除了通過應(yīng)用發(fā)送通知外,我們還可以通過自定義機器人發(fā)送群消息:

  • 打開釘釘群聊,點擊右上角"群設(shè)置"
  • 選擇"智能群助手" -> "添加機器人"
  • 選擇"自定義機器人"
  • 設(shè)置機器人名稱、安全設(shè)置(建議選擇"加簽"方式)
  • 完成創(chuàng)建后,復(fù)制Webhook地址,保存?zhèn)溆?/li>

二、C#項目準(zhǔn)備

現(xiàn)在,我們開始準(zhǔn)備C#項目環(huán)境,為調(diào)用釘釘API做準(zhǔn)備。

2.1 創(chuàng)建項目

  • 打開Visual Studio,創(chuàng)建一個新的控制臺應(yīng)用或Web應(yīng)用項目
  • 選擇.NET Framework或.NET Core版本(本文以.NET Core 3.1為例)

2.2 添加必要的NuGet包

我們需要添加以下NuGet包來簡化開發(fā):

# 使用Package Manager Console
Install-Package Newtonsoft.Json
Install-Package RestSharp

或通過NuGet包管理器界面搜索并安裝這些包。

2.3 創(chuàng)建配置文件

在項目中添加一個配置文件appsettings.json,用于存儲我們在釘釘開放平臺獲取的憑證信息:

{
  "DingTalk": {
    "AppKey": "your_app_key",
    "AppSecret": "your_app_secret",
    "AgentId": 123456789,
    "Webhook": "your_webhook_url",
    "Secret": "your_robot_secret"
  }
}

三、實現(xiàn)釘釘API調(diào)用工具類

接下來,我們將創(chuàng)建一個工具類,封裝釘釘API的調(diào)用方法。

3.1 創(chuàng)建訪問令牌管理類

首先,我們需要創(chuàng)建一個類來管理訪問令牌(AccessToken):

using Newtonsoft.Json;
using RestSharp;
using System;
using System.Configuration;
using System.Threading.Tasks;
?
public class DingTalkTokenManager
{
    private static string _accessToken = string.Empty;
    private static DateTime _tokenExpireTime = DateTime.MinValue;
    private readonly string _appKey;
    private readonly string _appSecret;
?
    public DingTalkTokenManager(string appKey, string appSecret)
    {
        _appKey = appKey;
        _appSecret = appSecret;
    }
?
    public async Task<string> GetAccessTokenAsync()
    {
        // 檢查令牌是否已過期,如未過期則直接返回
        if (!string.IsNullOrEmpty(_accessToken) && DateTime.Now < _tokenExpireTime)
        {
            return _accessToken;
        }
?
        // 調(diào)用釘釘API獲取新的訪問令牌
        var client = new RestClient("https://oapi.dingtalk.com");
        var request = new RestRequest("gettoken", Method.GET);
        request.AddParameter("appkey", _appKey);
        request.AddParameter("appsecret", _appSecret);
?
        var response = await client.ExecuteAsync(request);
        var result = JsonConvert.DeserializeObject<dynamic>(response.Content);
?
        if (result.errcode == 0)
        {
            _accessToken = result.access_token;
            // 訪問令牌有效期為7200秒,我們設(shè)置提前10分鐘刷新
            _tokenExpireTime = DateTime.Now.AddSeconds(result.expires_in - 600);
            return _accessToken;
        }
        else
        {
            throw new Exception($"獲取訪問令牌失?。簕result.errmsg}");
        }
    }
}

3.2 創(chuàng)建釘釘消息發(fā)送類

接下來,我們創(chuàng)建一個類來處理各種類型的消息發(fā)送:

using Newtonsoft.Json;
using RestSharp;
using System;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
?
public class DingTalkMessageSender
{
    private readonly DingTalkTokenManager _tokenManager;
    private readonly string _agentId;
    private readonly string _webhook;
    private readonly string _secret;
?
    public DingTalkMessageSender(string appKey, string appSecret, string agentId, string webhook = "", string secret = "")
    {
        _tokenManager = new DingTalkTokenManager(appKey, appSecret);
        _agentId = agentId;
        _webhook = webhook;
        _secret = secret;
    }
?
    /// <summary>
    /// 發(fā)送工作通知消息
    /// </summary>
    public async Task<dynamic> SendWorkNoticeAsync(string userIdList, string deptIdList, string toAllUser, string message)
    {
        var accessToken = await _tokenManager.GetAccessTokenAsync();
        var client = new RestClient("https://oapi.dingtalk.com");
        var request = new RestRequest("topapi/message/corpconversation/asyncsend_v2", Method.POST);
        request.AddParameter("access_token", accessToken);
?
        var requestBody = new
        {
            agent_id = _agentId,
            userid_list = userIdList, // 用戶ID列表,多個用戶用逗號分隔
            dept_id_list = deptIdList, // 部門ID列表,多個部門用逗號分隔
            to_all_user = toAllUser, // 是否發(fā)送給全員
            msg = new
            {
                msgtype = "text",
                text = new { content = message }
            }
        };
?
        request.AddJsonBody(requestBody);
        var response = await client.ExecuteAsync(request);
        return JsonConvert.DeserializeObject<dynamic>(response.Content);
    }
?
    /// <summary>
    /// 通過機器人發(fā)送群消息
    /// </summary>
    public async Task<dynamic> SendRobotMessageAsync(string message)
    {
        if (string.IsNullOrEmpty(_webhook))
        {
            throw new Exception("Webhook地址未配置");
        }
?
        var client = new RestClient(_webhook);
        var request = new RestRequest(Method.POST);
        
        // 如果配置了加簽,需要生成簽名
        if (!string.IsNullOrEmpty(_secret))
        {
            var timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds().ToString();
            var stringToSign = $"{timestamp}\n{_secret}";
            var signature = ComputeHmacSha256(stringToSign);
            request.AddQueryParameter("timestamp", timestamp);
            request.AddQueryParameter("sign", signature);
        }
?
        var requestBody = new
        {
            msgtype = "text",
            text = new { content = message }
        };
?
        request.AddJsonBody(requestBody);
        var response = await client.ExecuteAsync(request);
        return JsonConvert.DeserializeObject<dynamic>(response.Content);
    }
?
    /// <summary>
    /// 計算HMAC-SHA256簽名
    /// </summary>
    private string ComputeHmacSha256(string data)
    {
        var encoding = new UTF8Encoding();
        byte[] keyBytes = encoding.GetBytes(_secret);
        byte[] messageBytes = encoding.GetBytes(data);
?
        using (var hmacsha256 = new HMACSHA256(keyBytes))
        {
            byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);
            return Convert.ToBase64String(hashmessage);
        }
    }
}

四、實現(xiàn)發(fā)送不同類型的通知

釘釘支持多種消息類型,除了基本的文本消息外,還支持鏈接、Markdown、卡片等豐富的消息類型。下面我們來實現(xiàn)幾種常見的消息發(fā)送方式。

4.1 發(fā)送文本消息

/// <summary>
/// 發(fā)送文本消息(擴展方法)
/// </summary>
public async Task<dynamic> SendTextMessageAsync(string userIdList, string message)
{
    return await SendWorkNoticeAsync(userIdList, "", "false", message);
}

4.2 發(fā)送Markdown消息

/// <summary>
/// 發(fā)送Markdown消息
/// </summary>
public async Task<dynamic> SendMarkdownMessageAsync(string userIdList, string title, string markdownText)
{
    var accessToken = await _tokenManager.GetAccessTokenAsync();
    var client = new RestClient("https://oapi.dingtalk.com");
    var request = new RestRequest("topapi/message/corpconversation/asyncsend_v2", Method.POST);
    request.AddParameter("access_token", accessToken);
?
    var requestBody = new
    {
        agent_id = _agentId,
        userid_list = userIdList,
        to_all_user = "false",
        msg = new
        {
            msgtype = "markdown",
            markdown = new
            {
                title = title,
                text = markdownText
            }
        }
    };
?
    request.AddJsonBody(requestBody);
    var response = await client.ExecuteAsync(request);
    return JsonConvert.DeserializeObject<dynamic>(response.Content);
}

4.3 發(fā)送卡片消息

/// <summary>
/// 發(fā)送卡片消息
/// </summary>
public async Task<dynamic> SendActionCardMessageAsync(string userIdList, string title, string markdownText, string singleTitle, string singleURL)
{
    var accessToken = await _tokenManager.GetAccessTokenAsync();
    var client = new RestClient("https://oapi.dingtalk.com");
    var request = new RestRequest("topapi/message/corpconversation/asyncsend_v2", Method.POST);
    request.AddParameter("access_token", accessToken);
?
    var requestBody = new
    {
        agent_id = _agentId,
        userid_list = userIdList,
        to_all_user = "false",
        msg = new
        {
            msgtype = "action_card",
            action_card = new
            {
                title = title,
                text = markdownText,
                single_title = singleTitle,
                single_url = singleURL,
                btn_orientation = "0"
            }
        }
    };
?
    request.AddJsonBody(requestBody);
    var response = await client.ExecuteAsync(request);
    return JsonConvert.DeserializeObject<dynamic>(response.Content);
}

五、完整使用示例

下面是一個完整的使用示例,展示如何在實際項目中使用我們創(chuàng)建的工具類發(fā)送釘釘通知:

using Microsoft.Extensions.Configuration;
using System;
using System.IO;
using System.Threading.Tasks;
?
class Program
{
    static async Task Main(string[] args)
    {
        // 讀取配置文件
        var configuration = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json")
            .Build();
?
        // 獲取配置信息
        var appKey = configuration["DingTalk:AppKey"];
        var appSecret = configuration["DingTalk:AppSecret"];
        var agentId = configuration["DingTalk:AgentId"];
        var webhook = configuration["DingTalk:Webhook"];
        var secret = configuration["DingTalk:Secret"];
?
        try
        {
            // 初始化消息發(fā)送器
            var messageSender = new DingTalkMessageSender(appKey, appSecret, agentId, webhook, secret);
?
            // 示例1:發(fā)送工作通知文本消息
            Console.WriteLine("發(fā)送工作通知文本消息...");
            var userIdList = "user1,user2";
            var textResponse = await messageSender.SendTextMessageAsync(userIdList, "這是一條測試消息,由C#程序發(fā)送。");
            Console.WriteLine($"發(fā)送結(jié)果:{JsonConvert.SerializeObject(textResponse)}");
?
            // 示例2:發(fā)送Markdown消息
            Console.WriteLine("\n發(fā)送Markdown消息...");
            var markdownTitle = "項目進(jìn)度通知";
            var markdownContent = @"# 項目進(jìn)度通報\n\n> 項目A已完成70%\n> 項目B已完成45%\n\n## 本周重點任務(wù)\n- 完成項目A的模塊三開發(fā)\n- 開始項目B的系統(tǒng)測試\n\n**請相關(guān)負(fù)責(zé)人注意時間節(jié)點!**";
            var markdownResponse = await messageSender.SendMarkdownMessageAsync(userIdList, markdownTitle, markdownContent);
            Console.WriteLine($"發(fā)送結(jié)果:{JsonConvert.SerializeObject(markdownResponse)}");
?
            // 示例3:發(fā)送卡片消息
            Console.WriteLine("\n發(fā)送卡片消息...");
            var cardTitle = "重要會議通知";
            var cardContent = @"# 產(chǎn)品評審會議\n\n**時間:** 2023年10月15日 14:00-16:00\n**地點:** 三樓會議室A\n**參會人員:** 產(chǎn)品部全體成員、開發(fā)團(tuán)隊負(fù)責(zé)人\n\n## 會議議程\n1. 產(chǎn)品需求回顧\n2. 功能設(shè)計評審\n3. 開發(fā)進(jìn)度同步\n4. 問題討論與解決";
            var cardResponse = await messageSender.SendActionCardMessageAsync(userIdList, cardTitle, cardContent, "查看詳情", "https://example.com/meeting-details");
            Console.WriteLine($"發(fā)送結(jié)果:{JsonConvert.SerializeObject(cardResponse)}");
?
            // 示例4:通過機器人發(fā)送群消息
            Console.WriteLine("\n通過機器人發(fā)送群消息...");
            var robotResponse = await messageSender.SendRobotMessageAsync("【系統(tǒng)通知】服務(wù)器備份任務(wù)已完成,備份文件大?。?.5GB");
            Console.WriteLine($"發(fā)送結(jié)果:{JsonConvert.SerializeObject(robotResponse)}");
?
            Console.WriteLine("\n所有消息發(fā)送完成!");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"發(fā)送消息時發(fā)生錯誤:{ex.Message}");
        }
?
        Console.ReadLine();
    }
}

到此這篇關(guān)于C#調(diào)用釘釘API發(fā)送通知的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)C#調(diào)用釘釘API內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Unity之繞軸進(jìn)行旋轉(zhuǎn)的操作

    Unity之繞軸進(jìn)行旋轉(zhuǎn)的操作

    這篇文章主要介紹了Unity之繞軸進(jìn)行旋轉(zhuǎn)的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • C#統(tǒng)計字符串里中文漢字個數(shù)的方法

    C#統(tǒng)計字符串里中文漢字個數(shù)的方法

    這篇文章主要介紹了C#統(tǒng)計字符串里中文漢字個數(shù)的方法,本文通過正則實現(xiàn)統(tǒng)計出一段字符串里中文字?jǐn)?shù),需要的朋友可以參考下
    2014-08-08
  • Unity3D開發(fā)教程:憤怒的小鳥

    Unity3D開發(fā)教程:憤怒的小鳥

    這篇文章詳細(xì)的講解了如何從0開發(fā)出一個Unity3D的小游戲憤怒的小鳥,本文包含大量的圖片與文字描述,也含有大量的源代碼,可以讓你快速入手,希望本篇文章對你有所幫助
    2021-06-06
  • C#實現(xiàn)判斷圖形文件格式的方法

    C#實現(xiàn)判斷圖形文件格式的方法

    這篇文章主要介紹了C#實現(xiàn)判斷圖形文件格式的方法,包括常見的擴展名判定及文件內(nèi)容判定等,非常實用,需要的朋友可以參考下
    2014-09-09
  • C#深拷貝方法探究及性能比較(多種深拷貝)

    C#深拷貝方法探究及性能比較(多種深拷貝)

    這篇文章主要介紹了C#中使用NetCDF存儲二維數(shù)據(jù)的讀寫操作簡單應(yīng)用,探究了以下幾種C#對象深拷貝方式,同時簡單對比了以下列出的幾種深拷貝方式的速度,需要的朋友可以參考下
    2022-04-04
  • C#中DataBindings用法實例分析

    C#中DataBindings用法實例分析

    這篇文章主要介紹了C#中DataBindings用法,結(jié)合實例形式詳細(xì)分析了DataBindings綁定數(shù)據(jù)源及刷新數(shù)據(jù)的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2016-06-06
  • C# 封裝HtmlHelper組件:BootstrapHelper

    C# 封裝HtmlHelper組件:BootstrapHelper

    這篇文章主要介紹了C# 封裝HtmlHelper組件之BootstrapHelper 的相關(guān)資料,需要的朋友可以參考下
    2016-08-08
  • 輕松學(xué)習(xí)C#的foreach迭代語句

    輕松學(xué)習(xí)C#的foreach迭代語句

    輕松學(xué)習(xí)C#的foreach迭代語句,  C#語言提供了一個for語句循環(huán)的捷徑,而且還促進(jìn)了集合類的更為一致,就是本文提到的foreach語句,感興趣的小伙伴們可以參考一下
    2015-11-11
  • 詳解C#編程中一維數(shù)組與多維數(shù)組的使用

    詳解C#編程中一維數(shù)組與多維數(shù)組的使用

    這篇文章主要介紹了詳解C#編程中一維數(shù)組與多維數(shù)組的使用,包括數(shù)組初始化等基礎(chǔ)知識的講解,需要的朋友可以參考下
    2016-01-01
  • C#中FileSystemWatcher類實現(xiàn)監(jiān)控文件夾

    C#中FileSystemWatcher類實現(xiàn)監(jiān)控文件夾

    在C#中,如果你想要監(jiān)控一個文件夾內(nèi)文件的變動情況,比如文件的創(chuàng)建、刪除、修改等,你可以使用FileSystemWatcher類,下面就來介紹一下FileSystemWatcher監(jiān)控的使用,感興趣的可以了解一下
    2024-03-03

最新評論

五河县| 堆龙德庆县| 蛟河市| 土默特左旗| 安国市| 额济纳旗| 普安县| 连山| 灯塔市| 中山市| 四子王旗| 阳山县| 军事| 武汉市| 黔南| 鹿泉市| 闻喜县| 珲春市| 札达县| 嘉义县| 泰顺县| 吉林省| 东阿县| 富顺县| 柳江县| 呼图壁县| 肇东市| 平度市| 方城县| 怀集县| 潞西市| 互助| 望都县| 凌海市| 株洲市| 阜平县| 高平市| 安平县| 洛隆县| 新余市| 高陵县|