钉钉自定义机器人通过 Webhook 方式不支持直接发送文件消息,如需传输文件,建议改用企业内部应用接口或先将文件上传至钉盘后分享链接。
先说结论:Webhook 机器人无法直接发文件,大文件需走钉盘中转或切换 API 方式
- 先确认:检查机器人创建方式是自定义 Webhook 还是企业内部应用
- 先处理:超过 2GB 文件先上传至钉盘,生成分享链接
- 再验证:发送后确认群成员能否正常预览或下载
核心差异与选型
钉钉开放平台将机器人消息发送分为两种方式:Webhook 和接口调用。Webhook 设计初衷是轻量级通知,支持文本、Markdown、链接等消息类型,但官方文档明确显示 Webhook 方式不支持 File 文件类型。接口调用方式(企业内部应用)权限更高,支持文件消息,但配置复杂度也更高。此外,普通用户直接上传文件通常限制在 2GB 以内,企业管理员可通过钉盘扩容至更高额度。
方案一:Webhook 机器人 + 钉盘链接(推荐轻量场景)
如果你正在使用自定义 Webhook 机器人且必须发送文件,不要尝试直接调用 file 消息类型,接口会返回错误。推荐采用“钉盘上传 + 链接分享”的组合方案。
1. 上传文件至钉盘
打开钉钉客户端,进入工作台找到“钉盘”。点击上传按钮将文件上传至个人空间或企业空间。注意普通成员单次上传通常限制在 2GB 以内。上传完成后,点击文件右侧更多操作,选择“分享”,务必将权限设置为“公开”或“组织内成员可见”,否则接收者可能无法访问。
2. 构造消息发送请求
构造 JSON payload 时 msgtype 选择 markdown 或 link。将钉盘分享链接放入 content 或 text 字段。
{
"msgtype": "markdown",
"markdown": {
"title": "文件下载通知",
"text": "## 文件已上传\n\n请点击链接下载:\n[点击下载文件](https://钉盘分享链接)"
}
}3. 发送请求命令
使用 curl 发送 POST 请求,确保 Content-Type 设置为 application/json。
curl 'https://oapi.dingtalk.com/robot/send?access_token=YOUR_ACCESS_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"msgtype": "markdown", "markdown": {"title": "文件通知", "text": "## 下载\n[点击这里](https://链接)"}}'方案二:企业内部应用 + 文件消息接口(推荐正式场景)
对于有开发能力的团队,申请企业内部应用权限后调用官方 API 可直接发送文件消息,但需注意单文件大小限制。
1. 获取 access_token
企业内部应用需要先获取全局 access_token。请求地址如下:
https://oapi.dingtalk.com/gettoken?appkey=YOUR_APPKEY&appsecret=YOUR_APPSECRET2. 上传媒体文件
调用媒体上传接口获取 media_id,文件类型 type 设为 file。上传成功后返回 media_id。
3. 构造文件消息请求
msgtype 选择 file,填入上一步获取的 media_id。
{
"msgtype": "file",
"file": {
"media_id": "MEDIA_ID_FROM_UPLOAD_STEP"
}
}4. 发送请求命令
curl 'https://oapi.dingtalk.com/v1.0/robot/oaMessages/send?agentId=YOUR_AGENT_ID' \
-H 'Content-Type: application/json' \
-H 'x-acs-dingtalk-access-token: YOUR_ACCESS_TOKEN' \
-d '{"chatId": "CHAT_ID", "msgtype": "file", "file": {"media_id": "MEDIA_ID"}}'验证与排查
发送后观察钉钉群聊窗口。如果成功,群内应显示一个可点击的链接卡片或文件卡片。点击卡片,确认能跳转到钉盘预览页或直接触发下载。若发送失败,检查返回的 errmsg 字段。
常见错误码与坑
1. Webhook 强行发 file 类型
错误现象:返回 errmsg 包含"invalid msgtype"或"不支持的消息类型"。
原因:Webhook 方式发送 file 类型会直接失败,必须改用 link 或 markdown 类型发送下载链接。
2. 忽略文件大小限制
错误现象:上传中断或发送失败。
原因:即使通过 API 发送,文件本身也受钉盘存储限制。普通账号单文件通常不超过 2GB,超出后上传会中断。不要试图通过 base64 编码将大文件内容塞入文本消息,这会触发长度限制且无法作为文件下载。
3. 链接权限问题
错误现象:成员点击链接提示“无权限访问”。
原因:通过钉盘生成的分享链接可能带有权限控制。发送前请在钉盘设置中确认分享范围是“公开”或“指定人可见”,避免仅限自己可见。
4. Token 失效
错误现象:返回 errmsg"invalid token"或错误码 40003。
原因:企业内部应用 access_token 有效期为 2 小时,过期需重新获取。