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

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

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

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

一、釘釘開放平臺配置

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

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

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

1.2 獲取應用憑證

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

  • AppKey:應用的唯一標識
  • AppSecret:應用的密鑰,用于生成訪問令牌

這兩個憑證可以在應用詳情頁的"憑證與基礎信息"中找到。

1.3 添加接口權限

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

在應用詳情頁中,點擊"權限管理"

搜索并添加以下權限:

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

點擊"申請權限",等待管理員審核通過

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

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

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

二、C#項目準備

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

2.1 創(chuàng)建項目

  • 打開Visual Studio,創(chuàng)建一個新的控制臺應用或Web應用項目
  • 選擇.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秒,我們設置提前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ā)送結果:{JsonConvert.SerializeObject(textResponse)}");
?
            // 示例2:發(fā)送Markdown消息
            Console.WriteLine("\n發(fā)送Markdown消息...");
            var markdownTitle = "項目進度通知";
            var markdownContent = @"# 項目進度通報\n\n> 項目A已完成70%\n> 項目B已完成45%\n\n## 本周重點任務\n- 完成項目A的模塊三開發(fā)\n- 開始項目B的系統(tǒng)測試\n\n**請相關負責人注意時間節(jié)點!**";
            var markdownResponse = await messageSender.SendMarkdownMessageAsync(userIdList, markdownTitle, markdownContent);
            Console.WriteLine($"發(fā)送結果:{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ā)團隊負責人\n\n## 會議議程\n1. 產(chǎn)品需求回顧\n2. 功能設計評審\n3. 開發(fā)進度同步\n4. 問題討論與解決";
            var cardResponse = await messageSender.SendActionCardMessageAsync(userIdList, cardTitle, cardContent, "查看詳情", "https://example.com/meeting-details");
            Console.WriteLine($"發(fā)送結果:{JsonConvert.SerializeObject(cardResponse)}");
?
            // 示例4:通過機器人發(fā)送群消息
            Console.WriteLine("\n通過機器人發(fā)送群消息...");
            var robotResponse = await messageSender.SendRobotMessageAsync("【系統(tǒng)通知】服務器備份任務已完成,備份文件大?。?.5GB");
            Console.WriteLine($"發(fā)送結果:{JsonConvert.SerializeObject(robotResponse)}");
?
            Console.WriteLine("\n所有消息發(fā)送完成!");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"發(fā)送消息時發(fā)生錯誤:{ex.Message}");
        }
?
        Console.ReadLine();
    }
}

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

相關文章

  • Unity之繞軸進行旋轉的操作

    Unity之繞軸進行旋轉的操作

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

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

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

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

    這篇文章詳細的講解了如何從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ù)的讀寫操作簡單應用,探究了以下幾種C#對象深拷貝方式,同時簡單對比了以下列出的幾種深拷貝方式的速度,需要的朋友可以參考下
    2022-04-04
  • C#中DataBindings用法實例分析

    C#中DataBindings用法實例分析

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

    C# 封裝HtmlHelper組件:BootstrapHelper

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

    輕松學習C#的foreach迭代語句

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

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

    這篇文章主要介紹了詳解C#編程中一維數(shù)組與多維數(shù)組的使用,包括數(shù)組初始化等基礎知識的講解,需要的朋友可以參考下
    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

最新評論

阿拉善盟| 城口县| 托克逊县| 芒康县| 南丹县| 东方市| 尼木县| 巧家县| 华蓥市| 兴宁市| 荆门市| 南康市| 吉林省| 东乌| 双辽市| 济阳县| 收藏| 民丰县| 荆州市| 尤溪县| 报价| 长顺县| 松阳县| 奉贤区| 五指山市| 梨树县| 夹江县| 闻喜县| 凤冈县| 鸡泽县| 宿州市| 烟台市| 高台县| 天祝| 盐源县| 黔西| 芜湖市| 南阳市| 洱源县| 贵阳市| 雷波县|