Skip to content

@ 人

@ 是怎么生效的

请求里的 at 对象带上被 @ 人的手机号(或 isAtAll)——它决定谁收到通知

MARKDOWNACTION_CARD 除此之外还要求消息正文里出现对应的 @手机号 文本, 否则 @ 完全不生效、连通知都没有。插件会自动补上:把 @手机号 追加到消息末尾; 如果你在自定义消息里已经写了 @手机号,插件不会再追加一遍,@ 会留在你写的位置。

TEXT 类型不需要正文里有 @手机号——钉钉会自己把 @ 渲染出来(正文没写就追加到末尾, 写了就在原位渲染),所以插件对 TEXT 类型不做任何追加。

TIP

只有在群内的成员才可被 @。官方说明:非群内成员的手机号会被脱敏,此时 @ 完全不生效、也不会有通知。 如果 @ 没有任何反应,先确认这个手机号是不是机器人所在群的成员。

勾选 通知所有人 时,插件不再把手机号追加到正文:所有人本来就会收到通知,而钉钉在 @所有人 的情况下 不再解析单个手机号,追加上去只会在消息里留下一串没有变成姓名的号码。

各消息类型的差异

消息类型是否支持 @电脑端可点击手机端可点击
TEXT
MARKDOWN
ACTION_CARD
LINK————

「是否支持 @」指的是通知能否送达MARKDOWNACTION_CARD 的 @ 通知是正常送达的, 被 @ 的人会收到提醒;差别只在手机端的显示与交互

手机端 @ 不可点击是钉钉的行为

插件的内置消息使用 ACTION_CARD 类型,因此它的 @ 在手机端不会高亮、也点不开。 这不是插件的问题,钉钉对此有明确说明:

@人是否高亮显示:使用不同类型发送消息,被@后是否高亮显示效果不同。

@效果是否支持高亮
Text类型
Markdown类型
ActionCard类型

机器人发送 Markdown 消息类型@人员,不支持高亮显示。

—— 钉钉开放平台《机器人发送消息类型与@人》

经实测,MARKDOWN / ACTION_CARD 里的 @ 在电脑端会被渲染出来并且可以点击, 手机端则完全不渲染、点不开TEXT 类型两端都可以点击。 换用 atUserIds(钉钉 userId)代替手机号不会改变这一点——决定因素是消息类型,不是标识符。

TIP

@ 的具体样式取决于你是不是被 @ 的那个人(官方对「查看 @ 自己的消息」和「@ 其他人的消息」分别举例), 所以判断 @ 有没有真正生效,看的是能不能点开,而不是颜色。

需要可点击的 @ 怎么办

在 pipeline 中使用 TEXT 类型发送:

groovy
dingtalk(
    robot: 'robot-id',
    type: 'TEXT',
    text: ['构建完成,请查看'],
    at: ['13800000000']
)

代价是 TEXT 类型不渲染任何 markdown:标题、链接、颜色、按钮都不可用, #[文字](链接)<font> 都会原样显示。所以这是一个取舍—— 需要卡片样式就接受手机端的 @ 不可点击,需要可点击的 @ 就接受纯文本。

WARNING

不要为了 @ 的交互效果把内置消息改成 TEXT——内置消息依赖 markdown 渲染标题、状态颜色和两个按钮, 换成 TEXT 后这些都会变成可见的原始标记。