一次从”收不到图”到”成功发送”的折腾经历
兄弟们,今天记录一下我让严主任(我的AI助手)学会通过飞书发送图片的全过程。说实话,一开始我以为这事儿很简单,结果踩了不少坑,最后还是搞定了。
事情的起因
我想让严主任截个图发给我,看看我的博客首页效果。结果他说”发送成功了”,但我这边啥也没收到。这就尴尬了。
问题出在哪? 飞书机器人发送消息和发送图片,完全是两码事。
飞书机器人的消息 vs 图片
先说个坑:飞书机器人发文本消息和发图片,机制完全不一样。
- 文本消息:直接通过webhook接口post过去,简单粗暴
- 图片消息:需要先上传图片到飞书服务器,获取一个叫
image_key的东西,然后再用webhook发送
这就好比你要给朋友寄东西:
- 发短信 = 直接打电话说
- 发图片 = 先把东西存到快递柜,拿到取件码,再告诉朋友取件码
多了一步,但这一步卡了很多人。
解决步骤(实战记录)
第一步:确认权限
首先得确认你的飞书机器人有发送图片的权限。登录[飞书开放平台](https://open.feishu.cn/app/),找到你的应用,检查权限管理:
需要的权限:
im:message:send_as_bot—— 以机器人身份发送消息docs:document.media:upload—— 上传媒体文件
这两个权限有了,才能继续往下走。
第二步:获取 tenant_access_token
这是最关键的一步。tenant_access_token相当于你的”通行证”,没有它你连飞书服务器的门都进不去。
获取方式:
curl -X POST \
"https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal" \
-H "Content-Type: application/json" \
-d '{
"app_id": "你的app_id",
"app_secret": "你的app_secret"
}'
返回:
{
"code": 0,
"expire": 7200,
"msg": "ok",
"tenant_access_token": "t-xxxxx"
}
注意:这个token有效期只有2小时(7200秒),过期了要重新获取。
第三步:上传图片获取 image_key
拿到token后,把图片上传到飞书服务器:
curl -X POST \
"https://open.feishu.cn/open-apis/im/v1/images" \
-H "Authorization: Bearer {tenant_access_token}" \
-F "image_type=message" \
-F "image=@/path/to/your/image.png"
返回:
{
"code": 0,
"data": {
"image_key": "img_v3_02v8_xxxxxx"
},
"msg": "success"
}
这个image_key就是取件码,记下来,下一步要用。
第四步:发送图片到群聊
最后一步,用webhook发送图片:
curl -X POST \
-H "Content-Type: application/json" \
-d '{
"msg_type": "image",
"content": {
"image_key": "img_v3_02v8_xxxxxx"
}
}' \
"https://open.feishu.cn/open-apis/bot/v2/hook/{你的webhook_key}"
收到{"code":0,"msg":"success"},搞定!
完整流程图
本地图片
↓
获取 tenant_access_token(用app_id和app_secret)
↓
上传图片到飞书服务器 → 获得 image_key
↓
使用 image_key 通过 webhook 发送
↓
飞书群聊收到图片 ✅
几个坑和注意事项
- token会过期:
tenant_access_token只有2小时有效期,长时间运行的服务需要定时刷新
- 权限要开对:很多人卡在权限上,记得检查
im:message:send_as_bot和docs:document.media:upload
- 私聊 vs 群聊:飞书机器人私聊发图片可能有额外限制,建议用群聊机器人
- 图片大小:太大(几MB以上)的图片可能会上传失败,建议压缩到500KB以内
代码实现(Node.js)
如果你也是用Node.js,可以参考这段代码:
const puppeteer = require('puppeteer-core');
async function getTenantToken(appId, appSecret) {
const response = await fetch(
'https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal',
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ app_id: appId, app_secret: appSecret })
}
);
const data = await response.json();
return data.tenant_access_token;
}
async function uploadImage(token, imagePath) {
const formData = new FormData();
formData.append('image_type', 'message');
formData.append('image', fs.createReadStream(imagePath));
const response = await fetch('https://open.feishu.cn/open-apis/im/v1/images', {
method: 'POST',
headers: { 'Authorization': Bearer ${token} },
body: formData
});
const data = await response.json();
return data.data.image_key;
}
async function sendImageToFeishu(webhookUrl, imageKey) {
const response = await fetch(webhookUrl, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
msg_type: 'image',
content: { image_key: imageKey }
})
});
return response.json();
}
实际应用场景
这个功能搞定后,使用场景就多了:
- ✅ 监控截图:服务器异常时自动截图告警
- ✅ 报表发送:定时发送数据可视化图表
- ✅ 操作记录:关键操作后截图留痕
- ✅ 演示辅助:远程协助时实时截图说明
总结
飞书机器人发图片比发文本复杂,主要是多了一个”上传获取image_key”的步骤。但一旦跑通,就能让AI助手具备完整的图片发送能力。
核心要点:
- 获取
tenant_access_token - 上传图片获取
image_key - 使用
image_key通过webhook发送
希望这篇记录对你有帮助。如果你也在折腾飞书机器人,欢迎留言交流。
*文章配图:OpenClaw官方网站首页*
标签: #OpenClaw #飞书机器人 #API集成 #AI助手 #技术实战 #图片发送
推荐阅读:
- [OpenClaw官方文档](https://docs.openclaw.ai)
- [飞书开放平台API文档](https://open.feishu.cn/document)
- [Puppeteer截图教程]
