飞书案例库接入(Feishu Case Library Pipeline)
把飞书多维表格(Base)+ Wiki 文档里的案例素材,完整接入本地 Web 项目的可执行流水线。沉淀自「提示词宇宙」项目实战(124 条 wiki 提示词 + 562 条视频案例)。
核心结论(先读,避免踩坑)
- lark-cli 调用必须用完整 node 路径:
<NODE_BIN> <LARK_RUN_JS> <args>,Git Bash 直接跑lark-cli会路径错乱。- NODE_BIN =
C:/Users/Administrator/.workbuddy/binaries/node/versions/22.22.2/node.exe - LARK_RUN_JS =
C:/Users/Administrator/.workbuddy/binaries/node/cli-connector-packages/node_modules/@larksuite/cli/scripts/run.js
- NODE_BIN =
- 执行前必须清代理:
unset HTTP_PROXY HTTPS_PROXY ALL_PROXY http_proxy https_proxy all_proxy,否则 device-flow poll 报proxyconnect tcp: dial tcp 127.0.0.1:10809。 --output必须相对路径(lark-cli 限制),且 cwd 必须是项目根目录。- 原始文件下载会被 403 拦截(base +record-download-attachment / docs +media-download / drive +download 全 403,即使 scope 全齐)。突破口:
drive +preview --type source_file走预览通道可下载原分辨率文件(与飞书记录 size 完全一致);--type mp4_480p可得 480P 压缩版。 - 授权:
auth login --scope "<scopes>" --no-wait --json拿 device_code + verification_url →auth qrcode <url> --output qr.png生成二维码给用户扫 → 用户授权后auth login --device-code <code>完成。注意:scope 全在(auth scopes 确认过)但下载仍 403 时不是 OAuth 问题,是资源级限制,改走 preview 通道。
执行流程
1. 解析链接拿 token
# base 多维表格
node run.js base +url-resolve --url "<base_url>" --as user # 返回 base_token
# wiki 文档
node run.js docs +fetch --doc "<wiki_url>" --doc-format markdown --as user # 直接抓全文
2. 读取 base 内容
node run.js base +base-block-list --base-token <T> --as user # 看有哪些表/仪表盘
node run.js base +field-list --base-token <T> --table-id <tbl> --as user # 字段结构
node run.js base +record-list --base-token <T> --table-id <tbl> --as user --limit 200 --offset <N> --json # 分页记录
- 记录 JSON 结构:
data.data= 行数组(按字段顺序),data.record_id_list= 对应 record_id,data.has_more= 是否还有下一页。附件字段值是[{file_token,name,size}]数组。 - 分页:
--limit最大 200,用--offset翻页直到has_more:false。
3. 生成前端数据文件(三个 JS 常量)
feishu_cases_data.js→const FEISHU_CASES={total, cats:[{name,count,samples:[前3文件名]}]}(品类聚合,供列表页)feishu_wiki_cases.js→const WIKI_CASES=[{id:"w001",title,type,text}](按##标题切分 wiki 全文,classify 归类,text 不截断)feishu_videos_full.js→const FEISHU_VIDEOS={total, cats:[{name,count,videos:[{rec,name,size,tok}]}]}(完整清单含 record_id + file_token,供下载)- 数据文件放项目根,index.html 用
<script src="..."></script>引入(放在主<script>前)。 - 注意:生成的 JS 里中文用
\n转义、双引号要干净,写完后用new Function()验证语法。
4. server.js 增加下载 API(可复用现有 server)
POST /api/feishu-download:接收{cat, videos:[{rec,name,tok}], quality:'source'|'480p', limit},NDJSON 流式返回{"type":"progress",done,total,ok}行 + 结尾{"type":"done",downloaded,failed,videos:[{name,url}]}。- 单条下载命令:
node run.js drive +preview --file-token <tok> --type source_file --output "videos/<cat>/<name>.mp4" --if-exists overwrite --as user
# 480P: --type mp4_480p,文件名 <base>_480p.mp4
GET /api/local-videos:扫描videos/<cat>/*.mp4返回[{cat,name,url}]。- 静态服务对中文目录必须
decodeURIComponent(p),否则 404。 - 硬上限建议
MAX_DL_LIMIT=200防误触全量;下载前弹窗让用户确认条数(默认 60)。
5. 前端接入模式
- 列表页:品类聚合表格 + 品类 tab 筛选 + 「查看案例」弹窗(样例文件名 + 下载按钮)。
- 下载:弹确认框(品类/总条数/清晰度/预估体积 = 条数×10MB 或 1.7MB + 条数 pill)→ 流式进度 → 完成后刷新本地区。
- 本地视频区:按品类分组(组标题 + 数量 + 原/480P 计数 + 「+补充下载」入口),卡片区分清晰度徽章,点击
openVideoPlayer弹窗<video>播放。 - 姊妹项目复用:把三个数据 JS 复制到目标项目目录 + 引入 + 加入口按钮即可。
坑位清单
| 现象 | 原因 | 解法 | |---|---|---| | device-flow poll network error 10809 | 系统代理未开 | 前置 unset 全部 proxy 环境变量 | | Cannot find module g:\c... | Git Bash 路径转换 | 用完整 node 路径调用 run.js | | --output unsafe path | lark-cli 要相对路径 | cwd=项目根 + 相对路径 | | 下载 403(三通道) | 资源级限制非 OAuth | drive +preview --type source_file | | /videos/服装/xxx.mp4 404 | 静态路由未解码 | serveStatic 里 decodeURIComponent | | wiki 只抓到 2 条 | WebFetch 截断 | 用 lark-cli docs +fetch 拿全文 | | 中文 cat 乱码 | shell 编码 | 用 node fetch 传 body(Buffer utf8) | | eval 里 FEISHU_VIDEOS 未定义 | eval 作用域 | 把 const 换成 globalThis. 再 eval,或用 vm |
参考文件
- references/lark-cli-commands.md:常用 lark-cli 命令速查
- references/server-download-api.md:server.js 下载 API 实现要点
- references/frontend-integration.md:前端接入与交互模式
Scan to join WeChat group