钉钉机器人 FeedCard 消息列表样式不显示,最常见原因是图片链接未强制使用 HTTPS 协议或 JSON payload 中 links 字段结构错误。该问题适用于自定义 webhook 机器人发送消息场景,调整前需备份原有发送代码以防业务中断。
先说结论:样式不显示通常是客户端安全策略拦截了非 HTTPS 资源或消息体字段缺失,需优先检查图片链接协议和 JSON 结构完整性。
- 先确认:图片 URL 是否以 https://开头且可公开访问
- 先处理:修正 JSON 中 links 数组的 title、messageURL、picURL 字段
- 再验证:发送测试消息并在钉钉手机端查看渲染效果
命令速用版
使用 curl 命令直接调用 webhook 接口测试消息结构,快速排除代码封装问题。
curl 'https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"msgtype": "feedCard",
"feedCard": {
"links": [
{
"title": "测试标题",
"messageURL": "https://www.example.com",
"picURL": "https://www.example.com/image.png"
}
]
}
}'为什么会这样
钉钉客户端对富媒体消息的资源加载有严格的安全策略,非 HTTPS 图片会被静默拦截。
FeedCard 消息类型依赖客户端渲染引擎,当 picURL 指向 HTTP 资源、私有内网地址或不可达链接时,客户端为了安全不会显示图片占位,导致列表样式看起来缺失或不完整。此外,如果 JSON 结构中缺少必填字段,接口虽可能返回成功,但客户端无法构建 UI 组件。
分步处理
按顺序检查配置和响应,每一步都需确认结果后再进行下一步。
步骤 1:检查 JSON 结构完整性
适用场景:所有发送失败或样式异常场景。
操作动作:核对发送 payload 是否包含 msgtype 为 feedCard,且 feedCard 对象内有 links 数组。
验证结果:JSON 校验工具解析无报错。
风险边界:修改字段名可能导致旧版本客户端兼容性问题。
步骤 2:检查图片链接协议
适用场景:图片不显示但文字正常。
操作动作:将 picURL 强制改为 HTTPS 链接,确保证书有效。
验证结果:浏览器无痕模式可直接打开图片。
风险边界:部分旧图床可能不支持 HTTPS,需更换存储源。
步骤 3:检查接口响应码
适用场景:消息未送达或完全无反应。
操作动作:捕获 HTTP 响应 body,检查 errcode 字段。
验证结果:errcode 为 0 表示发送成功。
风险边界:errcode 为 0 仅代表服务器接收成功,不代表客户端渲染成功。
怎么验证是否生效
通过钉钉手机端实际渲染效果确认,而非仅依赖接口返回。
1. 发送测试消息后,打开钉钉移动端对应群聊。
2. 观察 FeedCard 卡片是否展示图片缩略图、标题和链接。
3. 点击卡片,确认 messageURL 能否正常跳转。
4. 若仍不显示,查看钉钉客户端日志或使用另一台设备测试,排除本地缓存问题。
常见坑
以下场景容易导致样式异常,操作时需谨慎。
1. HTTP 图片链接:钉钉强制要求 HTTPS,HTTP 链接会被过滤。
2. 特殊字符未转义:标题中包含双引号或换行符未转义,导致 JSON 解析失败。
3. 图片尺寸过大:虽然公开资料中没有看到可靠的量化数据,但过大的图片可能导致加载超时或不显示。
4. 机器人安全设置:群机器人开启了 IP 白名单或关键词过滤,导致消息被拦截。
常见问题
FeedCard 消息支持多少条列表项?
公开资料中没有看到可靠的量化数据,建议控制在 5 条以内以保证渲染性能。
为什么接口返回成功但手机端没消息?
可能是机器人被禁用或群聊设置了消息免打扰,需检查群机器人管理状态。
图片链接需要公网可访问吗?
是的,钉钉服务器和客户端都需要能直接访问该 URL,内网地址无法显示。
参考来源
1. 钉钉开放平台,自定义机器人接入文档,https://open.dingtalk.com/document/robots
2. 钉钉开放平台,消息类型说明,https://open.dingtalk.com/document/robots/message-types