飞书 CLI `docs +media-download` 完全指南:下载文档素材与画板缩略图
飞书 CLIdocs media-download完全指南下载文档素材与画板缩略图【免费下载链接】cliThe official Lark/飞书 CLI tool, maintained by the larksuite team — built for humans and AI Agents. Covers core business domains including Messenger, Docs, Base, Sheets, Calendar, Mail, Tasks, Meetings, and more, with 200 commands and 20 AI Agent Skills.项目地址: https://gitcode.com/gh_mirrors/cli414/cli导读本文以 lark-cli 官方技能文档 lark-doc-media-download.md 为主体系统讲解docs media-download命令的使用场景、参数语义、底层 API 调用链与扩展名自动补全机制。读完本文你将掌握从飞书云文档中提取图片/文件素材 token 并安全下载到本地的完整流程理解media与whiteboard两种资源类型的差异并能独立排障权限HTTP 403与限流错误。命令定位它解决什么问题docs media-download是 lark-cli 中负责下载文档内嵌资源的命令覆盖两类资源文档素材media文档中引用的图片或文件附件通过file_token定位画板缩略图whiteboard白板画板页面的缩略图通过whiteboard_id定位。它的核心特性是当--output指定的路径不带扩展名时命令会根据响应头的Content-Type或Content-Disposition中的文件名自动补全扩展名避免手动猜测文件类型。在源码中该命令被注册为Service: docs、Command: media-download、Risk: read只读操作定义于 shortcuts/doc/doc_media_download.go并挂载在docs命令组下见 shortcuts/doc/shortcuts.go。选择规则download 与 preview 如何取舍同一文档素材存在两个高度相关的命令需要按用户意图区分场景使用命令用户明确说“下载素材”docs media-download用户只是想查看、预览图片或文件素材优先使用docs media-preview目标明确是画板 / whiteboard / 画板缩略图docs media-download --type whiteboardmedia-preview不支持画板从源码实现看两个命令底层都调用了扩展名自动补全逻辑autoAppendDocMediaExtensionshortcuts/doc/doc_media_ext.go但media-preview仅支持file_token素材不提供--type whiteboard分支而media-download的whiteboard分支会调用完全不同的 API详见下文“底层调用链”。命令用法三种典型场景# 场景一下载图片/文件素材默认 typemedia lark-cli docs media-download --token Z1Fjxxxxxxxx --output ./asset # 场景二指定输出文件名带扩展名则不会自动补全 lark-cli docs media-download --token Z1Fjxxxxxxxx --output ./asset.png # 场景三下载画板缩略图whiteboard token lark-cli docs media-download --type whiteboard --token wbcnxxxxxxxx --output ./whiteboard关于“带扩展名不补全”的细节源码 doc_media_download.go 展示了补全前的处理逻辑whiteboard类型有兜底扩展名fallbackExt .png画板缩略图必然是 PNGmedia类型没有兜底必须依赖响应头推断若--output以filepath.Ext判定为“已有显式扩展名”且不是孤立的.则跳过补全直接按原路径保存若路径以尾点xxx.结尾会先去掉尾点再补全例如typed.→typed.csv这一行为由测试 TestDocMediaDownloadAppendsExtensionForTrailingDotOutput 验证。参数详解必填项与可选语义原文档的参数表如下参数必填说明--token token是资源 token素材为file_token画板为whiteboard_id--output path是本地保存路径不带扩展名会自动补全--type type否media默认或whiteboard结合源码 doc_media_download.go 的 Shortcut 定义还有两个原文档未列出的重要参数参数必填说明--overwrite否bool是否覆盖已存在的输出文件。默认不覆盖若目标文件已存在命令返回FailedPrecondition错误并提示“use --overwrite to replace”--as否身份选择user或bot。该命令的AuthTypes声明为[user, bot]--as user代表用户本人下载--as bot代表应用身份下载参数校验与安全约束执行时会先做两类校验doc_media_download.gotoken 校验validate.ResourceName(token, --token)校验资源名合法性失败返回InvalidArgument输出路径安全校验runtime.ResolveSavePath(outputPath)只接受相对路径。这与共享规则一致——lark-shared 明确规定--file、--output等路径参数只接受 cwd 下的相对路径传绝对路径会报unsafe file path详见 skills/lark-shared/SKILL.md 安全规则第 5 条。补全扩展名后的最终路径同样会再次校验。下载完成后命令以 JSON 形式输出结果doc_media_download.go{ saved_path: ./asset.png, size_bytes: 20480, content_type: image/png }底层调用链两条 API 路径--type决定最终请求的 OpenAPI 端点这一逻辑在 doc_media_download.go 中明确--type media默认GET /open-apis/drive/v1/medias/{token}/download--type whiteboardGET /open-apis/board/v1/whiteboards/{token}/download_as_image两者的差异不仅在端点还体现在权限预检上media模式在下载前会调用common.CheckDriveFileExportPermission(runtime, token)检查当前身份是否具备文档素材的导出权限对应 dry-run 中的第一步请求GET /open-apis/drive/v1/permissions/{token}/members/auth?typefileactionexportwhiteboard模式跳过导出权限预检直接请求画板下载端点。这些差异可由 dry-run 输出与测试验证TestDocMediaDownloadDryRunIncludesExportAuthBeforeDownload 断言media模式 dry-run 包含 2 个 API先导出权限检查、后媒体下载TestDocWhiteboardDownloadDryRunSkipsExportAuth 断言whiteboard模式 dry-run 只有 1 个 API/open-apis/board/v1/whiteboards/.../download_as_image。dry-run 预览能力来自 Shortcut 的DryRun字段doc_media_download.go配合 lark-shared 安全规则“目标命令支持--dry-run时用--dry-run预览危险请求”是调用前的推荐动作。权限与 scope该命令声明的权限 scope 为docs:document.media:download并带有一个条件 scopeDrivePermissionMemberAuthScope仅当需要导出权限检查时才会触发。ConditionalScopes的存在意味着对某些身份/资源命令可能额外需要 Drive 成员权限相关断言见 TestDocMediaDownloadDeclaresConditionalPermissionMemberAuthScope。扩展名自动补全完整优先级链autoAppendDocMediaExtensionshortcuts/doc/doc_media_ext.go按如下优先级推断扩展名显式扩展名优先--output已含非空扩展名非.时直接返回不做任何推断Content-Type 映射解析响应头Content-Type查表docMediaMimeToExtdoc_media_ext.go覆盖常见类型例如image/png → .png、image/jpeg → .jpg、application/pdf → .pdf、text/csv → .csv、video/mp4 → .mp4、application/vnd.openxmlformats-officedocument.wordprocessingml.document → .docx等Content-Disposition 文件名若 Content-Type 未命中则从Content-Disposition: attachment; filename...中提取原文件名扩展名兜底扩展名仅whiteboard类型使用.png兜底media类型若无命中则保持原路径不变。测试 TestDocMediaDownloadAppendsExtensionFromContentTypeMapping 与 TestDocMediaDownloadAppendsExtensionFromContentDispositionFilename 分别验证了第 2、3 条路径后者模拟了Content-Type: application/octet-stream无法映射、但Content-Disposition带drive_registry_config_addition.csv文件名时补全为.csv的场景。token 从哪里来配合lark-doc-fetch使用素材 token 最常见的来源是lark-cli docs fetch返回的文档内容。使用--doc-format xml默认时内嵌资源会以 XML 标签形式出现详见 lark-doc-fetch.md 中“处理文档内嵌资源”一节图片img token... .../文件source token... name.../画板whiteboard token.../提取规则与 fetch 文档一致标签内有url属性时仅当其为可信的公开 HTTPS URL拒绝 userinfo、私有/回环/链路本地/组播/未指定地址 host才可直接下载无url时提取token预览用docs media-preview下载用docs media-downloadwhiteboard一律提取 token 后走docs media-downloadfetch 文档明确指示画板不用 preview。由此形成完整工作流# 第一步获取文档内容提取 token lark-cli docs fetch --doc 文档URL或token --doc-format xml # 第二步根据提取的 token 下载素材 lark-cli docs media-download --token Z1Fjxxxxxxxx --output ./asset排障两类典型错误1. 权限错误permission_denied与 HTTP 403当导出权限预检失败时命令返回permission_denied当下载请求本身返回HTTP 403时错误处理器withDocMediaDownloadRecoveryHintshortcuts/doc/doc_errors.go会在保留原始错误的同时在hint中追加恢复指引Direct document media download returned HTTP 403. To preview the image or file content, trylark-cli docs media-preview --token MEDIA_TOKEN --output path.也就是说遇到 403 时按 hint 改用docs media-preview预览内容见 lark-doc-media-preview.md这是文档推荐的降级路径。注意两点实现细节该 403 恢复提示仅对media类型生效whiteboard 走的是独立 APIwithDocMediaDownloadRecoveryHint明确不把画板下载重定向到 media-preview导出权限检查若返回的是权限类错误如LarkErrAppScopeNotEnabled、LarkErrTokenNoPermission、LarkErrUserScopeInsufficient命令会打印 warning 后继续下载而不是直接中止doc_media_download.go相关行为由 TestDocMediaDownloadPermissionAuthScopeErrorsWarnAndContinue 验证只有检查结果为“明确无权限”allowed false时才在下载前中止。2. 限流错误停止立即重试指数退避限流判定涵盖三类信号doc_errors.go错误子类型SubtypeRateLimit、业务错误码99991400、HTTP 状态码429。命中后 hint 会追加Document media download was rate limited; stop immediate retries and retry later with exponential backoff.即停止立即重试稍后按指数退避重试。相关测试包括 TestDocMediaDownloadHTTP429SuggestsBackoff、TestDocMediaDownloadExportAuthRateLimitPreservesAPIErrorAndSuggestsBackoff 等。其他值得注意的行为覆盖保护默认若目标文件已存在则拒绝写入FailedPrecondition需要显式加--overwrite。该行为由 TestDocMediaDownloadRejectsOverwriteWithoutFlag 验证且覆盖检查发生在扩展名补全之后对最终路径判断HTTP 错误先于落盘暴露请求失败时不会创建半截文件见 TestDocMediaDownloadRejectsHTTPErrorBeforeWrite导出被拒在下载前拦截权限预检不通过时直接报错避免无谓请求见 TestDocMediaDownloadExportDeniedFailsBeforeDownload身份模型命令支持user/bot两种身份--as的选择逻辑与身份权限差异bot 查用户资源返回空成功而非报错参见 skills/lark-shared/SKILL.md。参考文档lark-doc-fetch — 获取文档内容用于提取素材/画板 tokenlark-doc-media-preview — 预览素材403 降级路径、与 download 的选择区分lark-shared — 认证、--as身份模型、相对路径安全规则与 JSON 输出契约【免费下载链接】cliThe official Lark/飞书 CLI tool, maintained by the larksuite team — built for humans and AI Agents. Covers core business domains including Messenger, Docs, Base, Sheets, Calendar, Mail, Tasks, Meetings, and more, with 200 commands and 20 AI Agent Skills.项目地址: https://gitcode.com/gh_mirrors/cli414/cli创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Month-End Closer 波动性注释(Variance Commentary)技能深度解析:从阈值筛选到驱动归因的完整实战指南

