Back to skills
extension
Category: Data & AnalyticsNo API key required

接入飞书(Feishu/Lark)多维表格与 Wiki 文档中的案例库/素材库到本地 Web 项目:读取 base 表格

接入飞书(Feishu/Lark)多维表格与 Wiki 文档中的案例库/素材库到本地 Web 项目:读取 base 表格记录与附件元数据、抓取 wiki 文档全部内容、生成前端数据文件(品类聚合 + 提示词案例 + 视频清单)、下载视频到本地并预览。用户提到「飞书案例库」「飞书多维表格」「飞书 wiki」「天诺集团 AI提示词案例库」「562 条视频」「按品类下载视频」「飞书视频预览」或给出 my.feishu.cn/wiki 或 ecn79ilqgklz.feishu.cn/base 链接时使用。不要用于普通飞书文档编辑、审批、消息等非案例库场景(走 lark-* 对应 skill)。

personAuthor: user_814dbe54hubcommunity

飞书案例库接入(Feishu Case Library Pipeline)

把飞书多维表格(Base)+ Wiki 文档里的案例素材,完整接入本地 Web 项目的可执行流水线。沉淀自「提示词宇宙」项目实战(124 条 wiki 提示词 + 562 条视频案例)。

核心结论(先读,避免踩坑)

  1. 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
  2. 执行前必须清代理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
  3. --output 必须相对路径(lark-cli 限制),且 cwd 必须是项目根目录。
  4. 原始文件下载会被 403 拦截(base +record-download-attachment / docs +media-download / drive +download 全 403,即使 scope 全齐)。突破口:drive +preview --type source_file 走预览通道可下载原分辨率文件(与飞书记录 size 完全一致);--type mp4_480p 可得 480P 压缩版。
  5. 授权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.jsconst FEISHU_CASES={total, cats:[{name,count,samples:[前3文件名]}]}(品类聚合,供列表页)
  • feishu_wiki_cases.jsconst WIKI_CASES=[{id:"w001",title,type,text}](按 ## 标题切分 wiki 全文,classify 归类,text 不截断
  • feishu_videos_full.jsconst 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 |

参考文件