网站首页 > 教程文章 正文
“凌晨两点,线上崩了,群里@全体,没人回。
”
这不是段子,是上周隔壁组的真实事故。
钉钉群机器人响是响了,可值班同学手机静音,第二天才看到。
于是有人开始琢磨:能不能让机器人直接打电话?
答案是可以,而且用 .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 写两行就能跑。
跑通了回来聊,
看看谁家的告警电话铃声最魔性。
猜你喜欢
- 2025-09-18 MoneyPrinterPlus:AI自动短视频生成工具-阿里云配置详解
- 2025-09-18 干货!教你免费又快速地提取短视频中的文案
- 2025-09-18 Flyme AIOS 2发布:任务机器人多轮交互,语音助手支持方言
- 2025-09-18 2025年7款文字转语音免费软件对比评测谁是最佳选择?
- 2025-09-18 阿里端出最强语音模型!英文rap精准转文字,准确率干翻全球
- 最近发表
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- mybatis plus page (35)
- vue @scroll (38)
- 堆栈区别 (33)
- 什么是容器 (33)
- sha1 md5 (33)
- navicat导出数据 (34)
- 阿里云acp考试 (33)
- 阿里云 nacos (34)
- redhat官网下载镜像 (36)
- srs服务器 (33)
- pico开发者 (33)
- https的端口号 (34)
- vscode更改主题 (35)
- 阿里云资源池 (34)
- os.path.join (33)
- redis aof rdb 区别 (33)
- 302跳转 (33)
- http method (35)
- js array splice (33)