Install
openclaw skills install @thcjp/feishu-file-sender飞书发送普通文件与图片附件,支持file_key两步上传与image_key图片稳定链路。飞书机器人发送文件附件技能。覆盖普通文件(HTML/ZIP/PDF/代码文件等)与图片两类链路,。支持自动化配置和灵活的参数设置,适适用于多种业务场景,提高工作效率和质量。覆盖普通文件(HTML/ZIP/PDF/代码文件等)与图片两类链路,
openclaw skills install @thcjp/feishu-file-sender功能说明: 本技能涵盖 自动化配置和灵活的参数设置、化配置和灵活的参数设置 等核心能力。
飞书机器人发送文件附件需要区分两条链路:普通文件走 im/v1/files 拿 file_key 后发 msg_type=file;图片走 im/v1/images 拿 image_key 后发 msg_type=image。混用会导致用户在飞书里看到路径文本而不是文件本体.
本技能封装两条链路的稳定调用方式,并提供针对"本地图片路径被发成路径文本"故障的可靠补救脚本.
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| input | string | 是 | 飞书发文件处理的输入数据或指令 |
| options | object | 否 | 附加配置选项,如模式选择、格式偏好等 |
| callback_url | string | 否 | 异步处理完成后的回调通知URL |
| 能力 | 免费版 | 付费版 |
|---|---|---|
| 基础功能 | 支持 | 支持 |
| 飞书发文件飞书发送 | 不支持 | 支持 |
| 多渠道消息批量发送 | 不支持 | 支持 |
| 消息模板与变量注入 | 不支持 | 支持 |
| 送达状态实时回调 | 不支持 | 支持 |
| 通信记录归档与检索 | 不支持 | 支持 |
| 依赖项 | 类型 | 是否必需 | 获取方式 |
|---|---|---|---|
| LLM API | API | 必需 | 由Agent内置LLM提供 |
需要配置对应API Key,详见上文环境配置章节
API Key配置方式:
export API_KEY="${API_KEY:?请设置环境变量}"
配置后需重启会话或开启新终端生效。API Key应妥善保管,避免泄露到版本控制系统.
详细的输入输出格式请参考下方章节说明。
python3 (请参考skill目录中的脚本文件) <file_path> <open_id> <app_id> <app_secret> [file_name]
参数说明:
file_path:要发送的文件本地路径(HTML/PDF/ZIP/代码文件等)open_id:接收者 open_id,从 inbound_meta 的 chat_id 字段获取,格式 user:ou_未指定,取 ou_未指定 部分app_id:飞书应用 ID,从 skill-platform.json 的 channels.feishu.appId 读取app_secret:飞书应用密钥,从 skill-platform.json 的 channels.feishu.appSecret 读取file_name:可选,自定义文件名,不填则用原文件名快速读取应用配置:
grep -A 2 '"feishu"' /root/.skill-platform/skill-platform.json | grep -E '(appId|appSecret)'
完整示例:
python3 /root/.skill-platform/workspace/skills/feishu-send-file/(请参考skill目录中的脚本文件) \
/root/myfiles/report.html \
ou_abc123def456 \
cli_a1b2c3d4e5f6g7h8 \
secretAbCdEfGhIjKlMnOp \
weekly-report.html
Step 1 - 获取 app_access_token 并上传文件:
TOKEN=$(curl -s -X POST "https://open.feishu.cn/open-apis/auth/v3/app_access_token/internal" \
-H "Content-Type: application/json" \
-d '{"app_id":"<APP_ID>","app_secret":"<APP_SECRET>"}' \
| python3 -c "import json,sys; print(json.load(sys.stdin)['app_access_token'])")
# ...
FILE_KEY=$(curl -s -X POST "https://open.feishu.cn/open-apis/im/v1/files" \
-H "Authorization: Bearer $TOKEN" \
-F "file_type=stream" \
-F "file_name=<文件名>" \
-F "file=@<文件路径>" \
load(sys.stdin)['data']['file_key'])")
Step 2 - 发送文件消息:
curl -s -X POST "https://open.feishu.cn/open-apis/im/v1/messages?receive_id_type=open_id" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d "{\"receive_id\":\"<OPEN_ID>\",\"msg_type\":\"file\",\"content\":\"{\\\"file_key\\\":\\\"$FILE_KEY\\\"}\"}"
当本地图片路径(尤其是 /root/myfiles/...)通过 message 工具 media 参数发送后,用户在飞书里看到的是 📎 /root/myfiles/未指定.png 路径文本而不是图片本体,说明本地媒体上传链路已降级为路径回显。此时不要重试同一参数组合,直接改走本技能的稳定图片上传脚本.
关键判断:messageId 返回成功不等于用户真的看到图片。唯一成功标准是用户在飞书里实际看到图片本体.
python3 (请参考skill目录中的脚本文件) <image_path> <open_id> <app_id> <app_secret> [domain]
中国版飞书示例:
python3 /root/.skill-platform/workspace/skills/feishu-send-file/(请参考skill目录中的脚本文件) \
/root/myfiles/generated-images/demo.png \
ou_abc123def456 \
cli_a1b2c3d4e5f6g7h8 \
secretAbCdEfGhIjKlMnOp
国际版 Lark 加第四个参数 lark:
python3 (请参考skill目录中的脚本文件) /root/myfiles/demo.png ou_未指定 cli_未指定 secret_未指定 lark
im/v1/files 获取 file_key,msg_type=fileim/v1/images 获取 image_key,msg_type=image两条链路不可混用。把本地路径直接塞给 msg_type=file 的 content 字段只会回显路径文本.
输入:CI 流水线生成的 HTML 测试报告路径 /root/myfiles/coverage.html、接收者 ou_未指定、飞书应用凭证
输出:用户在飞书会话中收到 coverage.html 文件附件,可点击预览或下载
输入:周报 PDF /root/reports/weekly.pdf、群聊 chat_id、应用凭证
输出:群聊中收到 PDF 附件消息,所有群成员可见可下载
输入:本地生成的图片 /root/myfiles/generated-images/demo.png、接收者 ou_未指定、应用凭证
输出:用户在飞书中看到图片本体,而非 📎 /root/myfiles/...png 路径文本
输入:同一份报告需同时投递给中国版飞书用户与国际版 Lark 用户
输出:分别调用 send_file.py 与 send_image.py 的 lark 域名参数,两边用户均收到文件本体
某用户反馈飞书机器人发送的 HTML 报告,接收方只看到 📎 /root/myfiles/report.html 文本,无法点击预览.
排查步骤:
message 工具的 filePath 参数直传本地路径python3 /root/.skill-platform/workspace/skills/feishu-send-file/(请参考skill目录中的脚本文件) \
ou_abc123def456 \
cli_a1b2c3d4e5f6g7h8 \
secretAbCdEfGhIjKlMnOp \
report.html
需要将 /root/reports/2026-W28.pdf 推送到部门群聊 oc_def678ghi901.
操作:
receive_id_type 从 open_id 改为 chat_idpython3 /root/.skill-platform/workspace/skills/feishu-send-file/(请参考skill目录中的脚本文件) \
/root/reports/2026-W28.pdf \
oc_def678ghi901 \
cli_a1b2c3d4e5f6g7h8 \
secretAbCdEfGhIjKlMnOp \
2026-W28-周报.pdf
用户通过 message 工具 media 参数发送 /root/myfiles/generated-images/banner.png,飞书侧显示 📎 /root/myfiles/generated-images/banner.png 路径文本.
补救步骤:
media 参数python3 /root/.skill-platform/workspace/skills/feishu-send-file/(请参考skill目录中的脚本文件) \
/root/myfiles/generated-images/banner.png \
ou_abc123def456 \
cli_a1b2c3d4e5f6g7h8 \
secretAbCdEfGhIjKlMnOp
现象:curl 返回 app_access_token 为空或 HTTP 401
原因:app_id 或 app_secret 错误、应用已被停用
处理:核对 skill-platform.json 中 channels.feishu.appId 与 appSecret,确认应用在飞书开放平台处于启用状态
现象:上传到 im/v1/files 返回 code 230002
原因:文件大小超过 30MB 限制,或 file_type 取值非法
处理:确认文件不超过 30MB;普通文件一律用 file_type=stream,不要用 pdf、opus 等枚举值
现象:调用 im/v1/messages 返回 code 230001
原因:receive_id 格式错误或机器人未与接收者建立会话
处理:open_id 应为 ou_ 开头的纯 ID(不含 user: 前缀);首次发送需接收者先向机器人发过任意消息建立会话
现象:messageId 返回成功,但用户侧看到 📎 /root/myfiles/未指定.png
原因:本地路径场景下 message 工具 media 链路降级,未真正走 im/v1/images
处理:立即改用 (请参考skill目录中的脚本文件),走 im/v1/images 获取 image_key 后发 msg_type=image
现象:国际版用户调用 open.feishu.cn 返回 404
原因:国际版需走 open.larksuite.com 域名
处理:send_image.py 传入第四个参数 lark;手动调用时将所有 URL 的 open.feishu.cn 替换为 open.larksuite.com
现象:向 chat_id 发送返回 230002
原因:机器人未被加入该群聊,或 chat_id 格式错误
原因细节:chat_id 应为 oc_ 开头
处理:将机器人拉入目标群聊;确认 receive_id_type=chat_id 与 chat_id 类型匹配
现象:file_name 含中文或特殊字符时上传返回 400
原因:curl -F 参数编码问题
处理:使用脚本化调用,Python 脚本内部已处理编码;手动调用时确保 file_name 与本地文件名一致且为 UTF-8
现象:Step 1 拿到 file_key 后延迟较久,Step 2 发送返回 file_key 无效
原因:file_key 有效期有限,通常需在获取后立即使用
处理:两步操作应连续执行,不要间隔超过数分钟;脚本化调用已自动连续执行
messageId 返回成功只代表消息已投递到飞书服务器,不代表用户看到文件本体。如果用户看到的是 📎 /root/... 路径文本,说明本地路径被降级回显,需要改用本技能的两步上传链路或 send_image.py 脚本.
飞书 API 设计上,普通文件走 im/v1/files 获取 file_key,图片走 im/v1/images 获取 image_key,两条链路的 msg_type 分别为 file 与 image。混用会导致文件无法正确渲染.
从 inbound_meta 的 chat_id 字段获取,格式为 user:ou_未指定,取 ou_未指定 部分。群聊场景从消息事件的 event.message.chat_id 获取,格式为 oc_未指定.
脚本化调用时给 send_image.py 传入第四个参数 lark。手动调用时将所有 URL 的 open.feishu.cn 替换为 open.larksuite.com,token 获取接口同步替换.
是的。普通文件一律使用 file_type=stream,这是飞书 API 对通用文件的统一类型。pdf、opus、mp4 等枚举值仅用于特定媒体类型,普通文件使用会导致上传失败.
飞书要求用户先主动向机器人发过任意消息建立会话,机器人才能主动推送消息。首次发送返回 230001 时,需引导用户先向机器人发送一条消息.
file_key 与 image_key 有有效期,获取后需立即使用,不适合异步流水线长时间间隔| 操作步骤 | 手动耗时 | 自动化耗时 | 时间节约 | 准确率提升 |
|---|---|---|---|---|
| 上传文件到飞书 | 5分钟 | 1分钟 | 4分钟 | 100% |
| 发送文件到指定用户 | 3分钟 | 1分钟 | 2分钟 | 100% |
| 发送图片到飞书 | 5分钟 | 1分钟 | 4分钟 | 100% |
| 发送图片到指定用户 | 3分钟 | 1分钟 | 2分钟 | 100% |
| 批量发送文件和图片 | 30分钟 | 5分钟 | 25分钟 | 100% |
| 对比维度 | 本技能 | 手动操作 | Python脚本 | 专业软件 |
|---|---|---|---|---|
| 操作便捷性 | 高 | 低 | 中 | 高 |
| 功能全面性 | 高 | 低 | 中 | 高 |
| 适应性 | 高 | 低 | 中 | 高 |
| 成本 | 低 | 高 | 中 | 高 |
| 维护难度 | 低 | 高 | 中 | 高 |
| 痛点 | 描述 | 影响范围 | 解决方案 | 量化效果 |
|---|---|---|---|---|
| 文件发送效率低 | 手动发送文件耗时且易出错 | 影响工作效率和用户体验 | 自动化发送文件 | 节省时间90% |
| 图片发送错误 | 图片发送失败或发送错误格式 | 影响图片展示效果 | 图片稳定发送机制 | 减少错误率80% |
| 链路混用问题 | 混用链路导致文件路径显示 | 影响文件展示效果 | 两条链路稳定调用方式 | 减少错误率90% |
| 风险项 | 等级 | 防护措施 | 验证方法 |
|---|---|---|---|
| API密钥泄露 | 高 | 通过环境变量配置,禁止硬编码 | 定期检查代码和配置文件 |
| 命令执行风险 | 高 | 仅执行白名单命令,避免拼接用户输入 | 使用沙箱环境测试 |
| 网络通信安全 | 中 | 使用HTTPS协议,验证SSL证书 | 定期检查证书有效期 |
| 敏感数据暴露 | 高 | 输出结果中不包含密钥、令牌等敏感信息 | 日志脱敏审查 |
| 未授权访问 | 中 | 限制访问权限,实施认证机制 | 定期审计访问日志 |