Month-End Closer 波动性注释(Variance Commentary)技能深度解析:从阈值筛选到驱动归因的完整实战指南

Month-End Closer 波动性注释(Variance Commentary)技能深度解析:从阈值筛选到驱动归因的完整实战指南 【免费下载链接】financial-services 项目地址: https://gitcode.com/GitHub_Trending/fi/financial-services 导读 波动性注释…

2026/9/21 14:23:42 阅读更多 →
基于UniApp的校园维修小程序开发复盘:从需求到上线全流程

基于UniApp的校园维修小程序开发复盘:从需求到上线全流程

做校园维修小程序这个想法,最早是从一个特别真实的场景冒出来的:宿舍灯管坏了不知道找谁报修,打听一圈终于加上了维修群,结果接单全看缘分;好不容易报了修,又完全不知道师傅什么时候来,只能干等…

2026/9/21 14:22:42 阅读更多 →
2026微生物组与宏基因组分析研讨会前瞻

2026微生物组与宏基因组分析研讨会前瞻

1. 研讨会背景与核心价值微生物组与宏基因组分析作为生命科学领域的前沿方向,正在重塑我们对环境生态、人体健康和工业应用的认知体系。2026年这场专题研讨会将聚焦三大核心突破点:跨组学数据整合分析技术、微生物功能预测算法革新,以及临床转…

