前言
想起之前有个项目需要使用钉钉消息推送报警数据到群里,提醒群里人员知道设备报警。
这篇是通过c#实现钉钉消息推送,因为钉钉机器人设定需设置安全设置,有三个(自定义关键词、加签、ip地址(段)),目前是设置自定义关键词通过c#消息推送。
一、钉钉机器人如何设置
1、钉钉机器人设置需建群(在群里才能机器人)
2、点击群设置,在群管理里点击机器人管理。

3、点击添加机器人选择自定义机器人点击添加。

4、在添加钉钉机器人时需要确定加密方式有以下几种:
- 自定义关键字
- 加签
- ip地址段
注:因目前所选方式为第一种,所以需输入自定义关键字,如:"报警:"

5、点击完成后,钉钉会给出一个webhook,需复制webhook在c#中使用。

6、如果自定义机器人在群里发送招呼话语,说明已建造设置成功。
二、c#实现钉钉消息推送
1.钉钉消息类型
钉钉消息有六种消息类型,总结如下:
| 类型 | 是否支持交互 | 关键特性 | 适用场景 |
|---|---|---|---|
| 文本(text) | ❌ | 纯文本,支持@成员 | 简单通知、报警 |
| markdown | ❌ | 支持markdown格式化 | 复杂内容(如日志报告) |
| 链接(link) | ❌ | 标题+图片+跳转链接 | 带缩略图的通知 |
| actioncard | ✅ | 单、多 1-2个可点击按钮 | 审批、任务处理 |
| feedcard | ✅ | 多条链接列表 | 聚合通知(如新闻列表) |
2.代码实现
使用c#控制台实现钉钉机器人消息推送。
1)dingtalkrobot类型
钉钉机器人信息推送,代码如下(示例):
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>
/// 发送文本消息
/// </summary>
/// <param name="content">消息内容</param>
/// <param name="atmobiles">需要@的手机号数组</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>
/// 发送markdown消息
/// </summary>
/// <param name="title">标题</param>
/// <param name="text">markdown格式内容</param>
/// <param name="atmobiles">需要@的手机号数组</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>
/// 发送链接消息
/// </summary>
/// <param name="title">标题</param>
/// <param name="text">内容</param>
/// <param name="messageurl">跳转链接</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>
/// 发送 单按钮 actioncard消息
/// </summary>
/// <param name="title">消息标题,显示在消息顶部</param>
/// <param name="text">消息内容,支持markdown语法</param>
/// <param name="singletitle">单个按钮的文本(不超过20字符)</param>
/// <param name="singleurl">按钮跳转链接(需http/https)</param>
/// <param name="atmobiles">需要@的群成员手机号数组</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>
/// 发送 多按钮 actioncard消息
/// </summary>
/// <param name="title">消息标题</param>
/// <param name="text">消息内容</param>
/// <param name="buttons">按钮列表(最多2个)</param>
/// <param name="btnorientation">按钮排列方向:“0”(垂直,默认) 或 “1”(水平)</param>
/// <param name="atmobiles">需要@的手机号数组</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>
/// 发送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
{
//链接标题(小于等于64字符)
public string title { get; set; }
//跳转链接(需http/https)
public string messageurl { get; set; }
//图片链接(可选,建议尺寸:520x275像素)
public string picurl { get; set; }
}
// 按钮定义类
public class dingtalkbutton
{
//按钮文本(小于等于20字符)
public string title { get; set; }
//跳转链接(需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($"钉钉机器人响应: {responsecontent}");
}
}
2)program类型
钉钉机器人发送消息实现类,代码如下:
using static dingtalkrobot;
using static system.net.mime.mediatypenames;
public class program
{
static async task main(string[] args)
{
// 实际webhook url
var webhookurl = "https://oapi.dingtalk.com/robot/send?access_token=ea8b2fe200c23a4ec8a9569c88ca9561d4f7ebe9bb10d1146ed07e49904c0627\r\n";
var dingtalkrobot = new dingtalkrobot(webhookurl);
try
{
//关键字 = “报警:” 需在title、content参数加关键字
//1、发送文本消息(消息长度不超过20kb)
await dingtalkrobot.sendtextmessageasync("报警:这是一条测试消息",
atmobiles: new[] { "13812345678" },
isatall: false);
//2、发送markdown消息(1、不支持html和复杂表格 2、总长度不超过8192字节)
await dingtalkrobot.sendmarkdownmessageasync(
"报警:项目更新通知",
"### 项目状态更新\n" +
"> 项目进度: 80%\n\n" +
"> 剩余时间: 2天\n\n" +
"\n" +
"###### [查看详情](https://example.com)",
atmobiles: new[] { "13812345678" });
//3、发送链接消息(最后两个 跳转链接 图片链接)
await dingtalkrobot.sendlinkmessageasync(
"报警:系统报警通知",
"生产环境出现异常,请及时处理",
"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、发送单按钮 actioncard消息
await dingtalkrobot.sendactioncardasync(
title: "报警:任务审批",
text: "**申请人**: 张三\n**内容**: 采购申请\n请及时处理!",
singletitle: "点击审批",
singleurl: "https://example.com/approve?id=123");
//5、发送多按钮 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: "报警:请假审批",
text: "**员工**: 李四\n**天数**: 3天",
buttons: buttons,
btnorientation: "1" // 水平排列按钮
);
//6、发送feedcard消息
var links = new list<feedcardlink>
{
new feedcardlink
{
title = "报警:系统报警",
messageurl = "https://example.com/alert1",
picurl = "https://example.com/alert.png"
},
new feedcardlink
{
title = "报警:新任务",
messageurl = "https://example.com/task1",
picurl = "https://example.com/task.png"
}
};
await dingtalkrobot.sendfeedcardasync(links);
}
catch (exception ex)
{
console.writeline($"发送钉钉消息失败: {ex.message}");
}
}
}
3)运行结果


总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论