skills/feishu-cli-slides/SKILL.md
飞书 Slides 演示文稿。slides create 从 XML 模板创建演示文稿(POST /open-apis/slides_ai/v1/xml_presentations); slides media-upload 上传媒体(drive upload_all + parent_type=slide_file,单文件 ≤20MB 不支持分片)。 当用户请求"创建飞书 ppt"、"上传幻灯片"、"演示文稿"、"slides"时使用。 不适用:复杂 slide 编辑(block insert/replace 复杂语义)暂未实现,走 lark-slides。
npx skillsauth add riba2534/feishu-cli feishu-cli-slidesInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
通过 feishu-cli slides 创建空白演示文稿,并把本地图片以 slide_file 媒体形式上传到该演示文稿,
返回的 file_token 可直接在 slide XML 中作为 <img src="..."> 引用。
feishu-cli:如尚未安装,请前往 riba2534/feishu-cli 获取安装方式。
范围声明:本技能只覆盖「创建空白演示文稿」+「上传媒体」两个最小可用动作。如需在已有 演示文稿里做复杂 slide 编辑(block insert/replace 等),目前 CLI 未实现,请改走 官方
lark-slides客户端或 OpenAPI 直调。
| 命令 | 调用的 API | 产物 | 用途 |
|------|------------|------|------|
| slides create | POST /open-apis/slides_ai/v1/xml_presentations | xml_presentation_id | 后续所有 slides 操作的 ID(不是普通 docx token) |
| slides media-upload | POST /open-apis/drive/v1/medias/upload_all (parent_type=slide_file) | file_token | 可直接放进 slide XML 的 <img src="..."> |
关键约束:
slide_file 是 slides 后端唯一接受的 parent_type(lark-cli 实测:slide_image / slides_image /
slides_file 都会被拒)parent_node 必须传 xml_presentation_id(而不是 docx token 或 file_token)upload_all,不支持 upload_prepare 多分片,所以单文件硬限 20 MBslides create 在 CLI 内部用 --title/--width/--height 拼成最小可用 XML 模板再 POST:
<presentation xmlns="http://www.larkoffice.com/sml/2.0" width="960" height="540">
<title>演示文稿标题</title>
</presentation>
当前版本不暴露
--xml-file参数让你直接传整个 presentation XML——只能通过--title/--width/--height影响这个最小模板。如需复杂初始内容,先create拿到xml_presentation_id,再走 lark-slides 或后续 CLI 扩展。
--user-access-token 或 FEISHU_USER_ACCESS_TOKEN
可切换 User Token(推荐用 User Token,以个人身份创建,便于后续直接在飞书里编辑)slides create | slides:presentation:create 或 slides:presentation:write_only |
| slides media-upload | docs:document.media:upload |feishu-cli auth check --scope "slides:presentation:create docs:document.media:upload"slides create — 创建空白演示文稿# 最简用法(默认尺寸 960x540,title="Untitled")
feishu-cli slides create
# 指定标题
feishu-cli slides create --title "Q2 OKR"
# 自定义宽高(像素)
feishu-cli slides create --title "Wide Deck" --width 1920 --height 1080
# JSON 输出(脚本接力时常用,方便 jq 取 xml_presentation_id)
feishu-cli slides create --title "Demo" --output json
# 以用户身份创建(推荐,演示文稿归属个人)
feishu-cli slides create --title "Demo" --user-access-token <u-xxx>
关键参数:
| 参数 | 说明 | 默认值 |
|------|------|--------|
| --title, -t | 演示文稿标题 | Untitled |
| --width | 幻灯片宽度(像素) | 960 |
| --height | 幻灯片高度(像素) | 540 |
| --output, -o | 输出格式(留空 = 文本摘要,json = JSON) | 文本摘要 |
| --user-access-token | 显式传 User Token | 不传走 App Token |
两层默认值分工:
--title在 cobra flag 注册时默认为空字符串、--width/--height注册为0(见cmd/slides_create.go:78-80);运行时由 client 层(internal/client/slides.go:49-58) 把空 title 注入为Untitled、把非正数尺寸注入为标准 16:9 的960x540。所以「未传」≠「传 0」≠「报错」, 三者最终都会走到同一个默认值。
返回:
Slides 演示文稿已创建:
xml_presentation_id: <id>
title: Q2 OKR
revision_id: 1
xml_presentation_id 就是后续 media-upload --presentation-token 要传的值。
slides media-upload — 上传媒体到演示文稿# 上传封面图
feishu-cli slides media-upload \
--file ./cover.png \
--presentation-token <xml_presentation_id>
# JSON 输出,方便 jq 接力拿 file_token
feishu-cli slides media-upload \
--file ./cover.png \
--presentation-token <xml_presentation_id> \
--output json
关键参数:
| 参数 | 说明 | 必填 |
|------|------|------|
| --file | 本地图片路径(≤ 20 MB) | 是 |
| --presentation-token | 目标演示文稿的 xml_presentation_id | 是 |
| --output, -o | 输出格式(留空 = 文本摘要,json = JSON) | 否 |
| --user-access-token | 显式传 User Token | 否 |
返回:
图片上传成功:
file_token: <token>
file_name: cover.png
size: 123456 bytes
presentation_id: <xml_presentation_id>
提示: 在 slide XML 中可用作 <img src="<token>"/>
# 1. 创建空白演示文稿
PRES_ID=$(feishu-cli slides create --title "Q2 OKR" --output json | jq -r '.xml_presentation_id')
# 2. 上传封面图,拿到 file_token
FILE_TOKEN=$(feishu-cli slides media-upload \
--file ./cover.png \
--presentation-token "$PRES_ID" \
--output json | jq -r '.file_token')
# 3. 现在 $FILE_TOKEN 可以拼到 slide XML 的 <img src="..."> 里
echo "presentation: $PRES_ID, cover: $FILE_TOKEN"
PRES_ID=$(feishu-cli slides create --title "Photo Deck" --output json | jq -r '.xml_presentation_id')
for img in ./assets/*.png; do
feishu-cli slides media-upload \
--file "$img" \
--presentation-token "$PRES_ID" \
--output json | jq -r '"\(.file_name) -> \(.file_token)"'
done
| 场景 | 改走 |
|------|------|
| 在已有演示文稿里插入/修改/删除 slide 或 block | lark-slides(官方 CLI)或 OpenAPI 直调 slides_ai/v1/... 编辑接口 |
| 直接传整个 presentation XML 模板 | 暂未暴露 --xml-file,等 CLI 扩展或 OpenAPI 直调 |
| 单文件 > 20 MB 的媒体 | 拆分小图,或直接走飞书客户端上传 |
| 把 markdown / docx 转成 slides | 暂不支持,建议先转 docx 再用飞书客户端导出 |
| 普通文档(不是演示文稿)上传媒体 | 走 feishu-cli-drive 技能(drive upload) |
parent_type 不要乱改:源码里硬编码 slide_file,且经 lark-cli 实测唯一可用值。
自己改成 slide_image / slides_image / slides_file 都会被服务端拒绝upload_prepare 多分片接口不接受 parent_type=slide_file,
CLI 在 client 侧也做了 20 MB 硬检查,超过会在本地直接报错(不会发请求)xml_presentation_id ≠ docx token:这是 slides 模块独立的标识符,不要拿去当
docx:document_id 或 drive:file_token 用--user-access-token 让产物归个人,能直接在「我的空间」找到medias/upload_all 自动推断 MIME| 错误 | 原因 | 解决 |
|------|------|------|
| --file 不能为空 / --presentation-token 不能为空 | 必填参数缺失 | 检查命令行参数 |
| 读取文件失败 / --file 必须是普通文件 | 路径错或不是 regular file | 检查路径、不要传符号链接到目录 |
| 文件 X 大小 Y 字节超过 slides 上传限制(20 MB) | 文件超过 20 MB | 压缩 / 切分,slides 后端硬限不可绕过 |
| 创建 slides 失败: code=99991663, msg=... | scope 不够 | auth check --scope "slides:presentation:create" 然后重新 auth login --domain slides --recommend |
| 创建 slides 失败: HTTP 400, body: ...invalid xml_presentation... | XML 模板异常(一般 title 含未转义字符触发) | CLI 已做 XML escape,若仍出现请 issue |
| 上传报 parent_type invalid 或类似 | 走的不是 slide_file(如直接 curl 调 medias/upload_all 时传错) | 用 CLI 而不是手敲 curl,CLI 已锁定 slide_file |
cmd/slides_create.go / cmd/slides_media_upload.go / internal/client/slides.gotools
飞书多维表格(Bitable/Base)操作。底层使用 base/v3 新 API,支持视图完整配置写入、 记录 upsert、记录批量获取、记录附件上传下载、记录修改历史、角色 CRUD + 协作者增删、 多维表格本体重命名/高级权限开关、数据聚合查询、 仪表盘 + 仪表盘块 CRUD、表单 + 表单问题 CRUD、工作流 CRUD 等。 当用户请求"创建多维表格"、"操作数据表"、"添加记录"、"查询记录"、"管理字段"、 "多维表格"、"base"、"bitable"、"数据表"、"视图排序"、"视图过滤"、"视图分组"、 "角色"、"role"、"高级权限"、"advperm"、"数据聚合"、"data query"、 "仪表盘"、"dashboard"、"表单"、"form"、"工作流"、"workflow"、"记录附件"、 "复制多维表格"时使用。 支持 --as bot|user|auto 身份切换:默认 auto(User 优先、Tenant 兜底), --as bot 用 App Token 操作多维表格,无需 auth login、永不过期, 适合 cron / 无人值守 / 脚本自动抓取多维表格内容。 凡涉及"App Token 读写 bitable"、"不登录抓多维表格"、"cron 定时同步多维表格"、 "bitable 报需要 User Token / 91403 没权限"时也应使用本技能。
tools
在飞书云文档里画**会动的图 / 可交互图表 / 数据大屏**——妙笔BOX 是飞书文档里唯一能真实跑 CSS/JS 的载体 (iframe 沙箱)。能画:ECharts 全家桶(折线/柱/饼/雷达/散点/热力/桑基/漏斗/仪表/K线/箱线/平行坐标/旭日/treemap/ 力导向关系图/时序/甘特)、真实地图与经纬度飞线、echarts-gl 3D(map3D/3D柱/3D散点/3D曲面)、Three.js 真 3D 场景、 词云、水球、纯 CSS 动画、Canvas 粒子、SVG 矢量动画、KPI 滚动大屏。 当用户要"在飞书文档里画图/做动画/能动的图/可交互图表/数据大屏/Dashboard/折线图/柱状图/地图/飞线图/3D图/ 关系图/流程动画/ECharts/可视化",或要做**能调 AI / 读写多维表 / 持久化状态 / 拿用户身份的交互式文档小程序**, 或提到"妙笔BOX/HTML 小组件/让飞书文档里的图动起来/嵌入网页到飞书文档/window.magic"时, **必须用本技能**。注意:要"动"只能用妙笔BOX;画板(feishu-cli-board)的 SVG 节点会被服务端栅格化成静态图、不会动。
tools
飞书 OpenAPI 裸调。api GET/POST/PUT/DELETE/PATCH <path> 直接调用任意飞书 OpenAPI 接口, 覆盖 feishu-cli 尚未封装的接口(对齐 lark-cli 的 api 能力)。支持 --params(query)/--data(body JSON)/--data-file(从文件读 body)/ --as auto|user|bot 身份/--dry-run 预览/-o 二进制下载/--format/--jq。 当用户请求"调用 X API"、"裸调飞书接口"、"feishu-cli 没封装的接口怎么调"、"raw api"、 "用 api 命令发请求"、"下载飞书媒体/文件 binary"时使用。 不适用:仅查 schema 不调用(用 feishu-cli schema);已有专用命令的高频场景(用对应 feishu-cli <模块>)。
tools
飞书电子表格高级能力(筛选视图 + 筛选条件 + 下拉单元格 + 浮动图片 + 批量样式)。 filter-view CRUD 管理筛选视图,filter-view condition CRUD 写筛选条件(V3 API); dropdown set/get/update/delete 管理单元格下拉框(V2 dataValidation); image get/update/media-upload/write-image 操作浮动图片与单元格写图; batch-set-style 批量设置多范围单元格样式。 基础读写(read/write/style/add-rows/add-sheet)仍在 feishu-cli 主命令 sheet/bitable, 本 skill 专注高级能力。 当用户请求"筛选视图"、"筛选条件"、"加下拉框"、"数据验证"、"列下拉"、"浮动图片"、"插入图片"、"批量样式"时使用。