2026/9/21 14:22:42 阅读更多 →

最新新闻

React Native鸿蒙跨平台开发:3D翻转动画从入门到实战

React Native鸿蒙跨平台开发:3D翻转动画从入门到实战

1. 从“又要原生又要跨端”说起:为什么我盯上了 React Native 鸿蒙先交代下背景。我手上有一个已经跑了两年的 React Native 项目,之前一直服务 Android 和 iOS 两端,业务迭代节奏很快。今年团队开始评估鸿蒙适配,一开始的想法很简…

2026/9/21 14:48:04 阅读更多 →
ThinkPad X1 Carbon风扇狂转的BIOS根源与静音调优

ThinkPad X1 Carbon风扇狂转的BIOS根源与静音调优

1. 项目概述:为什么X1 Carbon的风扇会“失控”?这不是硬件故障,而是BIOS策略在说话ThinkPad X1 Carbon风扇狂转——这几乎是Gen7到Gen10用户最常遇到的“伪故障”。你刚打开电脑,键盘还没暖,风扇就嗡嗡作响&#xff0c…

2026/9/21 14:48:04 阅读更多 →
内容降噪实战:Browser-bridge如何实现精准正文提取

内容降噪实战:Browser-bridge如何实现精准正文提取

这阵子我一直在折腾Browser-bridge,一个用来做浏览器页面内容提取与重排的开源工具。说实话,以前它最让人头疼的地方不是解析能力不行,而是抓回来的内容太“脏”——广告、推荐流、弹窗、相关阅读、页脚声明,全都混在正文里&#…

