Install
openclaw skills install feishu-file-manager飞书云盘文件管理技能。用于读取、下载和管理飞书云盘中的文件。 当用户需要:访问飞书文件、下载文档、读取PDF/Word/PPT文件、分析飞书云盘内容时使用。 核心方法:使用 tenant_access_token 调用 Drive API 下载文件,解析内容返回给用户。
openclaw skills install feishu-file-manager飞书凭据在 ~/.openclaw/openclaw.json 中:
{
"channels": {
"feishu": {
"appId": "cli_xxx",
"appSecret": "xxx"
}
}
}
curl -s -X POST 'https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal' \
-H 'Content-Type: application/json' \
-d '{"app_id": "cli_xxx", "app_secret": "xxx"}'
返回:{"tenant_access_token": "t-xxx", "expire": 7200, "msg": "ok"}
Token 有效期:约 2 小时,超时后重新获取
| 链接格式 | Token 位置 |
|---|---|
/file/XXXXX | XXXXX |
/docx/XXXXX | XXXXX |
/drive/folder/XXXXX | XXXXX |
curl -s -X GET 'https://open.feishu.cn/open-apis/drive/v1/files/{file_token}/download' \
-H 'Authorization: Bearer {tenant_access_token}' \
-o /tmp/filename.ext
| 文件类型 | 读取方法 |
|---|---|
| .docx | Python unzip 解析 word/document.xml |
| pdftotext 或 pdf 工具 | |
| .pptx | python-pptx 库 |
| .xlsx | openpyxl 库 |
| 权限 scope | 说明 |
|---|---|
drive:drive | 云盘能力总览 |
drive:file | 文件基础操作 |
drive:file:readonly | 只读文件 |
drive:file:download | 下载文件 |
drive:drive:readonly | 只读云盘元信息 |
| 权限 scope | 说明 |
|---|---|
docx:document | 文档基础能力 |
docx:document:readonly | 只读文档内容 |
docx:document:write_only | 写入文档 |
| 权限 scope | 说明 |
|---|---|
sheets:spreadsheet | 表格基础能力 |
sheets:spreadsheet:read | 读取表格 |
| 权限 scope | 说明 |
|---|---|
bitable:app | 多维表格应用 |
bitable:app:readonly | 只读多维表格 |
| 权限 scope | 说明 |
|---|---|
wiki:wiki | 知识库基础 |
wiki:node:read | 读取知识库节点 |
curl -s 'https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal' \
-H 'Content-Type: application/json' \
-d '{"app_id": "cli_xxx", "app_secret": "xxx"}'
{"msg": "ok"} = 有效{"msg": "invalid app_id or app_secret"} = 无效curl -s 'https://open.feishu.cn/open-apis/drive/v1/files/{file_token}' \
-H 'Authorization: Bearer {token}'
{"code": 99, "msg": "file not found"} = 无权限或文件不存在curl -s 'https://open.feishu.cn/open-apis/drive/v1/files?parent_node={folder_token}' \
-H 'Authorization: Bearer {token}'
| 错误码 | 含义 | 解决方案 |
|---|---|---|
| 99 | 文件不存在/无权限 | 检查 token 或文件是否分享给机器人 |
| 404 | API 路径错误 | 检查 API URL |
| 401 | Token 过期 | 重新获取 tenant_access_token |
| 10001 | 系统错误 | 稍后重试 |
from zipfile import ZipFile
import re
def read_docx(filepath):
with ZipFile(filepath) as z:
with z.open('word/document.xml') as f:
content = f.read().decode('utf-8')
text = re.sub(r'<[^>]+>', '', content)
return ' '.join(text.split())
pdftotext file.pdf - | head -100
from pptx import Presentation
def read_pptx(filepath):
prs = Presentation(filepath)
text = []
for slide in prs.slides:
for shape in slide.shapes:
if hasattr(shape, "text"):
text.append(shape.text)
return '\n'.join(text)
curl -I .../download 获取 Content-Length