如何在钉钉机器人消息中添加-at 特定成员功能实现代码

文章导读
要在钉钉机器人消息中成功@特定成员,必须在发送的 JSON 数据体中包含独立的 at 字段,而不能仅在文本内容中输入@符号。适用于自定义机器人和企业内部机器人 Webhook 场景,需注意手机号必须为 11 位完整号码且机器人安全设置需匹配。
📋 目录
  1. 快速处理思路
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

要在钉钉机器人消息中成功@特定成员,必须在发送的 JSON 数据体中包含独立的 at 字段,而不能仅在文本内容中输入@符号。适用于自定义机器人和企业内部机器人 Webhook 场景,需注意手机号必须为 11 位完整号码且机器人安全设置需匹配。

先说结论:纯文本@符号无法触发通知,必须通过协议字段声明。

  • 适合:自定义机器人或企业内部机器人 Webhook 消息发送。
  • 先看:JSON 顶层必须包含 at 对象,且 atMobiles 或 atUserIds 至少存在一项。
  • 建议:自定义机器人优先使用手机号匹配,企业内部机器人可使用 userid 匹配。

快速处理思路

直接构造包含 at 字段的 JSON payload,通过 HTTP POST 请求发送至 Webhook 地址。以下是一个标准的文本消息@指定人的 JSON 结构示例:

{"msgtype": "text", "text": {"content": "请@张三确认审批"}, "at": {"atMobiles": ["13800000000"], "isAtAll": false}}

若使用 Python 库 DingtalkChatbot,可调用 send_text 方法并传入 at_mobiles 参数。若使用 Java,需手动构建 JSON 字符串并通过 OkHttp 等库发送 POST 请求。

如何在钉钉机器人消息中添加-at 特定成员功能实现代码

为什么会这样

钉钉服务端将消息的渲染展示与通知触发逻辑分离。文本内容中的@符号仅用于界面显示,不会被服务端解析为通知指令;只有当 JSON 数据体中存在独立的 at 字段且满足完整性约束时,服务端才会向指定用户发送红点、声音或角标提醒。这是最表层的认知偏差,混淆了渲染展示与语义触发。

分步处理

第一步:获取 Webhook 地址与安全配置。在钉钉群设置中选择智能群助手添加自定义机器人,复制 Webhook 地址。若开启了加签安全设置,需记录 Secret 用于生成签名;若开启了关键词安全设置,消息内容必须包含设定的关键词。

第二步:构造请求数据。确保 JSON 顶层包含 msgtype、text 和 at 对象。at 对象中 atMobiles 数组内填写被@人的 11 位完整手机号,或 atUserIds 数组内填写企业通讯录返回的 userid。若设置 isAtAll 为 true,则特定名单将被忽略。

第三步:发送 HTTP 请求。使用 curl 或代码库发起 POST 请求,Content-Type 必须设置为 application/json。若配置了加签,URL 需附加 timestamp 和 sign 参数,签名算法为 HMACSHA256。

如何在钉钉机器人消息中添加-at 特定成员功能实现代码

第四步:处理响应结果。检查返回的 errcode 是否为 0。若返回非 0 错误码,需根据错误信息调整 token 或签名配置。

怎么验证是否生效

查看钉钉客户端消息列表,目标用户会话窗口应出现红点或角标提示。进入群聊查看消息,被@用户的昵称应高亮显示。检查 API 返回日志,确认 errcode 为 0 且 errmsg 为 ok。若使用定时任务,需监控日志确认 webhook token 未过期,默认时效可能较短,长期运行任务需具备刷新机制。

常见坑

手机号格式错误:atMobiles 中的手机号必须为 11 位完整号码,不支持脱敏格式,否则无法匹配到具体用户。安全设置不匹配:若机器人开启了关键词防护,消息内容 text.content 中必须包含该关键词,否则请求会被拦截。频率限制:每个机器人每分钟最多发送 20 条消息,大量报警场景需整合信息后发送,避免触发限流。Token 时效:Webhook URL 中的 access_token 可能存在时效,长期运行的 cron 任务若未刷新 token 会导致发送失败。

如何在钉钉机器人消息中添加-at 特定成员功能实现代码

常见问题

为什么消息发出去了但对方没有@提醒?

因为 JSON 数据体中缺少 at 字段或字段内容不匹配。仅在 text.content 中写@符号无效,必须在顶层 at 对象中声明 atMobiles 或 atUserIds。

是否可以@群里的所有人?

可以。将 at 对象中的 isAtAll 字段设置为 true 即可艾特全员,但此时 atMobiles 和 atUserIds 将被忽略,且需管理员授权。

消息内容里还需要手动写@某人吗?

建议写上。虽然 at 字段负责触发通知,但在 text.content 中手动输入@某人可以让消息在聊天窗口中显示得更直观,便于未开启通知的用户查看。

参考来源

  • 钉钉机器人定时发送消息时如何正确@指定人员?_编程语言-CSDN 问
  • 钉钉群里怎么@机器人或指定人员?用代码自动@又该怎么写?
  • 钉钉群聊机器人@某人原来这么简单
  • java 钉钉机器人推送消息怎么艾特个人
  • 钉钉添加自定义机器人,实现每周定时@某人
  • 企业内部机器人群聊实现@人接入指南
  • Java 实现钉钉群发消息并艾特指定人
  • python_在钉钉群@人员发送消息