2026/9/21 14:48:04 阅读更多 →
Three.js着色器实现动态熔岩特效技术解析

Three.js着色器实现动态熔岩特效技术解析

1. 熔岩特效的实现价值与技术选型去年为一个游戏项目开发环境特效时,我第一次接触到Three.js的着色器编程。当时需要实现火山场景的熔岩流动效果,传统贴图动画在近距离观察时会出现明显的重复纹理和生硬过渡。最终通过自定义着色器实现的动态熔岩&#x…

2026/9/21 14:48:04 阅读更多 →
元数据驱动的CRM:告别手写CRUD,用ObjectStack+Claude Code重构企业数据建模

元数据驱动的CRM:告别手写CRUD,用ObjectStack+Claude Code重构企业数据建模

1. 这不是“代码生成”,而是企业级数据建模的范式转移我第一次在客户现场看到销售总监用Excel维护37个字段的客户表、手动同步到三个不同系统时,手里的咖啡凉了半杯。那不是懒,是整个CRM领域长期被“CRUD思维”绑架的缩影——我们总在反复造轮…

2026/9/21 14:48:04 阅读更多 →
Android实现Miracast Sink端:从Wi-Fi P2P到H.264解码渲染的完整实战

Android实现Miracast Sink端:从Wi-Fi P2P到H.264解码渲染的完整实战

这项目我做完了,跑了几个月,中间踩了不少坑。坦白说,Miracast Sink端在Android上实现,网上资料大多只讲了Wi-Fi P2P的配对,真正把RTSP协商、RTP收流、H.264解码渲染这条完整链路讲透的,几乎没有。这篇就实操…

2026/9/21 14:47:04 阅读更多 →

日新闻

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and …

2026/9/21 0:00:01 阅读更多 →
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,…

2026/9/21 0:00:01 阅读更多 →
Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

桌面应用AI 应用插件系统 【免费下载链接】Wox A cross-platform launcher that simply works 项目地址: https://gitcode.com/gh_mirrors/wo/Wox 点击查看 免费下载 全功能插件(Full-featured Plugin)是 Wox 三类插件实现方式中能力最完整的…

2026/9/21 0:00:01 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/21 3:13:20 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/21 4:51:05 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/19 23:01:36 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →