C#調(diào)用釘釘API發(fā)送通知的實現(xiàn)示例
在企業(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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- docker-compose搭建prometheus+grafana+釘釘告警
- zabbix?6.0?使用?JavaScript?發(fā)出釘釘告警的方法
- SpringBoot-Admin實現(xiàn)微服務監(jiān)控+健康檢查+釘釘告警
- Zabbix 配置釘釘告警功能的實現(xiàn)代碼
- Python腳本構建輕量級監(jiān)控告警體系(郵件/釘釘/企業(yè)微信)
- SpringBoot AOP實現(xiàn)釘釘+企業(yè)微信雙渠道異常告警
- Java對接釘釘考勤記錄的完整步驟
- Python實現(xiàn)釘釘自動化完整指南
- 基于Python實現(xiàn)開發(fā)釘釘通知機器人
- Golang接入釘釘通知的示例代碼
- Python腳本如何實現(xiàn)監(jiān)控服務器日志異常并通過釘釘推送告警?
相關文章
C# 封裝HtmlHelper組件:BootstrapHelper
這篇文章主要介紹了C# 封裝HtmlHelper組件之BootstrapHelper 的相關資料,需要的朋友可以參考下2016-08-08
C#中FileSystemWatcher類實現(xiàn)監(jiān)控文件夾
在C#中,如果你想要監(jiān)控一個文件夾內(nèi)文件的變動情況,比如文件的創(chuàng)建、刪除、修改等,你可以使用FileSystemWatcher類,下面就來介紹一下FileSystemWatcher監(jiān)控的使用,感興趣的可以了解一下2024-03-03

