首先先说下需求,这次项目需要完成几个需求:
1.使用C# 调用钉钉接口发送工作通知
2.想某个同事发送待办消息
现在开始
-
注册开发者账号: 在钉钉开放平台注册一个开发者账号,创建一个应用,获得应用的
AppKey
和AppSecret
。 -
获取Access Token: 在你的C#代码中,通过AppKey和AppSecret获取访问令牌(Access Token)。你需要定期刷新Access Token,因为它们有过期时间。
第二:新建项目
这应该是最简单的基础
namespace YourProjectName
{
class Program
{
static void Main(string[] args)
{
// 实例化 DingTalkApi 类
DingTalkApi dingTalkApi = new DingTalkApi();
// 调用 AfterBindData 方法
dingTalkApi.AfterBindData(EventArgs.Empty).Wait(); // 这里使用了 .Wait() 以同步的方式调用异步方法
// 等待用户按下 Enter 键退出程序
Console.WriteLine("按下 Enter 键退出...");
Console.ReadLine();
}
}
}
class DingTalkApi
{
private const string AppKey = "AppKey ";
private const string AppSecret = "AppSecret ";
private const string DingTalkApiBaseUrl = "https://oapi.dingtalk.com/";
private const string DingTalkApiBaseUrl2 = "https://api.dingtalk.com/";
// 第一步
public async Task AfterBindData(EventArgs e)
{
try
{
Console.WriteLine("开始发送钉钉消息");
// 调用.NET Core代码发送待办信息给钉钉
await SendTodoMessage(); // 使用 await 以异步方式调用异步方法
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
// 处理异常,例如记录到日志
}
}
// 第二部
private async Task SendTodoMessage()
{
try
{
// 获取Access Token
var accessToken = await GetAccessToken();
// 获取部门
//var depIdList = await GetDepartment(accessToken);
// 用部门ID获取所有用户ID循环去访问每一个部门来获取用户ID
//var ListId = await GetTotalUserIds(accessToken, depIdList);
// 拿取自己的ID即可
var userId = "";
// 机器人发送消息(权限没有 钉钉开放平台应用里开通权限)
//var a = await GetRobotMessage(accessToken, userId);
// 发送工作通知消息 userId 发送人ID
var a = await GetWorkMessage(accessToken, userId);
// 获取用户unionid
//var unionid = await GetUnionid(accessToken, userId);
var unionid = "";
// 发送的内容
var payload = new
{
subject = "您有采购订单未审核,请及时审核!",
creatorId = unionid,
description = "应用可以调用该接口发起一个钉钉待办任务",
dueTime = "1702516848000",
detailUrl = new
{
appUrl = "#",
pcUrl = "#"
},
// 执行人
executorIds = new List<string>
{
""
},
isOnlyShowExecutor = true, // 或者 false,根据实际需求设置
priority = 20, // 根据实际需求设置
notifyConfigs = new
{
dingNotify = "1"
}
};
// 发送待办信息给钉钉
//await SendTodoMessageToDingTalk(accessToken, unionid, payload);
}
catch (Exception ex)
{
// 处理异常,例如记录到日志ex.Message
}
}
//发送工作消息
public class Msg
{
public string msgtype { get; set; }
public Text text { get; set; }
}
public class Text
{
public string content { get; set; }
}
//发送工作通知消息 userId 发送人ID
private async Task<string> GetWorkMessage(string accessToken, string userId)
{
try
{
using (var httpClient = new HttpClient())
{
var url = $"{DingTalkApiBaseUrl}topapi/message/corpconversation/asyncsend_v2?access_token={accessToken}";
// 构建请求参数
var requestContent = new
{
agent_id = 00000,
msg = new Msg
{
msgtype = "text",
text = new Text
{
content = "测试工作通知"
}
},
userid_list = ""
};
// 将请求参数转换为 JSON
string jsonContent = JsonSerializer.Serialize(requestContent);
// 发送 POST 请求
var httpContent = new StringContent(jsonContent, Encoding.UTF8, "application/json");
// 添加请求头
//httpContent.Headers.Add("x-acs-dingtalk-access-token", accessToken);
var response = await httpClient.PostAsync(url, httpContent);
// 处理响应
if (response.IsSuccessStatusCode)
{
var responseContent = await response.Content.ReadAsStringAsync();
JObject jObject = JObject.Parse(responseContent);
// 获取 access_token
string errcode = (string)jObject["errcode"];
Console.WriteLine($"errcode: {errcode}");
return errcode;
}
else
{
// 处理响应错误,根据需要返回或抛出异常
var errorMessage = $"Error getting user details: {response.StatusCode} - {response.ReasonPhrase}";
throw new Exception(errorMessage);
}
}
}
catch (Exception ex)
{
// 处理异常,例如记录到日志
Console.WriteLine($"Error: {ex.Message}");
return null;
}
}
// 使用机器人发送消息给某个用户
private async Task<string> GetRobotMessage(string accessToken, string userId)
{
try
{
using (var httpClient = new HttpClient())
{
var url = $"{DingTalkApiBaseUrl2}v1.0/robot/ding/send";
// 构建请求参数
var requestContent = new
{
RobotCode = "dingrtytmbzbzfcXXXXX",
RemindType = 1,
ReceiverUserIdList = new List<string>
{
"123123312"
},
Content = "钉钉,让进步发生",
};
// 将请求参数转换为 JSON
string jsonContent = JsonSerializer.Serialize(requestContent);
// 发送 POST 请求
var httpContent = new StringContent(jsonContent, Encoding.UTF8, "application/json");
// 添加请求头
httpContent.Headers.Add("x-acs-dingtalk-access-token", accessToken);
var response = await httpClient.PostAsync(url, httpContent);
// 处理响应
if (response.IsSuccessStatusCode)
{
var responseContent = await response.Content.ReadAsStringAsync();
JObject jObject = JObject.Parse(responseContent);
// 获取 access_token
string unionid = (string)jObject["result"]["unionid"];
Console.WriteLine($"Unionid: {unionid}");
return unionid;
}
else
{
// 处理响应错误,根据需要返回或抛出异常
var errorMessage = $"Error getting user details: {response.StatusCode} - {response.ReasonPhrase}";
throw new Exception(errorMessage);
}
}
}
catch (Exception ex)
{
// 处理异常,例如记录到日志
Console.WriteLine($"Error: {ex.Message}");
return null;
}
}
// 获取用户unionid
private async Task<string> GetUnionid(string accessToken, string userId)
{
try
{
using (var httpClient = new HttpClient())
{
var url = $"{DingTalkApiBaseUrl}topapi/v2/user/get?access_token={accessToken}";
// 构建请求参数084433060226083038
var requestContent = new
{
userid = userId
};
// 将请求参数转换为 JSON
string jsonContent = JsonSerializer.Serialize(requestContent);
// 发送 POST 请求
var response = await httpClient.PostAsync(
url,
new StringContent(jsonContent, Encoding.UTF8, "application/json")
);
// 处理响应
if (response.IsSuccessStatusCode)
{
var responseContent = await response.Content.ReadAsStringAsync();
JObject jObject = JObject.Parse(responseContent);
// 获取 access_token
string unionid = (string)jObject["result"]["unionid"];
Console.WriteLine($"Unionid: {unionid}");
return unionid;
}
else
{
// 处理响应错误,根据需要返回或抛出异常
var errorMessage = $"Error getting user details: {response.StatusCode} - {response.ReasonPhrase}";
throw new Exception(errorMessage);
}
}
}
catch (Exception ex)
{
// 处理异常,例如记录到日志
Console.WriteLine($"Error: {ex.Message}");
return null;
}
}
// 获取所有部门ID
private async Task<List<long>> GetDepartment(string accessToken)
{
try
{
using (var httpClient = new HttpClient())
{
var url = $"{DingTalkApiBaseUrl}topapi/v2/department/listsub?access_token={accessToken}";
var response = await httpClient.PostAsync(url, null);
if (response.IsSuccessStatusCode)
{
var responseContent = await response.Content.ReadAsStringAsync();
return ParseDepartmentIds(responseContent);
}
else
{
var errorMessage = $"Error getting department details: {response.StatusCode} - {response.ReasonPhrase}";
throw new Exception(errorMessage);
}
}
}
catch (Exception ex)
{
// 处理异常,例如记录到日志
Console.WriteLine($"Error: {ex.Message}");
return null;
}
}
// 批量获取ID
private static List<long> ParseDepartmentIds(string jsonResponse)
{
var departmentIds = new List<long>();
try
{
var jsonDocument = JsonDocument.Parse(jsonResponse);
if (jsonDocument.RootElement.TryGetProperty("result", out var resultElement) && resultElement.EnumerateArray().Any())
{
foreach (var departmentElement in resultElement.EnumerateArray())
{
if (departmentElement.TryGetProperty("dept_id", out var deptIdElement) && deptIdElement.TryGetInt64(out var deptId))
{
departmentIds.Add(deptId);
}
}
}
return departmentIds;
}
catch (Exception ex)
{
Console.WriteLine($"Error parsing department IDs: {ex.Message}");
return null;
}
}
// 利用部门去获取所有用户ID
private async Task<List<string>> GetTotalUserIds(string accessToken, List<long> depIdList)
{
var totalUserIds = new List<string>();
foreach (var depId in depIdList)
{
var userids = await GetDepUserId(accessToken, depId);
if (userids != null)
{
totalUserIds.AddRange(userids);
}
}
return totalUserIds;
}
private async Task<List<string>> GetDepUserId(string accessToken, long depId)
{
try
{
using (var httpClient = new HttpClient())
{
var url = $"{DingTalkApiBaseUrl}topapi/user/listid?access_token={accessToken}";
// 构建请求参数
var requestContent = new
{
dept_id = depId
};
string jsonContent = JsonSerializer.Serialize(requestContent);
var response = await httpClient.PostAsync(
url,
new StringContent(jsonContent, Encoding.UTF8, "application/json")
);
if (response.IsSuccessStatusCode)
{
var responseContent = await response.Content.ReadAsStringAsync();
return ParseUserIds(responseContent);
}
else
{
var errorMessage = $"Error getting user details: {response.StatusCode} - {response.ReasonPhrase}";
throw new Exception(errorMessage);
}
}
}
catch (Exception ex)
{
// 处理异常,例如记录到日志
Console.WriteLine($"Error: {ex.Message}");
return null;
}
}
private static List<string> ParseUserIds(string jsonResponse)
{
var userIds = new List<string>();
try
{
using (JsonDocument jsonDocument = JsonDocument.Parse(jsonResponse))
{
// 检查是否存在根元素
if (jsonDocument.RootElement.TryGetProperty("errcode", out var errcodeElement) && errcodeElement.GetInt32() == 0)
{
// 获取 userid_list 数组
if (jsonDocument.RootElement.TryGetProperty("result", out var resultElement) && resultElement.TryGetProperty("userid_list", out var userIdListElement))
{
if (userIdListElement.EnumerateArray().Any())
{
userIds.AddRange(userIdListElement.EnumerateArray().Select(id => id.GetString()));
}
}
}
else
{
// 处理错误情况
var errmsg = jsonDocument.RootElement.GetProperty("errmsg").GetString();
throw new Exception($"Error getting user IDs: {errmsg}");
}
}
return userIds;
}
catch (Exception ex)
{
Console.WriteLine($"Error parsing user IDs: {ex.Message}");
return null;
}
}
// 获取Token
private async Task<string> GetAccessToken()
{
using (var httpClient = new HttpClient())
{
var url = $"{DingTalkApiBaseUrl}gettoken?appkey={AppKey}&appsecret={AppSecret}";
var response = await httpClient.GetAsync(url);
var content = await response.Content.ReadAsStringAsync();
JObject jObject = JObject.Parse(content);
// 获取 access_token
string accessToken = (string)jObject["access_token"];
Console.WriteLine($"Access Token: {accessToken}");
return accessToken;
}
// 解析 JSON 响应的方法
}
// 发送待办内容
private async Task SendTodoMessageToDingTalk(string accessToken, string unionId, object payload)
{
try
{
using (var httpClient = new HttpClient())
{
var url = $"https://api.dingtalk.com/v1.0/todo/users/{unionId}/tasks?operatorId={unionId}";
string jsonPayload = JsonSerializer.Serialize(payload);
//JObject jsonPayload = JObject.Parse(payload);
var httpContent = new StringContent(jsonPayload, Encoding.UTF8, "application/json");
// 添加请求头
httpContent.Headers.Add("x-acs-dingtalk-access-token", accessToken);
var response = await httpClient.PostAsync(url, httpContent);
var result = await response.Content.ReadAsStringAsync();
// 处理响应,根据实际情况进行处理
if (response.IsSuccessStatusCode)
{
Console.WriteLine(result);
}
else
{
Console.WriteLine($"Error: {response.StatusCode} - {result}");
}
}
}
catch (Exception ex)
{
// 处理异常,例如记录到日志
Console.WriteLine($"Error: {ex.Message}");
}
}
}
以上我获取的是所有部门里的用户ID,你可以获取自己的
接口以及方法我写好了
如果有不懂就点点赞,私信我也可以。希望帮助到你