Install
openclaw skills install feishu-whiteboard-extract从飞书白板(Whiteboard)中提取所有图片节点的 file_token,用于后续下载/OCR/归档。文档类补充能力。
openclaw skills install feishu-whiteboard-extract从飞书白板/画板(whiteboard)里提取所有图片节点对应的 file_token,便于后续把图片下载到本地做 OCR/归档。
定位:文档/资料处理链路的补充能力(不是会话发消息)。
node skills/feishu-whiteboard-extract/extract_images.js <whiteboard_id>
# 说明:当前 SDK 调用路径为 client.board.v1.whiteboardNode.list
脚本输出 JSON:
whiteboard_idcountimages[]:每项包含 node_id 与 file_token拿到 file_token 后,可用:
skills/feishu-drive-download/scripts/download.js <file_token> 下载feishu_drive 工具下载extract_images.js,用于下载/OCR)export_board_svg.js,用于复核与归档)# 直接输出到 stdout(优先返回 SVG,若服务端降级则可能返回 PNG/JPG)
node skills/feishu-whiteboard-extract/export_board_svg.js <whiteboard_id>
# 输出到文件(会按响应 Content-Type 自动修正扩展名)
node skills/feishu-whiteboard-extract/export_board_svg.js <whiteboard_id> /tmp/board_full.svg
实现说明:
GET /open-apis/board/v1/whiteboards/:whiteboard_id/download_as_imageAccept 优先请求 image/svg+xml,并兼容 png/jpeg fallbackimage/svg+xml,保存为 .svg.png/.jpg/.gif)建议将整板全图落盘到交付目录:
# 单白板交付
node skills/feishu-whiteboard-extract/export_board_svg.js <whiteboard_id> appendix/board_full.svg
# 多白板交付(避免覆盖)
node skills/feishu-whiteboard-extract/export_board_svg.js <whiteboard_id> appendix/<whiteboard_id>_full.svg
这一节总结了白板链接提取 ID、常见报错定位、以及推荐的端到端工作流。
whiteboard_id / token 从哪里来?如何从链接中提取?在飞书里,"白板/画板"通常以链接形式分享。脚本入参一般需要 whiteboard_id(或你在 SDK/API 里看到的 whiteboard token)。
不同租户/环境的域名可能不一样,但路径形态通常类似:
直接白板链接
https://<host>/board/<whiteboard_id>https://<host>/board/<whiteboard_id>?from=...带路由前缀/应用前缀(本质仍然能在路径中找到板子的 token)
https://<host>/base/board/<whiteboard_id>https://<host>/workspace/board/<whiteboard_id>分享链接(share)/短链跳转
https://<host>/board/share/<share_token>https://<host>/s/<short_token>经验:能从链接里直接看到的那段"看起来像 ID/token"的字符串,优先当作候选。
/ 分割,找到 board 或 whiteboard 后面的那一段。?whiteboard_id=... / ?token=... 之类的参数里。whiteboard_id。建议:让用户直接粘贴浏览器地址栏最终落地的 URL,比转发的分享卡片/短链更稳定。
当白板是作为 Docx 的嵌入块出现时,feishu_doc.read 可能读到的正文几乎为空。这时最稳定的做法是:
feishu_doc.list_blocksblock_type = 43 的块(whiteboard embed)whiteboard_id / whiteboard.token(字段名可能因版本不同略有差异)示例(伪代码/思路):
feishu_doc.list_blocks(doc_token) → 找到 block_type == 43 → 复制里面的 whiteboard tokennode skills/feishu-whiteboard-extract/extract_images.js <whiteboard_id> > images.json
典型坑:分享链接里的 share token 不是 whiteboard_id。
- 表现:用 share token 跑脚本经常 404 / 看起来"找不到"
- 修复:用"最终落地的白板 URL"里的真实 id,或直接从 Docx 的
block_type=43block 里取 token
拿到 images.json 后,把 images[].file_token 接到下载链路:
# 下载单个:
node skills/feishu-drive-download/scripts/download.js <file_token>
# 批量下载(示例):
# jq -r '.images[].file_token' images.json | while read -r t; do node skills/feishu-drive-download/scripts/download.js "$t"; done
medias 接口,不是 files 接口!这是一个高频踩坑点,已实际触发过 403:
| 接口 | 路径 | 白板节点图 |
|---|---|---|
| ❌ 错误 | drive/v1/files/{file_token}/download | → 403 Forbidden |
| ✅ 正确 | drive/v1/medias/{file_token}/download | → 200 OK |
白板节点图片的 file_token 属于媒体文件,必须走 medias 端点。
download_media.js 已修复为直接 HTTP 调用(而非 SDK,规避 SDK 内部路由歧义)。
无需用户级 token,tenant_access_token 即可下载。
files 端点而不是 medias 端点(见上方)whiteboard_id 提取错了(拿了 share token 当 whiteboard_id)排查要点:
medias vs files)。whiteboard_id 是否来自最终落地链接。常见原因:
whiteboard_id 格式不合法(包含多余字符、截断、把整段 URL 当 ID 传入)排查要点:
method undefined / xxx is not a function(SDK path 版本差异)这类错误通常不是权限问题,而是 SDK 调用路径/版本差异:
client.xxx.yyy.list(),但当前 SDK 版本实际是另一条路径client.board.v1.whiteboardNode.list排查要点:
@larksuiteoapi/node-sdk 版本与代码里的调用路径是否匹配。目标:白板 → 图片节点 → 下载图片 → OCR → 结构化输出/回填。
提取图片 token
node skills/feishu-whiteboard-extract/extract_images.js <whiteboard_id> > images.json
拿 file_token 下载图片
从 images.json 里取出 images[].file_token
下载(使用修复后的脚本,走 medias 端点):
# 推荐:download_media.js(已修复为 medias 端点,tenant token 即可)
node skills/feishu-whiteboard-extract/download_media.js <file_token> <save_path>
# 批量下载示例:
jq -r '.images[].file_token' images.json | while read -r t; do
node skills/feishu-whiteboard-extract/download_media.js "$t" "output/$t.png"
done
⚠️ 不要用
feishu-drive-download/scripts/download.js下载白板节点图——那个脚本走files端点,白板图片会 403。
OCR / 图像理解
image 工具做 OCR/识别node_idfile_tokenlocal_pathocr_textkey_points / todo / entities(按你的业务需要)回填/结构化输出
只描述操作要点(不涉及任何凭证):
经验:"分享给我个人能打开"不代表"分享给 bot/app 能访问"。需要明确把应用加入协作。
appSecret(包括从环境变量或 ~/.openclaw/openclaw.json 读取到的值)