Install
openclaw skills install @thcjp/feishu-file-sender-freeopenclaw skills install @thcjp/feishu-file-sender-free版本: 1.0.0 适用对象: 个人用户、独立开发者、一人公司 核心定位: 飞书文件与图片稳定发送基础工具
飞书文件发送免费版是一款帮助个人用户通过飞书向用户发送普通文件与图片的工具。飞书机器人发送文件需要两步操作:先上传文件获取 file_key(普通文件)或 image_key(图片),再使用 key 发送消息。本工具将这两步流程封装为简洁的脚本,确保文件稳定投递。
工具特别解决了"本地图片路径被发成路径文本"的常见问题——当图片通过常规消息路径发送后用户看到的是路径文本而非图片本体时,本工具的稳定图片上传脚本可直接解决。支持国内版飞书与国际版 Lark,覆盖 HTML、ZIP、PDF、代码文件等各类普通文件格式。免费版聚焦个人文件发送需求,流程清晰、投递可靠。
file_key → 发送 msg_type=file 消息输入: 用户提供普通文件发送所需的指令和必要参数。 处理: 按照skill规范执行普通文件发送操作,遵循单一意图原则。 输出: 返回普通文件发送的执行结果,包含操作状态和输出数据。
im/v1/images 获取 image_key → 发送 msg_type=image输入: 用户提供图片稳定发送所需的指令和必要参数。 处理: 按照skill规范执行图片稳定发送操作,遵循单一意图原则。 输出: 返回图片稳定发送的执行结果,包含操作状态和输出数据。
输入: 用户提供操作方式所需的指令和必要参数。 处理: 按照skill规范执行操作方式操作,遵循单一意图原则。 输出: 返回操作方式的执行结果,包含操作状态和输出数据。
receive_id_type=open_id(ou_xxx)receive_id_type=chat_id(oc_xxx)输入: 用户提供接收者支持所需的指令和必要参数。 处理: 按照skill规范执行接收者支持操作,遵循单一意图原则。 输出: 返回接收者支持的执行结果,包含操作状态和输出数据。 能力覆盖范围:本skill的核心能力覆盖以下场景关键词:飞书文件与图片发、送工具、支持两步上传与稳、定投递、飞书文件发送免费、版是一款面向个人、用户的飞书文件与、图片发送工具、通过两步上传流程、先上传获取、再发送消息、确保文件稳定投递、Use、when、需要文件处理、文档转换、格式互转、内容提取时使用、不适用于加密文件、适用于独立开发者、企业团队和自动化、工作流场景等。这些关键词对应description中声明的使用场景,均已在上述能力点中提供对应的操作支持。
向同事发送生成的 HTML 报告文件。
# 使用脚本一键发送
python3 scripts/send_file.py \
/path/to/report.html \
ou_xxxxxxx \
your_app_id \
your_app_secret \
report.html
输出示例:
📤 文件发送中...
文件: report.html (256 KB)
接收者: ou_xxxxxxx
Step 1: 上传文件...
✅ 上传成功, file_key: file_v3_xxxx
Step 2: 发送消息...
✅ 发送成功!
📋 发送完成: 用户已在飞书中收到 report.html
当常规图片发送失败(用户看到路径文本)时,使用稳定图片发送脚本。
# 稳定发送图片(国内版飞书)
python3 scripts/send_image.py \
/path/to/chart.png \
ou_xxxxxxx \
your_app_id \
your_app_secret
# 国际版 Lark
python3 scripts/send_image.py \
/path/to/chart.png \
ou_xxxxxxx \
your_app_id \
your_app_secret \
lark
向团队发送项目代码的 ZIP 压缩包。
# 先压缩文件
zip -r project.zip project/
# 发送 ZIP 文件
python3 scripts/send_file.py \
project.zip \
oc_xxxxxxx \
your_app_id \
your_app_secret \
project_source.zip
从飞书应用配置中获取 app_id 与 app_secret:
# 查看飞书应用配置
grep -A 2 '"feishu"' config.json | grep -E '(appId|appSecret)'
接收者的 open_id 可从消息回调的 chat_id 字段获取,格式为 user:ou_xxx,取 ou_xxx 部分。
# 发送普通文件
python3 scripts/send_file.py <file_path> <open_id> <app_id> <app_secret> [file_name]
# 发送图片
python3 scripts/send_image.py <image_path> <open_id> <app_id> <app_secret> [domain]
| 参数 | 说明 | 示例 |
|---|---|---|
file_path | 文件路径 | /path/to/report.html |
open_id | 接收者 ID | ou_xxxxxxx |
app_id | 飞书应用 ID | cli_xxxxxxx |
app_secret | 飞书应用密钥 | xxxxxxx |
file_name | 自定义文件名(可选) | report.html |
domain | 域名(图片专用,可选) | lark(国际版) |
结果处理: 执行完成后,查看输出结果确认操作状态。成功时输出包含处理摘要和结果数据;失败时根据错误信息排查问题,查阅错误处理章节获取恢复步骤。
# 完整的文件发送命令
python3 /path/to/scripts/send_file.py \
/home/user/documents/report.html \
ou_abc123def456 \
cli_a1b2c3d4e5f6 \
secret_abcdef123456 \
monthly_report.html
在 AI 助手中通过 exec 调用:
exec(f"""
python3 /path/to/scripts/send_file.py \\
{file_path} \\
{user_open_id} \\
{app_id} \\
{app_secret} \\
{custom_filename}
""")
如果需要手动控制流程,可分两步执行:
Step 1 - 获取 Token 并上传文件:
# 获取 tenant_access_token
TOKEN=$(curl -s -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>"}' \
| python3 -c "import json,sys; print(json.load(sys.stdin)['tenant_access_token'])")
# 上传文件获取 file_key
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=report.html" \
-F "file=@/path/to/report.html" \
| python3 -c "import json,sys; print(json.load(sys.stdin)['data']['file_key'])")
echo "file_key: $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\\\"}\"}"
关键原则: 普通文件与图片使用不同的 API 链路,不要混用。
| 类型 | 上传 API | 获取的 Key | 消息类型 |
|---|---|---|---|
| 普通文件 | im/v1/files | file_key | msg_type=file |
| 图片 | im/v1/images | image_key | msg_type=image |
# 普通文件:使用 send_file.py
python3 scripts/send_file.py report.pdf ou_xxx app_id app_secret
# 图片:使用 send_image.py(不要用 send_file.py 发图片)
python3 scripts/send_image.py chart.png ou_xxx app_id app_secret
唯一成功标准: 用户在飞书中实际看到图片本体。
如果用户看到的是以下内容,说明发送失败:
📎 /path/to/image.png此时应立即改用 scripts/send_image.py 稳定脚本:
# 检测到路径文本,立即切换稳定脚本
python3 scripts/send_image.py /path/to/image.png ou_xxx app_id app_secret
# 压缩大文件
zip -r compressed.zip large_folder/
python3 scripts/send_file.py compressed.zip ou_xxx app_id app_secret
发送到群聊时,使用 chat_id 并替换 receive_id_type:
# 群聊文件发送(需修改脚本中的 receive_id_type)
# 个人用户: receive_id_type=open_id, id=ou_xxx
# 群聊: receive_id_type=chat_id, id=oc_xxx
用户在飞书中看到: 📎 /path/to/file.png
原因: 直接使用了 filePath 参数而非两步上传流程。
解决: 使用本工具的两步流程脚本:
# 普通文件
python3 scripts/send_file.py /path/to/file.pdf ou_xxx app_id app_secret
# 图片(特别重要)
python3 scripts/send_image.py /path/to/image.png ou_xxx app_id app_secret
Error: 文件上传失败
解决: 检查文件路径与权限:
# 确认文件存在且可读
ls -la /path/to/file.pdf
# 已知限制
du -h /path/to/file.pdf
Error: tenant_access_token 获取失败
解决: 检查 app_id 与 app_secret 是否正确:
# 验证凭证
curl -s -X POST "https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal" \
-H "Content-Type: application/json" \
-d '{"app_id":"your_app_id","app_secret":"your_app_secret"}'
解决: 国际版需指定 lark 域名参数:
# 国内版飞书(默认)
python3 scripts/send_image.py image.png ou_xxx app_id app_secret
# 国际版 Lark
python3 scripts/send_image.py image.png ou_xxx app_id app_secret lark
解决: 群聊使用 chat_id 而非 open_id:
# 个人用户
receive_id_type=open_id, receive_id=ou_xxx
# 群聊
receive_id_type=chat_id, receive_id=oc_xxx
| 依赖项 | 类型 | 是否必需 | 获取方式 |
|---|---|---|---|
| LLM API | API | 必需 | 由Agent内置LLM提供 |
| Python | 运行时 | 必需 | 官方网站下载安装 |
| Python 标准库 | 运行库 | 必需 | Python 自带(requests, json) |
| 飞书应用 | 应用 | 必需 | 飞书开放平台创建应用 |
| app_id/app_secret | 凭证 | 必需 | 飞书应用配置页获取 |
| curl | CLI工具 | 可选 | 系统自带(手动两步方式需要) |
tenant_access_token 进行认证| 错误场景 | 原因 | 处理方式 |
|---|---|---|
| 配置错误 | 参数缺失或格式错误 | 检查依赖说明中的配置要求 |
| 运行时错误 | 运行环境不满足 | 确认运行环境符合依赖说明 |
| 网络错误 | 连接超时或不可达 | 执行ping命令测试网络连通性,检查防火墙和代理设置连接后执行ping命令测试网络连通性,检查防火墙和代理设置连接后重新执行命令,参考国内替代方案 |