云计算、AI、云原生、大数据等一站式技术学习平台

网站首页 > 教程文章 正文

使用.NET开发钉钉机器人消息通知_钉钉机器人消息数量限制怎么办

jxf315 2025-09-18 02:18:47 教程文章 1 ℃

“凌晨两点,线上崩了,群里@全体,没人回。

这不是段子,是上周隔壁组的真实事故。

钉钉群机器人响是响了,可值班同学手机静音,第二天才看到。

于是有人开始琢磨:能不能让机器人直接打电话?

答案是可以,而且用 .NET 写,一杯咖啡的功夫就能跑起来。

---

先说结论:

钉钉机器人 ≠ 只能群里吼。

2025 年的玩法是——

· 群通知 + 单聊私聊 + 语音电话,一条链路全打通

· 用 .NET 6/7 跨平台跑在 Linux 容器里,白天在阿里云,夜里自动缩到一台1C1G 的小水管

· 加签、重试、日志、监控,全都打包成一条 `dotnet run` 命令

---

第一步,别急着写代码。

先去钉钉后台把机器人拉出来,拿到两样东西:

1. Webhook 地址,长得像`
https://oapi.dingtalk.com/robot/send?access_token=xxx`

2. 加签密钥,一串 64 位的 secret,别弄丢,丢了就得重新建机器人

---

第二步,把消息格式写成 C# 匿名对象,顺手塞个 Markdown:

```csharp

var msg = new {

msgtype = "markdown",

markdown = new {

title = "线上告警",

text = #34;## 服务挂了\n> 时间:{DateTime.Now}\n>负责人:@{phone}"

},

at = new { atMobiles = new[] { phone } }

};

```

注意 `atMobiles` 里填手机号,钉钉才会真的 @ 到人。

---

第三步,加签。

钉钉要求把 timestamp 和 secret 拼在一起做 HMACSHA256,

网上抄的代码经常忘了 UrlEncode,结果 400 报错。

这里给一个能直接跑的版本:

```csharp

string Sign(long ts, string secret)

{

var bytes = Encoding.UTF8.GetBytes(#34;{ts}\n{secret}");

using var mac = new HMACSHA256(Encoding.UTF8.GetBytes(secret));

var hash = mac.ComputeHash(bytes);

return HttpUtility.UrlEncode(Convert.ToBase64String(hash),Encoding.UTF8);

}

```

---

第四步,发消息。

用 `HttpClient` 异步发,别用 RestSharp,那玩意重。

```csharp

await client.PostAsJsonAsync(webhook, msg);

```

发完把返回的 `errcode` 记下来,

如果是 310000,多半是 JSON 字段写错;

如果是 400403,那就是 IP 没在白名单。

---

第五步,电话通知。

钉钉官方没直接接口,但可以曲线救国:

· 机器人把告警丢到 Kafka

· 另一个用 .NET 写的 Consumer 收到后,调用阿里云语音通知 API

· 电话内容就是“服务异常,请立刻登录查看”,

语速调到 0.8,半夜被吵醒也不至于太暴躁

---

有人担心容器里跑 .NET 会不会太胖。

实测 Alpine 镜像 + ReadyToRun,

冷启动 1.2 秒,内存 60M,

比隔壁 Python 镜像轻一半。

---

最后留个小坑:

钉钉的 processQueryKey 可以查单聊消息已读状态,

但文档里没写清楚,

得先调 `
robot/query_message_status`,

再用 `chatid` 去拼,

拼错就 404。

别问我是怎么知道的,昨晚刚踩完。

---

如果你也在值班表里,

试试把机器人升级成“会打电话的小秘书”。

代码扔 GitHub,README 写两行就能跑。

跑通了回来聊,

看看谁家的告警电话铃声最魔性。

最近发表
标签列表