
feishu-cli
CLICommunity CLI for Feishu (Lark) focused on two-way conversion between Markdown and Feishu docs; also works with wikis, sheets, Bitable, messages, calendar, tasks and meeting notes, and ships 9 agent skills. Setup creates an app via QR scan; search and mail need extra user authorization.
feishu-cli
飞书开放平台命令行工具 — Markdown 与飞书文档双向转换,AI Agent 的飞书操控引擎
介绍 · 30 秒上手 · 核心能力 · 快速开始 · 命令参考 · AI 技能 · FAQ · 更新日志
feishu-cli 是什么
feishu-cli 是一个功能完整的飞书开放平台命令行工具。它将飞书文档、知识库、电子表格、消息、日历、任务等操作封装为简洁的命令行接口,核心能力是 Markdown ↔ 飞书文档双向无损转换。
除了传统的 CLI 用法,feishu-cli 还为 Claude Code 等 AI 编程助手提供了 9 个开箱即用的领域技能(Skill),让 AI Agent 能够直接创建文档、发送消息、管理权限——无需任何额外配置。
注意:feishu-cli 主要面向 AI Agent(如 Claude Code)使用,通过技能文件让 AI 直接操控飞书。虽然人类也可以直接使用命令行,但大多数场景下建议通过 AI Agent 调用,体验更佳。
为什么选择 feishu-cli
- 双向转换零损耗 — 支持 40+ 种块类型,Markdown 导入飞书后再导出,内容完整保留
- 图表原生渲染 — Mermaid(8 种图表类型)和 PlantUML 自动转换为飞书画板,不是截图,是可编辑的矢量图
- 大规模文档处理 — 三阶段并发管道架构,实测 10,000+ 行 / 127 个图表 / 170+ 个表格一次导入
- P2P 私聊原生可读 —
msg history --user-email一条命令打通「搜用户 → 反查 p2p chat_id → 读消息」,输出自动带sender_names映射,AI Agent 直接拿结构化带名消息流,无需额外查群成员 - AI Agent 原生 — 9 个领域技能覆盖飞书全功能(503 个命令全部归属),AI 助手即装即用
- 为脚本与 Agent 设计的健壮性 — 错拼命令/flag 报错并给拼写建议(绝不静默成功)、写操作
--dry-run、幂等键防重发、统一--jq/--format结构化输出 - 一个工具覆盖全平台 — 文档、知识库、表格、多维表格、消息、邮箱、日历、任务、考勤、OKR、视频会议、妙记、云盘、权限、画板、Slides、事件、Schema、Profile、健康检查
三十秒上手
# 1. 安装(自动识别平台,含 sha256 完整性校验)
curl -fsSL https://raw.githubusercontent.com/riba2534/feishu-cli/main/install.sh | bash
# 2. 一键创建飞书应用并保存凭证(Device Flow,免手工建应用)
feishu-cli config create-app --save
# 3. 把 Markdown 变成飞书文档
feishu-cli doc import README.md --title "我的第一篇文档"
需要用户身份的能力(搜索、审批、邮箱等)再执行 feishu-cli auth login 完成 OAuth 授权即可。详见快速开始。
核心能力
Markdown ↔ 飞书文档
将本地 Markdown 文件一键上传到飞书,或将飞书文档导出为 Markdown。支持完整语法转换:
# 导入:Markdown → 飞书文档
feishu-cli doc import report.md --title "技术报告" --verbose
# 导出:飞书文档 → Markdown
feishu-cli doc export <document_id> -o doc.md --download-images
支持的语法:标题(6 级)、段落、列表(无限深度嵌套)、任务列表、代码块、引用、Callout(6 种类型)、同步块(含跨文档引用)、表格(自动拆分)、分割线、图片、链接、公式、粗体 / 斜体 / 删除线 / 下划线 / 行内代码(<mark> 高亮暂以下划线近似)。跨文档同步块无法读取时会保留带源标识的 WARNING 占位并输出诊断,不会静默导出为空。
Mermaid / PlantUML 图表
Markdown 中的 Mermaid 和 PlantUML 代码块自动转换为飞书画板(可编辑矢量图,非截图):
```mermaid
flowchart TD
A[开始] --> B{判断}
B -->|是| C[处理]
B -->|否| D[结束]
```
| 图表类型 | 声明 | 说明 |
|---|---|---|
| 流程图 | flowchart TD / flowchart LR | 支持 subgraph |
| 时序图 | sequenceDiagram | 参与者建议 ≤ 8 |
| 类图 | classDiagram | |
| 状态图 | stateDiagram-v2 | 必须用 v2 |
| ER 图 | erDiagram | |
| 甘特图 | gantt | |
| 饼图 | pie | |
| 思维导图 | mindmap |
PlantUML 同样支持:时序图、活动图、类图、用例图、组件图、ER 图、思维导图等全部类型(```plantuml 或 ```puml)。
大规模实测导入成功率 >90%,失败图表自动降级为代码块并保留原文,不阻断整篇导入。
智能表格处理
- 列宽自动计算 — 根据内容智能调整,中英文字符区分宽度(中文 14px,英文 8px)
- 列宽自定义(v1.29+,issue #156)— 支持紧邻表格上方注释
<!-- feishu-colwidth: 80,200,*,30% -->(单位 px / 百分比 /*走 auto)或 CLI flag--table-column-width=auto|fixed|N1,N2,...全局覆盖;注释优先级高于 flag。仅doc import/doc add支持——doc content-update走官方原子更新协议不支持自定义列宽,传非auto的 flag 或内容含该注释都会报错 - 大表格保持单表连贯 — 行数超过飞书
create_block9 行限制时,先创建 9 行初始表,剩余行通过insert_table_rowAPI 追加到同一个 block,视觉上为一张连贯的表,不再拆成多张独立表格 - 批量填充加速(v1.29+,issue #159)— 单元格填充改用
batch_updateAPI(每批 ≤30)+ 文档级 3 QPS 节流,典型 4×6×8 表场景从 ~70s 降到 ~3s - 单元格多块内容 — 支持 bullet / heading / text 混合内容
三阶段并发管道
导入大文档时,feishu-cli 使用三阶段并发管道最大化吞吐量:
- 阶段一(顺序) — 按文档顺序创建所有块,收集图表和表格任务
- 阶段二(并发) — 图表 worker 池 + 表格 worker 池并发处理
- 阶段三(逆序) — 处理失败图表,降级为代码块
feishu-cli doc import large-doc.md --title "大文档" \
--upload-images --diagram-workers 5 --table-workers 3 --image-workers 2 --verbose
全功能 API 覆盖
展开 20+ 模块能力总览表
| 模块 | 能力 |
|---|---|
| 文档 | 创建(带本地图片/附件/HTML 块/画板源文件)、导入、导出、大文档选择性读取(doc read:大纲/按标题取节/关键词定位,可转成直接发 IM 的 Markdown)、编辑、批量更新、Callout、画板、文档封面、素材插入/下载/预览、写作草稿与 DocxXML 预检(doc script)、异步导出/导入文件 |
| 思维笔记 | 读取已有思维笔记的节点、新增子节点或更新节点(mindnote nodes list/create) |
| 知识库 | 空间列表、节点增删改查、导出(含整树递归镜像)、移出知识库到云盘(move-to-drive)、空间详情、成员管理 |
| 电子表格 | V2 基础读写 + V3 富文本 API,行列操作、样式、批量样式、合并、查找替换、导出 XLSX/CSV、浮动图片读写、素材上传、单元格写图、筛选视图与筛选条件 CRUD、下拉菜单数据验证、类型保真整表读写 table-get/table-put(数字/日期/布尔 dtype 保真,支持 get→改→put round-trip) |
| 多维表格 | base/v3 + bitable/v1 全覆盖:数据表/字段/记录 CRUD(含批量获取)、记录附件上传/下载/移除、视图配置(filter/sort/group/visible-fields/timebar/card)、仪表盘 CRUD 与智能排版、仪表盘块 CRUD、表单 CRUD 与分享详情/提交、表单问题 CRUD、角色 CRUD 与协作者管理、高级权限、数据聚合、工作流 CRUD、多维表格重命名与权限设置 |
| 消息 | 发送与回复共用 text/Markdown/post/image/file/audio/video/card 内容模型(本地媒体自动上传、幂等键)、转发、合并转发、Pin、表情回复、消息书签(flag create/list/cancel)、搜索群聊(Bot/User 双身份)、历史记录(群聊 / P2P 私聊,支持 --user-email / --user-id 自动反查 p2p chat_id)、批量获取、资源下载、话题回复、发送者名字自动解析(输出顶层 sender_names 映射,覆盖退群成员) |
| 群聊 | 创建、获取、更新、删除、分享链接、成员管理、群列表(chat list,--page-all 全量拉取 + 安全截断告警) |
| 邮箱 | 收件箱分类/搜索、邮件详情(单条/批量/线程)、发送(默认草稿,支持 CID 内联图片自动扫描)、草稿管理(创建/编辑/发送已有草稿)、回复/全部回复/转发、批量改 label/移动文件夹、批量软删进废纸篓、邮件模板 create/list、邮箱签名查看(需 User Token) |
| 日历 | 日历列表、主日历、日程增删改查、搜索、回复邀请、参与者管理、忙闲查询、日程视图(agenda)、智能时段建议、会议室查找、RSVP |
| 任务 | 创建、查看、完成、重新打开、服务端搜索(按创建者/执行者/关注者/完成态/截止时间)、子任务、成员管理、提醒、评论、附件上传、我的任务、任务清单(CRUD + 任务关联 + 成员管理) |
| 视频会议 | 多维搜索(query/主持人/参会者/会议室)、聚合详情(vc detail:会议信息 + note_id + minute_token 一次拿齐,支持会议号反查)、智能纪要(vc note:详情 / 统一逐字稿导出)、会议纪要(三路径批量获取 + AI 产物 + 逐字稿下载)、录制查询、会议机器人入会/离会/会议事件(--as bot|user|auto) |
| 妙记 | 详情 + AI 产物、关键词搜索、权限申请、等待转写就绪(--wait-ready)、媒体批量下载 |
| 审批 | 审批定义与实例详情查询、当前登录用户审批任务查询(待办 / 已办 / 已发起 / 抄送)、发起/撤回/抄送审批实例、通过/拒绝/转交审批任务 |
| 考勤 | 查询用户打卡记录与日/月度考勤统计(tenant token,日期范围最长 31 天) |
| OKR | 周期列表/详情(目标 + 关键结果)、进展记录 CRUD、进展图片上传、`--as bot |
| 权限 | 添加 / 更新 / 删除协作者、批量添加、公开权限管理、分享密码、权限检查、转移所有权 |
| 云盘增强 | 大文件分块上传(>20MB 自动分片)、原地覆盖上传(--file-token)、流式下载、异步导出(docx→markdown 快捷路径 + sheet/bitable CSV)、异步导入、文件夹移动(自动轮询)、富文本评论(wiki URL 解析)、异步任务查询、URL 解析 inspect、权限申请、本地镜像 pull/push/status、v2 搜索、密级标签查询/设置 |
| 原生 Markdown 文件 | Drive .md 文件 create/fetch/overwrite,整体保留 Markdown 源码,不转换为飞书 docx 块;本地比对远端最新与历史版本 |
| 文件 | 云空间文件列表、创建、移动、复制、删除、上传、下载、版本管理(含回滚到历史版本)、元数据、统计 |
| 素材 | 上传 / 下载(图片、文件、音视频) |
| 画板 | 精排绘图(create-notes)、Mermaid / PlantUML 导入、克隆(connector 重映射)、几何质检 lint、SVG 双向(svg-import / svg-export / export-code)、图片上传、覆盖更新(含快照)、截图下载、节点管理 |
| Slides | 创建空白演示文稿、上传媒体到演示文稿 |
| 评论 | 列出、添加、解决/恢复评论、回复管理 |
| 搜索 | 消息搜索(默认返回消息 ID,--enrich 补全内容/发送者/群名/时间)、应用搜索、文档搜索(需 User Access Token) |
| 用户 | 获取用户信息、用户搜索、部门用户列表 |
| 通讯录 | 部门详情、子部门列表 |
| 实时事件 | WebSocket 长连接订阅应用事件(EventKey 列表/schema/consume/status/stop),卡片按钮/表单回调(card.action.trigger)、审批 v4 事件(自动注册服务端订阅)、VC participant/note/recording 事件(User pre-consume,握手后 ready)、Bot 菜单事件 |
| Raw API | api GET/POST/PUT/DELETE/PATCH <path> 裸调任意未封装的 OpenAPI 接口,自动鉴权与错误码处理,支持 dry-run、自定义超时、jq 过滤与 json/pretty/table/ndjson/csv 多格式输出 |
| OpenAPI Schema | 本地查询内置 OpenAPI service/resource/method、路径、参数和 scope,无需 token |
| Profile 多配置 | 多 App / 多账号配置 add/list/use/current/rename/remove/migrate;profile list --json 列出可操作 Bot;全局 --profile / FEISHU_PROFILE 单次切换目录与 User Token(FEISHU_APP_ID/SECRET 仍可覆盖 App 凭证) |
| 健康检查 | doctor 一次检查配置、User Token、端点、代理和本地依赖 |
快速开始
安装
一键安装(推荐)
自动检测平台,下载最新版本并安装到 /usr/local/bin:
curl -fsSL https://raw.githubusercontent.com/riba2534/feishu-cli/main/install.sh | bash
已安装的用户执行同样的命令即可更新到最新版本。
其他安装方式
手动下载
从 Releases 页面下载对应平台的压缩包:
| 平台 | 文件 |
|---|---|
| Linux x64 | feishu-cli_*_linux-amd64.tar.gz |
| Linux ARM64 | feishu-cli_*_linux-arm64.tar.gz |
| macOS Intel | feishu-cli_*_darwin-amd64.tar.gz |
| macOS Apple Silicon | feishu-cli_*_darwin-arm64.tar.gz |
| Windows x64 | feishu-cli_*_windows-amd64.tar.gz |
tar -xzf feishu-cli_*_linux-amd64.tar.gz
sudo mv feishu-cli_*/feishu-cli /usr/local/bin/
使用 go install
go install github.com/riba2534/feishu-cli@latest
从源码编译
git clone https://github.com/riba2534/feishu-cli.git
cd feishu-cli && make build
# 二进制文件输出到 bin/feishu-cli
配置凭证
一键创建应用(推荐)
无需手动访问飞书开放平台后台,一条命令自动完成应用注册:
# 自动创建飞书应用并保存凭证到 ~/.feishu-cli/config.yaml
feishu-cli config create-app --save
执行后终端会输出一个授权链接,用飞书扫码确认即可。CLI 自动获取 App ID 和 App Secret 并写入配置文件,后续命令直接可用。
然后在飞书开放平台的应用权限管理页面为新创建的应用开通所需 scope。最快的方式是复制 权限要求 章节的 JSON,在权限管理页面的 导入权限 入口粘贴即可一次性申请全部。
手动配置(不推荐)
如果你有特殊需求(如企业应用、自定义应用类型),也可以手动配置:
# 方式一:环境变量
export FEISHU_APP_ID="cli_xxx"
export FEISHU_APP_SECRET="xxx"
# 方式二:配置文件
feishu-cli config init # 生成模板后手动编辑填入凭证
(可选)如果需要使用搜索、审批任务查询等需要用户身份的功能,还需完成 OAuth 用户授权:
feishu-cli auth login
验证安装
feishu-cli doc create --title "Hello Feishu"
如果返回文档 ID,说明配置成功。
命令参考
feishu-cli <command> [subcommand] [flags]
Commands:
doc 文档操作(创建、导入、导出、文本级/块级编辑、docs_ai 读取与创建、历史版本、异步导出/导入文件)
wiki 知识库操作(节点增删改查、空间详情、成员管理)
sheet 电子表格(读写、子表名寻址、样式、行列结构/冻结/隐藏、V3 富文本 API、table-get/put、导出 XLSX/CSV、image、filter、dropdown、--as)
bitable 多维表格(base/v3 + bitable/v1:数据表/字段/记录/附件/视图/仪表盘/表单/角色/权限/聚合/工作流,88 命令)
msg 消息操作(发送、转发、合并转发、回复、Pin、表情回复、书签、批量获取、资源下载)
chat 群聊管理(创建、更新、删除、群列表、成员管理)
mail 邮箱操作(分类/搜索、发送、草稿含发送、回复、转发、批量改 label/软删、CID 内联图片、模板、签名)
drive 云盘增强(分块/原地覆盖上传、流式断点续传下载、异步导出/导入、移动、重命名、版本、评论、镜像 pull/push/status、密级标签)
markdown Drive 原生 Markdown 文件 CRUD(.md 整体读写、版本比对,不转换 docx 块)
vc 视频会议(多维搜索、聚合详情、智能纪要 note、会议纪要、录制查询、机器人入会/离会/事件)
minutes 妙记操作(详情 + AI 产物、搜索、权限申请、媒体批量下载)
apps 妙搭(Miaoda)应用(创建、发布 HTML 并等待构建结果、发布记录、修改、访问范围管理)
file 文件管理(列出、移动、复制、删除、上传、下载、版本管理)
media 素材操作(上传、下载)
perm 权限管理(添加、删除、批量添加、公开权限、密码、转移所有权)
calendar 日历操作(日程增删改查、搜索、参与者、忙闲查询、agenda、suggestion、room-find、rsvp)
task 任务操作(增删改查、服务端搜索、子任务、成员、提醒、评论、附件、我的任务)
tasklist 任务清单管理(CRUD、任务关联、成员管理)
attendance 考勤操作(打卡记录查询、统计数据查询)
okr OKR 操作(周期列表/详情、进展记录 CRUD、进展图片上传、--as 身份)
slides Slides 演示文稿(创建带页面、加页/删页/替换、按页读取 XML、截图、媒体上传)
user 用户操作(获取信息、搜索、部门用户列表)
dept 部门操作(详情、子部门列表)
board 画板操作(精排绘图、图表导入、克隆、几何质检 lint、SVG 双向、图片上传、覆盖更新)
comment 评论操作(列出含正文与分页、批量获取、添加、解决/恢复、回复编辑与表情)
approval 审批操作(定义/实例详情、已发起列表、任务查询、实例创建/撤回/抄送、任务通过/拒绝/转交;全部 User Token)
search 搜索操作(消息、应用、文档)
event 实时事件订阅(WebSocket 长连接、list/schema/consume/status/stop)
schema 本地浏览飞书 OpenAPI 方法(无需 token)
api 通用 OpenAPI 透传调用(任意 method/path,自动鉴权 + 错误码翻译,覆盖 2500+ 端点)
profile 多 App / 多账号配置切换
doctor 环境健康检查(config/user_token/endpoints/proxy/deps/catalog/skills 等)
auth 身份认证(OAuth 登录、状态、退出、scope 预检)
config 配置管理
skills 内嵌 AI 技能(list/read/install,与 CLI 版本严格配套)
update 检查并安装最新版本(sha256 校验后原子替换)
通用约定:
- 全局
--yes跳过删除类操作的确认;非交互环境(stdin 不是终端)执行这类操作时必须显式带上,否则以退出码 10 退出且不执行。 - 退出码:0 成功 / 1 一般错误 / 2 用法错误 / 3 鉴权或权限 / 4 网络 / 10 需要确认 / 130 中断。
- 接受 token 的参数大多也接受飞书链接(docx/sheets/base/slides/wiki 等,wiki 链接自动解析到底层文档)。
文档操作
# 创建文档
feishu-cli doc create --title "新文档"
# 导入 Markdown(核心功能,默认上传图片)
feishu-cli doc import doc.md --title "文档标题" --upload-images --verbose
# 导出为 Markdown
feishu-cli doc export <doc_id> -o output.md --download-images
# 大文档选择性读取(大纲 / 按标题取节 / 关键词定位)
feishu-cli doc read <doc_id> --outline
feishu-cli doc read <doc_id> --heading "性能优化"
feishu-cli doc read <doc_id> --keyword "QPS|限流" --context 5
# 导出他人文档(自动从 auth login 读取 User Token,或手动指定)
feishu-cli doc export <doc_id> -o output.md --user-access-token <token>
# 获取文档信息
feishu-cli doc get <doc_id>
# 获取所有块
feishu-cli doc blocks <doc_id> --all
# 添加内容(JSON 格式)
feishu-cli doc add <doc_id> -c '<JSON>'
# 添加内容(Markdown 格式)
feishu-cli doc add <doc_id> README.md --content-type markdown
# 原子更新(docs_ai):纯文本选择器为文本级替换,段落其余内容与样式保留
feishu-cli doc content-update <doc_id> --mode replace_all --selection-with-ellipsis "旧文本" --markdown "新文本"
# 按 block id 精确更新(block id 由 doc read --engine docs_ai --with-ids 获得)
feishu-cli doc read <doc_id> --engine docs_ai --with-ids --scope keyword --keyword "性能"
feishu-cli doc content-update <doc_id> --mode block_replace --block-id <block_id> --markdown "新段落"
# 历史版本
feishu-cli doc history list <doc_id>
# 带内容建文档:内容里的本地资源在建文档后自动上传绑定(<img href="https://..."> 由服务端下载)
feishu-cli doc create --doc-format xml --content-file draft.xml --dry-run # 先预览请求与上传计划
feishu-cli doc create --doc-format xml --content-file draft.xml # draft.xml 可含 <img path="@./a.png"/>、<source path="@./f.pdf"/>、
# <whiteboard type="mermaid" path="@./x.mmd"/>、<html5-block path="@./w.html"/>
# 转成可直接发到 IM 的 Markdown
feishu-cli doc read <doc_id> --doc-format im-markdown --lang en-US
# 文档封面
feishu-cli doc resource update <doc_id> --type cover --file cover.png --offset-ratio-y -0.2
feishu-cli doc resource download <doc_id> --type cover -o ./cover
feishu-cli doc resource delete <doc_id> --type cover
# 写作草稿:初始化工作区 → 写 DocxXML → 解析预检(字数、块分布、资源)
feishu-cli doc script --command init-draft --presentation-decision '{}'
feishu-cli doc script --command parse --content @draft_xxxxxxxx_folder/draft.xml
# 思维笔记节点(需要应用开通 mindnote:node:read / mindnote:node:create)
feishu-cli mindnote nodes list <mindnote_token_or_url>
feishu-cli mindnote nodes create <mindnote_token_or_url> --data @nodes.json --dry-run
# 添加高亮块
feishu-cli doc add-callout <doc_id> "提示内容" --callout-type info
# 批量更新
feishu-cli doc batch-update <doc_id> '[...]' --source-type content
# 异步导出为文件(PDF/DOCX/XLSX)
feishu-cli doc export-file <doc_token> --type pdf -o output.pdf
# 异步导入本地文件为飞书文档
feishu-cli doc import-file local_file.docx --type docx --name "文档名"
知识库操作
feishu-cli wiki spaces # 列出知识空间
feishu-cli wiki get <node_token> # 获取节点
feishu-cli wiki nodes <space_id> # 列出节点
feishu-cli wiki export <node_token> -o doc.md # 导出为 Markdown
feishu-cli wiki export-tree <node_token> -o ./backup # 递归导出知识库子树
feishu-cli wiki create --space-id <id> --title "新节点"
feishu-cli wiki create --space-id <id> --title "快捷方式" --node-type shortcut --origin-node-token <token>
feishu-cli wiki delete <node_token> # 删除节点(官方 API,支持异步任务自动轮询)
feishu-cli wiki move-docs <obj_token> --space-id <id> # 移动云空间文档至知识空间
feishu-cli wiki move-to-drive --node-token wikcnXXX --folder-token fldcnYYY # 反向:移出知识库到云盘
feishu-cli wiki space-get <space_id> # 获取知识空间详情
feishu-cli wiki space-create --name "新知识库" # 创建知识库(v1.29+)
feishu-cli wiki space-list --page-all -o json # 列出所有可见知识库(v1.29+)
feishu-cli wiki node-copy --space-id <src> --node-token <node> --target-space-id <dst> # 复制节点(v1.29+)
feishu-cli wiki delete-space <space_id> --yes # 删除整个知识空间(异步任务自动轮询)
# 知识空间成员管理
feishu-cli wiki member add <space_id> --member-type userid --member-id USER_ID --role admin
feishu-cli wiki member list <space_id>
feishu-cli wiki member remove <space_id> --member-type userid --member-id USER_ID --role admin
电子表格操作
# V2 API - 基础读写
feishu-cli sheet read <token> "Sheet1!A1:C10"
feishu-cli sheet write <token> "Sheet1!A1:B2" --data '[["姓名","年龄"],["张三",25]]'
# V3 API - 富文本支持
feishu-cli sheet read-rich <token> <sheet_id> "sheet!A1:C10"
# 类型保真整表读写(DataFrame 形状,数字/日期/布尔 dtype 保真,支持 get→改→put round-trip)
feishu-cli sheet table-get <token> <sheet_id> [--range A1:D50]
feishu-cli sheet table-put <token> <sheet_id> --sheets-file table.json
feishu-cli sheet write-rich <token> <sheet_id> --data-file data.json
# 行列操作(--start 从 0 开始、--end 不含;或用 --range "3:5"/"B:D",1 起始两端包含)
feishu-cli sheet add-rows <token> <sheet_id> --count 5
feishu-cli sheet add-cols <token> <sheet_id> --count 3
feishu-cli sheet delete-rows <token> <sheet_id> --range "3:5" --dry-run
feishu-cli sheet freeze <token> <sheet_id> --rows 1 --cols 1
feishu-cli sheet update-dimension <token> <sheet_id> --range "B:D" --hidden
# 身份:默认 User 优先、Tenant 兜底;--as bot 强制以应用身份访问应用自己的表格
feishu-cli sheet list-sheets <token> --as bot
# 样式与合并
feishu-cli sheet style <token> "Sheet1!A1:C3" --bold --font-size 14
feishu-cli sheet merge <token> "Sheet1!A1:C1"
消息操作
# 发送文本消息
feishu-cli msg send --receive-id-type email --receive-id user@example.com --text "Hello"
feishu-cli msg send --receive-id-type email --receive-id user@example.com --text "对账" --idempotency-key "bill-001" # 幂等防重发(≤50 字符)
# 发送富文本消息
feishu-cli msg send --receive-id-type email --receive-id user@example.com \
--msg-type post --content-file msg.json
# 搜索群聊(Bot 身份,仅返回 Bot 所在的群)
feishu-cli msg search-chats --query "关键词"
# 搜索群聊(User 身份,可搜到用户所在的群)
feishu-cli msg search-chats --query "关键词" --user-access-token <token>
# 获取群聊历史消息(已 auth login 时自动用 User Token;未登录回落 Bot Token,要求 Bot 在群里)
feishu-cli msg history --container-id <chat_id> --container-id-type chat
# 获取和某人的私聊记录(邮箱入口,自动搜用户 + 反查 p2p chat_id)
feishu-cli msg history --user-email user@example.com --page-size 50 -o json
# 已知 open_id 时直接传
feishu-cli msg history --user-id ou_xxx --page-size 50 -o json
# 输出 JSON 自动携带顶层 sender_names 映射(open_id → 姓名),AI Agent 可直接引用
# {"items":[...], "sender_names":{"ou_abc":"张三","ou_def":"李四"}}
# 转发消息
feishu-cli msg forward <message_id> --receive-id <id> --receive-id-type email
# 回复消息
feishu-cli msg reply <message_id> --text "回复内容"
feishu-cli msg reply <message_id> --image /path/to/photo.png --idempotency-key "photo-reply-001"
# 回复到既有话题:传话题内 om_xxx 消息 ID,不要把 omt_xxx 传给 msg send
feishu-cli msg reply om_xxx --file /path/to/report.pdf
# 合并转发
feishu-cli msg merge-forward --receive-id user@example.com --receive-id-type email --message-ids id1,id2
# 消息加急
feishu-cli msg urgent <message_id> --user-id-type open_id --user-ids ou_xxx,ou_yyy
feishu-cli msg urgent <message_id> --urgent-type phone --user-id-type user_id --user-ids u_123,u_456
feishu-cli msg urgent <message_id> --urgent-type sms --user-id-type union_id --user-ids on_xxx,on_yyy
# 表情回复
feishu-cli msg reaction add <message_id> --emoji-type THUMBSUP
feishu-cli msg reaction remove <message_id> --reaction-id REACTION_ID
feishu-cli msg reaction list <message_id>
# Pin 消息
feishu-cli msg pin <message_id>
feishu-cli msg unpin <message_id>
feishu-cli msg pins --chat-id CHAT_ID
权限管理
# 添加 / 更新协作者
feishu-cli perm add <doc_id> --doc-type docx --member-type email \
--member-id user@example.com --perm full_access --notification
feishu-cli perm update <doc_id> --doc-type docx --member-type email \
--member-id user@example.com --perm edit
# 查看 / 删除协作者
feishu-cli perm list <doc_token> --doc-type docx
feishu-cli perm delete <doc_token> --doc-type docx --member-type email --member-id user@example.com
# 公开权限管理
feishu-cli perm public-get <doc_token>
feishu-cli perm public-update <doc_token> --external-access --link-share-entity anyone_readable
# 分享密码
feishu-cli perm password create <doc_token>
feishu-cli perm password delete <doc_token>
# 批量添加协作者
feishu-cli perm batch-add <doc_token> --members-file members.json --notification
# 权限检查
feishu-cli perm auth <doc_token> --action view
# 转移所有权
feishu-cli perm transfer-owner <doc_token> --member-type email --member-id user@example.com
群聊管理
# 群聊 CRUD
feishu-cli chat create --name "群聊名" --user-ids id1,id2
feishu-cli chat get <chat_id>
feishu-cli chat update <chat_id> --name "新群名"
feishu-cli chat delete <chat_id>
feishu-cli chat link <chat_id>
# 群成员管理
feishu-cli chat member list <chat_id>
feishu-cli chat list --page-all # 列出当前身份加入的全部群
feishu-cli chat member list <chat_id> --page-all # 全量成员(安全截断时告警)
feishu-cli chat member add <chat_id> --id-list id1,id2
feishu-cli chat member remove <chat_id> --id-list id1,id2
文件管理
# 基础操作
feishu-cli file list [folder_token]
feishu-cli file mkdir "新文件夹" --parent <folder_token>
# 上传 / 下载
feishu-cli file upload local_file.pdf --parent FOLDER_TOKEN
feishu-cli file download <file_token> -o output.pdf
feishu-cli file download <file_token> -o large.zip --user-access-token u-xxx --timeout 30m # 大文件自动 Range 分片兜底
# 版本管理
feishu-cli file version list <doc_token> --doc-type docx
feishu-cli file version revert <file_token> <version> # 回滚到历史版本
feishu-cli file version create <doc_token> --doc-type docx --name "v1.0"
feishu-cli file version get <doc_token> <version_id> --doc-type docx
feishu-cli file version delete <doc_token> <version_id> --doc-type docx
# 元数据与统计
feishu-cli file meta TOKEN1 TOKEN2 --doc-type docx
feishu-cli file stats <file_token> --doc-type docx
搜索操作
搜索 API 需要 User Access Token。推荐使用 auth login 一键获取(Token 自动保存和刷新),也可通过 --user-access-token 参数或环境变量手动指定。
# 获取 User Access Token(推荐,一次登录自动刷新)
feishu-cli auth login
# 搜索消息(默认返回消息 ID,-o json 输出 {MessageIDs,HasMore,PageToken})
feishu-cli search messages "关键词"
feishu-cli search messages "会议" --chat-ids oc_xxx,oc_yyy
feishu-cli search messages "你好" --chat-type p2p_chat # 搜索私聊消息
feishu-cli search messages "会议" --enrich # 补全内容/发送者/群名/时间
# 搜索应用
feishu-cli search apps "审批"
# 搜索文档和 Wiki
feishu-cli search docs "产品需求"
feishu-cli search docs "季度报告" --docs-types doc,sheet
feishu-cli search docs "技术方案" --count 10
feishu-cli search docs "技术方案" --count 10 --page-token <上一页输出的 page_token> # 翻页(--offset 已不支持)
# 也可以手动指定 Token
feishu-cli search docs "产品需求" --user-access-token <token>
export FEISHU_USER_ACCESS_TOKEN="u-xxx"
feishu-cli search docs "产品需求"
审批操作
全部当前审批 API 使用 User Token。approval get 走 GET /open-apis/approval/v4/approvals/{approval_code}/detail,需要 approval:approval:read;approval instance get 走 GET .../instances/detail,需要 approval:instance:read;approval instance initiated 走 GET .../instances/initiated;approval task query 走 GET .../tasks(不传 user_id query),需要 approval:task:read。写流程:instance create → POST .../instances/initiate(approval:instance:write,发起人取当前登录用户);instance cancel → POST .../instances/recall;instance cc → POST .../instances/add_cc;task approve/reject/transfer → POST .../tasks/pass|refuse|forward。
输出说明:
- 不传
--output:输出便于阅读的文本摘要 --output json:输出 CLI 归一化后的 JSON,部分字段会做拍平和字符串化处理--output raw-json:输出飞书 API 原始成功响应;HTTP 200 但业务code != 0时非零退出
# 查询审批定义详情(User Token)
feishu-cli approval get <approval_code>
# 输出完整 JSON
feishu-cli approval get <approval_code> --output json
# 输出飞书 API 原始响应
feishu-cli approval get <approval_code> --output raw-json
# 查询审批实例详情(User Token)
feishu-cli approval instance get --instance-code <instance_code>
feishu-cli approval instances get --instance-code <instance_code> --output raw-json
# 查询我发起的审批实例
feishu-cli approval instance initiated
feishu-cli approval instance initiated --output json
# 查询当前登录用户的待我审批
feishu-cli approval task query --topic todo
# 查询我已审批的任务
feishu-cli approval task query --topic done
# 查询抄送给我的(未读 / 已读)
feishu-cli approval task query --topic cc-unread --output json
feishu-cli approval task query --topic cc-read
# 输出飞书 API 原始响应
feishu-cli approval task query --topic todo --output raw-json
# 注:--topic 仅接受 todo / done / cc-unread / cc-read(服务端 options 为 1/2/17/18)。
# started(topic=3)已被官方下线,查「我发起的」请用上面的 approval instance initiated
# 翻页查询
feishu-cli approval task query --topic todo --page-size 20 --page-token <token>
# 显式指定 User Access Token
feishu-cli approval task query --topic cc-unread --user-access-token <token>
# 发起审批实例(身份取当前 User Token;form.json 为飞书审批表单 JSON 数组)
feishu-cli approval instance create --approval-code <code> --form-file form.json
# 撤回 / 抄送审批实例
feishu-cli approval instance cancel --instance-code <instance_code>
feishu-cli approval instance cc --instance-code <instance_code> --cc-user-ids ou_a,ou_b
# 通过 / 拒绝审批任务
feishu-cli approval task approve --instance-code <instance_code> --task-id <task_id> --comment "同意"
feishu-cli approval task reject --instance-code <instance_code> --task-id <task_id> --comment "信息不完整"
# 转交审批任务(User Token)
feishu-cli approval task transfer --instance-code <instance_code> --task-id <task_id> --transfer-user-id ou_target --comment "请代审"
身份认证(Device Flow)
通过 OAuth 2.0 Device Flow(RFC 8628) 获取 User Access Token,用于搜索、审批待办查询等需要用户授权的功能。无需在飞书开放平台配置任何重定向 URL 白名单。
v1.18+ 变更:Authorization Code Flow(
--print-url/auth callback/--manual/--port/--method/--scopes)已全部删除,只保留 Device Flow。
# 按业务域申请推荐权限(推荐)
feishu-cli auth login --domain search --recommend
# 显式申请某组 scope
feishu-cli auth login --scope "minutes:minutes.basic:read minutes:minutes.transcript:export"
# JSON 事件流输出(AI Agent 推荐,配合 run_in_background 使用)
feishu-cli auth login --domain search --recommend --json
# 两步模式:先立即输出 device_code,不启动轮询
feishu-cli auth login --domain vc --domain minutes --recommend --no-wait --json
# 两步模式:用已有 device_code 继续轮询
feishu-cli auth login --device-code <device_code> --json
# 预检 token 是否包含所需 scope(AI Agent 推荐在执行业务命令前调用)
feishu-cli auth check --scope "search:docs:read"
feishu-cli auth check --scope "search:docs:read im:message:readonly"
# 查看当前授权状态
feishu-cli auth status
feishu-cli auth status -o json # JSON 格式输出
# 退出登录(清除本地 token)
feishu-cli auth logout
登录时 CLI 在 stderr 打印验证链接和 user_code,用户在任意设备(电脑、手机)浏览器打开链接完成授权即可。本地桌面会尝试自动打开浏览器,SSH 远程失败静默忽略。
授权范围策略:
- CLI 会显式声明本次请求的 scope,不再依赖“后台开了什么就全量返回”
- 推荐先用
auth check --scope "REQ_SCOPES"预检,再用auth login --scope "..."或auth login --domain ... --recommend补授权 - 即使显式请求业务 scope,CLI 也会自动追加最小核心 scope(如
auth:user.id:read)用于识别当前登录用户 - 要真正拿到某个 scope,仍然必须先在飞书开放平台应用权限管理页面开通它
Token 管理:
- Token 保存在
~/.feishu-cli/token.json(0600,原子写入),Access Token 有效期约 2 小时 - Access Token 过期时自动使用 Refresh Token 刷新(跨进程锁,避免两个进程消耗同一 refresh token)
- 新登录写入的
token.json带app_id绑定;与当前 App 不一致或旧文件未绑定时,一律拒绝使用(即使 access 仍有效)。迁移:feishu-cli auth token --bind-legacy-app --as user(不更换 token;不可与--as bot/--user-access-token同时用)或重新auth login auth token --as bot走官方 Accounts OAuth v3client_credentials;不可与--user-access-token同时使用offline_access由 CLI 自动追加,无需手动声明- Token 优先级:
--user-access-token参数 >FEISHU_USER_ACCESS_TOKEN环境变量 >token.json>config.yaml - 审批任务查询会缓存当前登录用户资料到
~/.feishu-cli/user_profile.json,登录态变化或执行auth logout时会自动清理 base_url默认仅官方 HTTPS。自定义远端 / 明文 HTTP / 带 body 跨源重定向需显式 opt-in(FEISHU_ALLOW_CUSTOM_BASE_URL、FEISHU_ALLOW_INSECURE_HTTP、FEISHU_ALLOW_CROSS_ORIGIN_REDIRECT)
更多命令
# 文档异步导出/导入
feishu-cli doc export-file <doc_token> --type pdf -o output.pdf
feishu-cli doc import-file local_file.docx --type docx --name "文档名"
# 素材上传
feishu-cli media upload image.png --parent-type docx_image --parent-node <doc_id>
# 日历
feishu-cli calendar list
feishu-cli calendar get <calendar_id>
feishu-cli calendar primary
feishu-cli calendar create-event --calendar-id <id> --summary "会议" \
--start "2024-01-01T10:00:00+08:00" --end "2024-01-01T11:00:00+08:00"
feishu-cli calendar event-search --calendar-id <id> --query "关键词"
feishu-cli calendar event-reply <calendar_id> <event_id> --status accept
feishu-cli calendar attendee add <calendar_id> <event_id> --user-ids id1,id2
feishu-cli calendar attendee list <calendar_id> <event_id>
feishu-cli calendar freebusy --start "2024-01-01T00:00:00+08:00" \
--end "2024-01-02T00:00:00+08:00" --user-ids id1,id2
# 任务
feishu-cli task create --summary "待办事项"
feishu-cli task complete <task_id>
feishu-cli task subtask create <task_guid> --summary "子任务"
feishu-cli task subtask list <task_guid>
feishu-cli task member add <task_guid> --members id1,id2 --role assignee
feishu-cli task reminder add <task_guid> --minutes 30
feishu-cli task upload-attachment --task-guid <task_guid> --file ./report.pdf
# 任务列表
feishu-cli tasklist create --name "任务列表"
feishu-cli tasklist list
feishu-cli tasklist get <tasklist_guid>
feishu-cli tasklist delete <tasklist_guid>
# 画板(v1.25+ 新增 5 个子命令 + Mermaid 本地引擎 + Markdown ```svg fence 自动识别)
feishu-cli board create-notes <whiteboard_id> nodes.json -o json # 精排绘图(JSON 控制坐标、颜色、连线)
feishu-cli board import <whiteboard_id> "graph TD; A-->B" --source-type content --syntax mermaid --diagram-type flowchart # 服务端渲染
feishu-cli board import <whiteboard_id> diagram.mmd --syntax mermaid --engine local # 本地引擎(whiteboard-cli 翻译,每个节点可单独编辑)
feishu-cli board import <whiteboard_id> diagram.puml --syntax plantuml # 导入 PlantUML
feishu-cli board svg-import <whiteboard_id> drawing.svg # 单 svg 节点装饰(图标/印章 < 2KB)
feishu-cli board svg-export <whiteboard_id> -o board.svg # 服务端 SVG 导出
feishu-cli board clone <source_id> <target_id> --batch-size 10 # 克隆画板(含 connector ID 重映射 + 分批节流)
feishu-cli board upload-image <whiteboard_id> photo.png # 上传本地图片为 image 节点(自动推断像素尺寸)
feishu-cli board lint <whiteboard_id> # 几何质检(重叠/字号一致性/容量/综合评分)
feishu-cli board export-code <whiteboard_id> --merge --output-path design.svg # 反向导出 SVG(按 z_index 排序)
feishu-cli board update <whiteboard_id> nodes.json --overwrite --snapshot old.json # 覆盖更新+快照备份
feishu-cli board nodes <whiteboard_id> # 获取画板所有节点
feishu-cli board image <whiteboard_id> output # 下载画板截图(自动按实际格式补扩展名,通常 JPEG)
# ⭐ AI 自由作图(飞轮/鱼骨/Dashboard/插画/周期表/赛博朋克等):用 skill 的一键脚本,每个矢量元素都可单独点击编辑
python3 skills/feishu-cli-visual/references/workflows/board/scripts/svg_to_board.py drawing.svg <whiteboard_id>
# 内置 5 步管道:whiteboard-cli 翻译 → 修 z_index → 修剪 viewBox 溢出 → 分批 create-notes → 验证
# 评论
feishu-cli comment list <file_token> --type docx
feishu-cli comment add <file_token> --type docx --text "评论内容"
feishu-cli comment resolve <file_token> <comment_id> --type docx
feishu-cli comment unresolve <file_token> <comment_id> --type docx
feishu-cli comment reply list <file_token> <comment_id> --type docx
feishu-cli comment reply delete <file_token> <comment_id> <reply_id> --type docx
# 多维表格(base/v3 API)
feishu-cli bitable create --name "项目管理" --time-zone Asia/Shanghai
feishu-cli bitable table list --base-token bscnxxxx
feishu-cli bitable table create --base-token bscnxxxx --name "任务"
feishu-cli bitable field list --base-token bscnxxxx --table-id tblxxx
feishu-cli bitable field create --base-token bscnxxxx --table-id tblxxx --config '{"name":"状态","type":"select"}'
feishu-cli bitable record upsert --base-token bscnxxxx --table-id tblxxx --config '{"fields":{"名称":"测试"}}'
feishu-cli bitable record upsert --base-token bscnxxxx --table-id tblxxx --record-id recxxx --config '{"fields":{"状态":"完成"}}'
feishu-cli bitable record batch-create --base-token bscnxxxx --table-id tblxxx --config '{"create_records":[{"fld1":"val1"},{"fld1":"val2"}]}'
feishu-cli bitable record batch-delete --base-token bscnxxxx --table-id tblxxx --record-ids rec_1,rec_2,rec_3
feishu-cli bitable record batch-get --base-token bscnxxxx --table-id tblxxx --record-ids rec_1,rec_2 # 批量获取记录
feishu-cli bitable record share-link --base-token bscnxxxx --table-id tblxxx --record-ids rec_1,rec_2 # 批量共享链接(v1.29+)
feishu-cli bitable record list --base-token bscnxxxx --table-id tblxxx
# 结构化过滤/排序(tuple DSL,无需关键词)
feishu-cli bitable record list --base-token bscnxxxx --table-id tblxxx \
--filter-json '{"logic":"and","conditions":[["状态","==",["Doing"]],["分数",">=",70]]}' \
--sort-json '[{"field":"分数","desc":true}]'
feishu-cli bitable view list --base-token bscnxxxx --table-id tblxxx
feishu-cli bitable view view-filter-get --base-token bscnxxxx --table-id tblxxx --view-id vewxxx
feishu-cli bitable role list --base-token bscnxxxx
# 记录附件(上传 / 下载 / 移除)
feishu-cli bitable record upload-attachment --base-token bscnxxxx --table-id tblxxx \
--record-id recxxx --field-id fldxxx --file ./report.pdf --file ./shot.png
feishu-cli bitable record download-attachment --base-token bscnxxxx --table-id tblxxx \
--record-id recxxx --output ./downloads/
feishu-cli bitable record remove-attachment --base-token bscnxxxx --table-id tblxxx \
--record-id recxxx --field-id fldxxx --file-token boxcnxxxx
# 仪表盘(CRUD + 智能排版 + 仪表盘块)
feishu-cli bitable dashboard create --base-token bscnxxxx --name "运营看板"
feishu-cli bitable dashboard block create --base-token bscnxxxx --dashboard-id dsbxxxx \
--type column --name "按月统计" --data-config '{"table_name":"任务","group_by":"月份"}'
feishu-cli bitable dashboard arrange --base-token bscnxxxx --dashboard-id dsbxxxx
# 表单(CRUD + 分享 token 详情/提交 + 表单问题)
feishu-cli bitable form create --base-token bscnxxxx --table-id tblxxx --name "报名表"
feishu-cli bitable form field create --base-token bscnxxxx --table-id tblxxx --form-id vewxxx \
--questions '[{"type":"text","title":"你的名字","required":true}]'
feishu-cli bitable form detail --share-token shrcnxxxx # 无需 base_token
feishu-cli bitable form submit --share-token shrcnxxxx --content '{"评分":5,"评价":"很好"}'
# 角色协作者(member list/create/delete/batch-create/batch-delete)
feishu-cli bitable role member list --base-token bscnxxxx --role-id rolxxxx
feishu-cli bitable role member create --base-token bscnxxxx --role-id rolxxxx --member-id ou_xxx --member-id-type open_id
feishu-cli bitable role member delete --base-token bscnxxxx --role-id rolxxxx --member-id ou_xxx --member-id-type open_id
feishu-cli bitable role member batch-create --base-token bscnxxxx --role-id rolxxxx --member-ids ou_a,ou_b --member-id-type open_id
# 多维表格元信息更新(重命名 / 高级权限开关)
feishu-cli bitable update --base-token bscnxxxx --name "新表名" # 重命名
feishu-cli bitable update --base-token bscnxxxx --is-advanced # 开启高级权限(--is-advanced=false 关闭)
# 工作流(list/get/create/update/enable/disable;update 为整体替换 PUT)
feishu-cli bitable workflow list --base-token bscnxxxx
feishu-cli bitable workflow get --base-token bscnxxxx --workflow-id wkfxxxx
feishu-cli bitable workflow update --base-token bscnxxxx --workflow-id wkfxxxx --config-file wf.json
feishu-cli bitable workflow enable --base-token bscnxxxx --workflow-id wkfxxxx
feishu-cli bitable workflow disable --base-token bscnxxxx --workflow-id wkfxxxx
# 云盘增强(drive)
feishu-cli drive upload --file big.zip --folder-token fldxxx
feishu-cli drive upload --file new.zip --file-token boxcnXXX # 原地覆盖上传新版本
feishu-cli drive secure-label list --lang zh # 密级标签查询 / set 设置
feishu-cli drive download --file-token boxxxx --output ./downloads/ --overwrite
feishu-cli drive download --file-token boxxxx --output ./big.zip --timeout 30m # 大文件自动 Range 分片兜底
feishu-cli drive export --token docxxxx --doc-type docx --file-extension markdown --output-dir ./exports
feishu-cli drive export --token sheetxxxx --doc-type sheet --file-extension csv --sub-id sheet_1 --output-dir ./out
feishu-cli drive export --token sldxxxx --doc-type slides --file-extension pptx --output-dir ./out
feishu-cli drive import --file report.docx --type docx --folder-token fldxxx
feishu-cli drive import --file deck.pptx --type slides
feishu-cli drive move --file-token fldxxx --type folder --folder-token fldyyy
feishu-cli drive move --file-token boxxxx --type file # 省略目标时先取真实 root token
feishu-cli drive add-comment --doc docxxx --content '[{"type":"text","text":"评论"}]'
# v1.29+ 新增 ⭐
feishu-cli drive inspect --url "https://xxx.feishu.cn/docx/doxxxx" # 解析 URL → type/title/token
feishu-cli drive apply-permission --token "<url|token>" --perm view --remark "申请理由" # 向 owner 发申请
# 云盘 ↔ 本地单向镜像(pull/push/status)
feishu-cli drive status --folder-token fldxxx --local-dir ./mirror
feishu-cli drive pull --folder-token fldxxx --local-dir ./mirror --if-exists overwrite
feishu-cli drive push --folder-token fldxxx --local-dir ./mirror --if-exists skip
feishu-cli drive pull --folder-token fldxxx --local-dir ./mirror --delete-local --yes # 高危:双确认
# 云盘 v2 搜索(与 search docs 同一 Search v2 端点,drive search 暴露更多 filter 与排序)
feishu-cli drive search --query "季度报告" --doc-types DOC,SHEET --sort edit_time
feishu-cli drive search --folder-tokens fldxxx --only-title
# 邮箱(mail,需 User Token)
feishu-cli mail triage --folder INBOX --unread-only --page-size 20
feishu-cli mail triage --query "周会"
feishu-cli mail message --message-id msg_xxx
feishu-cli mail send --to user@example.com --subject "测试" --body "hi" # 默认存草稿
feishu-cli mail send --to user@example.com --subject "测试" --body "hi" --confirm-send # 立即发送
feishu-cli mail message-modify --message-ids id1,id2 --add-label-ids FLAGGED # 批量改 label/移文件夹
feishu-cli mail message-trash --message-ids id1,id2 --yes # 批量软删进废纸篓
feishu-cli mail draft-send --draft-id <id> --confirm-send # 发送已有草稿
feishu-cli mail send --to user@example.com --subject "周报" --body "$(cat report.html)" \
--html --inline-images-auto-scan --confirm-send
feishu-cli mail template create --name "周报模板" --subject "本周进度" --body "$(cat template.html)"
feishu-cli mail template list
feishu-cli mail reply --message-id msg_xxx --body "收到" --confirm-send
feishu-cli mail forward --message-id msg_xxx --to team@example.com --body "请关注"
feishu-cli mail signature # 列出邮箱签名
feishu-cli mail signature --detail 7012345678901234567 -o json # 单个签名详情
# 视频会议(vc):search/notes/recording 默认 User,可 `--as bot`;bot meeting-join/leave 默认 Bot/Tenant 身份
feishu-cli vc search --query "周会" --start 2026-03-20 --end 2026-03-28
feishu-cli vc detail <meeting_id|会议号> # 聚合会议信息 + note_id + minute_token
feishu-cli vc note detail <note_id> # 智能纪要详情
feishu-cli vc note transcript <note_id> --output t.md # 统一逐字稿导出
feishu-cli vc notes --meeting-ids 69xxxx,70xxxx
feishu-cli vc notes --minute-tokens obcnxxxx --with-artifacts --download-transcript --output-dir ./notes
feishu-cli vc recording --meeting-ids 69xxxx
feishu-cli vc bot meeting-join --meeting-number 123456789 # 机器人入会(Bot/Tenant 身份)
feishu-cli vc bot meeting-leave --meeting-id 6911188411932033028 # 机器人离会(Bot/Tenant 身份)
feishu-cli vc bot meeting-events --meeting-id 6911188411932033028 --as user --start 2026-03-01 --end 2026-03-31
feishu-cli vc bot meeting-events --meeting-id 6911188411932033028 --as bot --dry-run # 与 meeting_id 来源身份一致;禁止静默回落
# 妙记(minutes,默认 User,可 `--as bot`)
feishu-cli minutes get <minute_token> --with-artifacts
feishu-cli minutes get <minute_token> --wait-ready # 轮询等待妙记转写就绪
feishu-cli minutes search --query "周会" # 搜索妙记
feishu-cli minutes apply-permission --minute-token <token> --perm view # 申请妙记权限
feishu-cli minutes download --minute-tokens obcnxxxx --output ./media
feishu-cli minutes download --minute-tokens obcnxxxx --url-only
# 妙搭(Miaoda)应用 —— 一份 HTML 秒级发布成可分享的飞书应用(需 User Token + spark scope)
feishu-cli auth login --scope "spark:app:read spark:app:write" # ⚠️ --scope 是替换不是合并,需并入你完整 scope 串
feishu-cli apps create --name "我的页面" --app-type HTML # 拿 app_id(jq .app.app_id,CLI 已剥掉 data 外层)
feishu-cli apps html-publish --app-id app_xxx --path ./dist # 三段协议发布,返回 release_id(jq .release_id)
feishu-cli apps html-publish --app-id app_xxx --path ./index.html # 单文件形态(文件名必须 index.html)
feishu-cli apps html-publish --app-id app_xxx --path ./dist --dry-run # 只看三段计划 + 打包清单,零网络
feishu-cli apps access-scope-set --app-id app_xxx --scope tenant # 组织内可见
feishu-cli apps access-scope-set --app-id app_xxx --scope public --require-login=true
feishu-cli apps access-scope-set --app-id app_xxx --scope specific \
--targets '[{"type":"user","id":"ou_xxx"},{"type":"chat","id":"oc_xxx"}]'
feishu-cli apps access-scope-get --app-id app_xxx # 查看当前访问范围
feishu-cli apps update --app-id app_xxx --name "新名字"
# 日历增强
feishu-cli calendar agenda # 查看今日日程
feishu-cli calendar agenda --start-date 2026-03-28 --end-date 2026-03-29
feishu-cli calendar suggestion --attendee-ids ou_aaa,ou_bbb --duration 30m
feishu-cli calendar room-find --slot 2026-03-28T14:00:00+08:00~2026-03-28T15:00:00+08:00 \
--city "北京" --min-capacity 6
feishu-cli calendar rsvp --event-id EVENT_xxx --action accept
# 任务增强
feishu-cli task my # 查看我的任务
feishu-cli task search --keyword 评审 --uncompleted --due-before 2026-12-31 # 服务端搜索(--enrich=false 免详情补全)
feishu-cli task reopen <task_guid> # 重新打开
feishu-cli task comment add <task_guid> --content "评论"
feishu-cli tasklist task-add <tasklist_guid> --task-ids guid1,guid2
feishu-cli tasklist member add <tasklist_guid> --members ou_xxx
# 消息增强
feishu-cli msg mget --message-ids om_xxx,om_yyy
feishu-cli msg resource-download <message_id> <file_key> --type image -o photo.png
feishu-cli msg resource-download <message_id> <file_key> --type file --user-access-token u-xxx -o attachment.bin # 用户可见但 Bot 不可见的资源
feishu-cli msg resource-download <message_id> <file_key> --type file --user-access-token u-xxx -o large.bin --timeout 30m # 大文件自动 Range 分片兜底
feishu-cli msg thread-messages <thread_id> --page-size 20
feishu-cli msg flag create om_xxx # 收藏消息
feishu-cli msg flag create om_xxx --flag-type feed # feed 层自动识别 thread/msg_thread
feishu-cli msg flag list --page-size 50
feishu-cli msg flag cancel om_xxx # 尽量取消消息层 + feed 层
# interactive 卡片返回原始 schema(不再返回渲染后的 <card title> 文本)
feishu-cli msg get om_xxx --card-content-type user # userDSL(开发者视角的 schema 2.0 JSON)
feishu-cli msg get om_xxx --card-content-type raw # cardDSL(平台内部完整描述)
feishu-cli msg mget --message-ids om_xxx,om_yyy --card-content-type user
feishu-cli msg list --container-id oc_xxx --card-content-type user
# 文档增强(采用 docs_ai 单操作原子更新协议,彻底避免先删后写破坏窗口;支持 --revision-id 并发保护)
feishu-cli doc content-update <doc_id> --mode append --markdown "## 新内容"
feishu-cli doc content-update <doc_id> --mode overwrite --markdown "# 全新文档" [--revision-id 42]
feishu-cli doc content-update <doc_id> --mode replace_range --selection-by-title "章节标题" --markdown "## 新章节"
feishu-cli doc media-insert <doc_id> --file photo.png --type image --align center
feishu-cli doc media-insert <doc_id> --from-clipboard --type image # 从剪贴板插图(Linux 需 xclip / wl-paste / xsel)
feishu-cli doc media-insert <doc_id> --file report.pdf --type file --file-view preview
feishu-cli doc media-download <file_token> -o image.png
feishu-cli doc media-preview <file_token> -o ./preview # 预览接口下载素材或评论图片
feishu-cli doc media-download <file_token> --doc-token DOC_TOKEN --doc-type docx -o image.png
# 妙笔BOX HTML 小组件(文档里跑动画 / ECharts / 可交互图表,唯一能"动"的载体)
feishu-cli doc htmlbox create <doc_id> --html-file widget.html
feishu-cli doc htmlbox update <doc_id> <block_id> --html-file widget-v2.html
feishu-cli doc htmlbox get <doc_id> <block_id> --raw > current.html
feishu-cli doc htmlbox delete <doc_id> <block_id>
# 电子表格导出
feishu-cli sheet export <token> -o output.xlsx
feishu-cli sheet export <token> --format csv --sheet-id SHEET_ID -o output.csv
feishu-cli sheet export <token_or_url> --format markdown -o output.md
feishu-cli sheet filter-view create --spreadsheet-token shtcnxxxx --sheet-id SHEET_ID \
--range "SHEET_ID!A1:H100" --name "P0 高优"
feishu-cli sheet filter-view list --spreadsheet-token shtcnxxxx --sheet-id SHEET_ID
feishu-cli sheet filter-view update --token shtcnxxxx --sheet-id SHEET_ID \
--filter-view-id pH9xxxx --name "新名字"
# 筛选条件(按列字母定位)
feishu-cli sheet filter-view condition create --token shtcnxxxx --sheet-id SHEET_ID \
--filter-view-id pH9xxxx --condition-id E --filter-type number --compare-type less --expected '["6"]'
feishu-cli sheet filter-view condition list --token shtcnxxxx --sheet-id SHEET_ID --filter-view-id pH9xxxx
feishu-cli sheet dropdown set --token shtcnxxxx --range "SHEET_ID!B2:B100" \
--options "待办,处理中,已完成"
feishu-cli sheet dropdown update --token shtcnxxxx --sheet-id SHEET_ID \
--ranges "SHEET_ID!A1:A100" --options "P0,P1,P2" --multiple --colors "#FF4D4F,#FAAD14,#52C41A"
feishu-cli sheet dropdown get --token shtcnxxxx --range "SHEET_ID!A1:A100"
feishu-cli sheet dropdown delete --token shtcnxxxx --ranges "SHEET_ID!A1:A100"
# 浮动图片 / 单元格写图 / 批量样式
feishu-cli sheet image media-upload shtcnxxxx ./logo.png # 返回 file_token
feishu-cli sheet image write-image shtcnxxxx SHEET_ID --range "A1" --image https://example.com/logo.png # 支持 HTTPS URL / 本地路径并回读校验
feishu-cli sheet image write-batch shtcnxxxx SHEET_ID --manifest images.json # 批量写入并回读校验(支持文件、stdin '-' 或行内 JSON)
feishu-cli sheet batch-set-style shtcnxxxx \
--data '[{"ranges":["SHEET_ID!A1:A2"],"style":{"font":{"bold":true},"backColor":"#FF0000"}}]'
# Drive 原生 Markdown 文件(不做 docx 块转换)
feishu-cli markdown create --name README.md --content-file ./README.md --folder-token fldxxx
feishu-cli markdown create --file ./README.md --wiki-token wikcnxxx --as bot --dry-run
feishu-cli markdown fetch --file-token boxcnxxx --output-path ./remote.md
feishu-cli markdown overwrite --file-token boxcnxxx --file ./remote.md
feishu-cli markdown patch --file-token boxcnxxx --pattern "TODO" --content "DONE"
feishu-cli markdown diff --file-token boxcnxxx --file ./local.md # 远端最新 vs 本地
feishu-cli markdown diff --file-token boxcnxxx --from-version 2 --to-version 5 # 远端版本 A vs B
# 用户
feishu-cli user info <user_id>
feishu-cli user search --email user@example.com # 邮箱查 user_id;带 User Token 时自动补 open_id + 姓名
feishu-cli user search --mobile 13800138000
feishu-cli user search --query "张三" # 按姓名/关键词模糊搜索,需 User Token
feishu-cli user list --department-id DEPT_ID
# 部门
feishu-cli dept get <department_id>
feishu-cli dept children <department_id>
# 考勤(支持 User/Tenant Token,未传 --user-ids 自动走本人自查)
feishu-cli attendance user-task query --start 2026-03-01 --end 2026-03-31
feishu-cli attendance user-task query --employee-type employee_id --user-ids 2847xxxx \
--start 2026-03-01 --end 2026-03-31
feishu-cli attendance user-stats query --employee-type employee_no --user-ids 10001 \
--start 2026-03-01 --end 2026-03-31
# OKR(cycle list 默认查询 v2 用户周期,与 cycle detail / 目标创建使用同一套 ID;--tenant 查租户周期)
feishu-cli okr cycle list
feishu-cli okr progress list --objective-id 7xxx
feishu-cli okr cycle detail <cycle_id> # 周期下全部目标+关键结果
feishu-cli okr progress get/update/delete <progress_id> # 进展记录全生命周期
feishu-cli okr upload-image --file chart.png --objective-id 7xxx # 进展图片素材
feishu-cli okr progress create --key-result-id 7xxx --content "本周完成核心模块联调"
# Slides 演示文稿
feishu-cli slides create --title "Q2 OKR" --slide @page1.xml --output json # 创建时带页面,@./img.png 自动上传
feishu-cli slides add-slide <presentation> --slide @page2.xml
feishu-cli slides get <presentation_or_url> --slide-number 2 --output-file page2.xml
feishu-cli slides screenshot <presentation> --slide-number 1 --output cover
feishu-cli slides media-upload --file ./cover.png --presentation-token <xml_presentation_id>
# 实时事件订阅
feishu-cli event list
feishu-cli event schema im.message.receive_v1
feishu-cli event consume im.message.receive_v1 --max-events 5 --timeout 60s
feishu-cli event consume card.action.trigger # 卡片按钮/表单回调(交互式 Bot)
feishu-cli event consume approval.instance.status_changed_v4 # 审批事件(自动注册服务端订阅)
feishu-cli event consume vc.meeting.participant_meeting_ended_v1 # VC:User pre-consume,握手后才发 ready
feishu-cli event status
feishu-cli event stop --all
# OpenAPI schema / 健康检查 / 多配置
feishu-cli schema list --service im
feishu-cli schema status --format json
feishu-cli schema im.messages.delete --format json
feishu-cli doctor --json
feishu-cli doctor --only catalog --offline --json
feishu-cli profile list --json
feishu-cli profile current --json
feishu-cli profile migrate
feishu-cli profile add work --app-id cli_xxx --app-secret secret_xxx --use
feishu-cli --profile work auth status -o json
feishu-cli --bot-app-id cli_xxx --bot-app-secret xxx profile list --json # 单次覆盖 App 凭证,不切换 token.json
feishu-cli profile use -
# 通用 OpenAPI 透传(v1.29+)⭐ 覆盖 2500+ 未封装端点
feishu-cli api GET /open-apis/authen/v1/user_info --as user
feishu-cli api GET /open-apis/im/v1/chats --params '{"page_size":10}' --as user
feishu-cli api GET /open-apis/im/v1/chats --page-all --page-limit 10 --as user
feishu-cli api POST /open-apis/im/v1/messages --params '{"receive_id_type":"email"}' \
--data '{"receive_id":"u@example.com","msg_type":"text","content":"{\"text\":\"hi\"}"}' --as bot
feishu-cli api DELETE /open-apis/im/v1/messages/om_xxx --as bot --dry-run # 预览
feishu-cli auth token --as user # 导出 token 给其他工具用(如果需要)
AI 技能集成
skills/ 目录包含 9 个领域 Skill。每个领域 Skill 在 references/workflows/ 下按需加载细粒度工作流,减少常驻上下文,同时覆盖完整 CLI 能力。
| 技能 | 功能 | 触发示例 |
|---|---|---|
feishu-cli-platform | 认证、配置、Profile、doctor、API/schema、搜索、通讯录 | "登录飞书"、"查这个 API 参数" |
feishu-cli-docs | 文档读取/编辑、Markdown 导入、导出、原生 .md CRUD | "把这个 md 导入飞书" |
feishu-cli-storage | Drive、file/media、wiki、评论和权限 | "上传文件并给同事权限" |
feishu-cli-messaging | 消息发送、聊天历史、群管理、卡片和事件订阅 | "做张卡片发到群里" |
feishu-cli-data | Sheet 与 Bitable/Base 全功能 | "给表格加下拉框" |
feishu-cli-visual | dataviz、画板、Slides、妙笔BOX 和妙搭应用 | "在飞书里画交互图表" |
feishu-cli-work | 日历、任务、审批、考勤和 OKR | "找时间开会并创建任务" |
feishu-cli-mail | 飞书邮箱读取、草稿、发送、回复和转发 | "回复这封飞书邮件" |
feishu-cli-meetings | 视频会议、妙记、录制、逐字稿和会议机器人 | "下载会议纪要" |
Skill 入口使用 Agent Skills 标准 frontmatter;按需加载的工作流和脚本随目录一起分发。
本版本技能与 feishu-cli v1.43.0+ 配套使用;聊天导出脚本需要 Python 3.10+,
可视化工作流按需使用 Node.js、whiteboard-cli 或 agent-browser,具体依赖见对应入口的 compatibility。
各宿主对工具授权字段的解释可能不同,不能把 allowed-tools 当作跨宿主的执行保证。
维护时从仓库根运行 make check-skills。它会重新编译 CLI,检查 YAML 元数据、引用、
命令归属和示例参数,再执行脚本回归与本地模拟 API 的二进制契约测试。
这些检查不等同于线上 API 验证或模型触发评测;后两者需要分别执行并记录模型、身份和实际结果。
skills/trigger-evals.json 保留各领域的 8 个正例,scripts/build_trigger_eval_set.py
为每个领域生成 8 正例加 8 个相邻领域负例;skills/trigger-boundary-evals.json 另存跨领域和不应触发的场景。
旧 Skill 名称迁移对照(v1.35 前的 29 个技能 → 9 个领域)
| 新 Skill | 合并的旧 Skill |
|---|---|
feishu-cli-platform | api、auth、schema、search,以及 toolkit 的 user/dept/search 参考资料 |
feishu-cli-docs | read、write、import、export、markdown |
feishu-cli-storage | drive、perm,以及 toolkit 的 file/media/wiki/comment |
feishu-cli-messaging | msg、chat、card、event,以及 toolkit 的 chat 参考资料 |
feishu-cli-data | sheet、bitable,以及 toolkit 的 sheet 参考资料 |
feishu-cli-visual | dataviz、board、slides、htmlbox、apps,以及 toolkit 的 board 参考资料 |
feishu-cli-work | calendar、approval、attendance、okr,以及 toolkit 的 calendar/task/tasklist |
feishu-cli-mail | mail(名称不变) |
feishu-cli-meetings | vc、minutes |
安装方法:
技能随二进制内嵌,内容与当前 feishu-cli 版本严格配套,推荐用内置命令安装:
# 先预览,再安装到 ~/.claude/skills(--dir 或 FEISHU_CLI_SKILLS_DIR 可指定其他目录)
feishu-cli skills install --dry-run
feishu-cli skills install
# 升级 CLI 后同步技能;doctor 会检查本地技能是否与 CLI 版本漂移
feishu-cli update
feishu-cli skills install
feishu-cli doctor --only skills
# 不安装也可以直接读取当前版本的技能内容
feishu-cli skills list
feishu-cli skills read feishu-cli-docs
skills install 写入前会解析符号链接并打印真实路径;只覆盖上次由它写入且未被修改的文件,
发现本地修改(或目录来自 npx/手动复制且内容不同)时不带 --force 拒绝写入;旧版 29 个技能目录默认只列出,
加 --prune-legacy 才删除确认属于 feishu-cli 的旧目录。
备选:npx skills add riba2534/feishu-cli --global --yes --agent claude-code --copy 拉取的是 GitHub main 分支的技能,
可能与本地 CLI 版本不一致;或手动把 skills/ 下 9 个领域目录复制到 ~/.claude/skills/。
块类型映射
Markdown ↔ 飞书块类型完整对照表
| Markdown | 飞书块类型 | block_type | 说明 |
|---|---|---|---|
# 标题 | Heading 1-9 | 3-11 | 支持 9 级标题(Markdown 规范 6 级) |
| 段落文本 | Text | 2 | 普通文本 |
- 列表 | Bullet | 12 | 无序列表(支持无限深度嵌套) |
1. 列表 | Ordered | 13 | 有序列表(支持无限深度嵌套) |
- [ ] 任务 | Todo | 17 | 任务列表 |
```lang``` | Code | 14 | 代码块 |
```mermaid``` | Board (Diagram) | 21 → 43 | 自动转画板 |
```plantuml``` | Board (Diagram) | 21 → 43 | 自动转画板 |
```svg``` | Board (Diagram) | 43 | 转为可编辑画板节点 |
> 引用 | QuoteContainer | 34 | 引用容器 |
> [!NOTE] | Callout | 19 | 6 种类型(NOTE/WARNING/TIP/CAUTION/IMPORTANT/SUCCESS) |
--- | Divider | 22 | 分割线 |
| 表格 | | Table | 31 | 大表格自动拆分 |
 | Image | 27 | 图片(API 限制,创建占位块) |
$$公式$$ | Equation | 16 | 块级公式(降级为行内) |
| 附件 | File | 23 | 文件块 |
<iframe> | Iframe | 26 | 内嵌网页 |
权限要求
💡 推荐做法:一键创建机器人
新用户不需要手动去飞书开放平台后台创建应用,feishu-cli 自带 Device Flow 协议的一键创建机器人工作流,在终端扫码确认即可自动注册「个人代理应用」:
# 1. 一键创建飞书应用(扫码确认后自动把 App ID / App Secret 写入 ~/.feishu-cli/config.yaml) feishu-cli config create-app --save # 2. OAuth 用户授权(搜索、审批等需要用户身份的功能) feishu-cli auth login关于权限:创建应用后,你需要在飞书开放平台的应用权限管理页面为应用开通所需 scope。下面的完整权限清单可以直接在权限管理页面粘贴 JSON 导入,一次性开通全部功能。
权限的开通是你自己的责任(飞书开放平台一般需要 tenant 管理员审批),feishu-cli 不做自动化。
完整权限清单
feishu-cli 涵盖文档、知识库、电子表格、多维表格、消息、群聊、日历、任务、审批、OKR、画板、权限管理、搜索、视频会议、妙记、邮件等全部功能。下面这份 JSON 可以直接在飞书开放平台的应用权限管理页面一次性导入(tenant 199 条 + user 237 条):
展开完整 scope JSON(复制后到 开放平台 → 权限管理 → 批量导入 粘贴即可)
{
"scopes": {
"tenant": [
"aily:run:write",
"aily:session:read",
"aily:session:write",
"aily:skill:read",
"aily:skill:write",
"aily:table:read",
"app_engine:application.event:read",
"app_engine:application.log:read",
"app_engine:application.metric:read",
"application:application.app_message_stats.overview:readonly",
"application:application.app_version:readonly",
"application:application.bot.operator_name:readonly",
"application:application.feedback.feedback_info",
"application:application:self_manage",
"application:bot.menu:readonly",
"application:bot.menu:write",
"approval:approval:readonly",
"base:app:copy",
"base:app:create",
"base:app:read",
"base:app:update",
"base:collaborator:create",
"base:collaborator:delete",
"base:collaborator:read",
"base:dashboard:copy",
"base:dashboard:read",
"base:field:create",
"base:field:delete",
"base:field:read",
"base:field:update",
"base:field_group:create",
"base:form:read",
"base:form:update",
"base:record:create",
"base:record:delete",
"base:record:read",
"base:record:retrieve",
"base:record:update",
"base:role:create",
"base:role:delete",
"base:role:read",
"base:role:update",
"base:table:create",
"base:table:delete",
"base:table:read",
"base:table:update",
"base:view:read",
"base:view:write_only",
"base:workflow:read",
"base:workflow:write",
"block:message",
"board:whiteboard:node:create",
"board:whiteboard:node:read",
"board:whiteboard:node:update",
"calendar:calendar.free_busy:read",
"cardkit:card:read",
"cardkit:card:write",
"comment_sdk:comment_sdk",
"component:url_preview",
"contact:user.employee_id:readonly",
"contact:user.id:readonly",
"directory:department.external_id:read",
"directory:employee.base.external_id:read",
"directory:employee.idconvert:read",
"directory:employee.work.job_number:read",
"directory:job_title.status:read",
"docs:document.comment:create",
"docs:document.comment:read",
"docs:document.comment:update",
"docs:document.comment:write_only",
"docs:document.content:read",
"docs:document.media:download",
"docs:document.media:upload",
"docs:document.subscription",
"docs:document.subscription:read",
"docs:document:copy",
"docs:document:export",
"docs:document:import",
"docs:event.document_deleted:read",
"docs:event.document_edited:read",
"docs:event.document_opened:read",
"docs:event:subscribe",
"docs:permission.member:auth",
"docs:permission.member:create",
"docs:permission.member:delete",
"docs:permission.member:retrieve",
"docs:permission.member:transfer",
"docs:permission.member:update",
"docs:permission.setting:read",
"docs:permission.setting:readonly",
"docs:permission.setting:write_only",
"docs_tool:docs_tool",
"docx:document.block:convert",
"docx:document:create",
"docx:document:readonly",
"docx:document:write_only",
"drive:drive.metadata:readonly",
"drive:drive.search:readonly",
"drive:drive:version",
"drive:drive:version:readonly",
"drive:file.like:readonly",
"drive:file.meta.sec_label.read_only",
"drive:file:download",
"drive:file:favorite",
"drive:file:favorite:readonly",
"drive:file:upload",
"drive:file:view_record:readonly",
"event:failed_event:readonly",
"event:ip_list",
"im:app_feed_card:write",
"im:chat.access_event.bot_p2p_chat:read",
"im:chat.announcement:read",
"im:chat.announcement:write_only",
"im:chat.chat_pins:read",
"im:chat.chat_pins:write_only",
"im:chat.collab_plugins:read",
"im:chat.collab_plugins:write_only",
"im:chat.managers:write_only",
"im:chat.members:bot_access",
"im:chat.members:read",
"im:chat.members:write_only",
"im:chat.menu_tree:read",
"im:chat.menu_tree:write_only",
"im:chat.moderation:read",
"im:chat.tabs:read",
"im:chat.tabs:write_only",
"im:chat.top_notice:write_only",
"im:chat.widgets:read",
"im:chat.widgets:write_only",
"im:chat:create",
"im:chat:delete",
"im:chat:moderation:write_only",
"im:chat:operate_as_owner",
"im:chat:read",
"im:chat:update",
"im:message",
"im:message.group_at_msg:readonly",
"im:message.group_msg",
"im:message.p2p_msg:readonly",
"im:message.pins:read",
"im:message.pins:write_only",
"im:message.reactions:read",
"im:message.reactions:write_only",
"im:message.urgent",
"im:message.urgent.status:write",
"im:message.urgent:phone",
"im:message.urgent:sms",
"im:message:readonly",
"im:message:recall",
"im:message:send_as_bot",
"im:message:send_multi_depts",
"im:message:send_multi_users",
"im:message:send_sys_msg",
"im:message:update",
"im:resource",
"im:url_preview.update",
"im:user_agent:read",
"llpp:model:write",
"llpp:resource",
"minutes:minute:download",
"minutes:minutes",
"minutes:minutes.basic:read",
"minutes:minutes.media:export",
"minutes:minutes.statistics:read",
"minutes:minutes.transcript:export",
"minutes:minutes:readonly",
"myai:message:read",
"sheets:spreadsheet.meta:read",
"sheets:spreadsheet.meta:write_only",
"sheets:spreadsheet:create",
"sheets:spreadsheet:read",
"sheets:spreadsheet:write_only",
"space:document.event:read",
"space:document:create",
"space:document:delete",
"space:document:move",
"space:document:retrieve",
"space:document:shortcut",
"space:folder:create",
"task:comment:write",
"task:task:read",
"task:task:write",
"task:tasklist:read",
"task:tasklist:write",
"wiki:member:create",
"wiki:member:retrieve",
"wiki:member:update",
"wiki:node:copy",
"wiki:node:create",
"wiki:node:move",
"wiki:node:read",
"wiki:node:retrieve",
"wiki:node:update",
"wiki:setting:read",
"wiki:setting:write_only",
"wiki:space:read",
"wiki:space:retrieve",
"wiki:space:write_only",
"wiki:wiki:readonly"
],
"user": [
"aily:run:read",
"aily:run:write",
"aily:session:read",
"aily:session:write",
"aily:skill:read",
"aily:skill:write",
"aily:table:read",
"app_engine:application.event_subscriber:read",
"approval:approval:read",
"approval:instance:read",
"approval:instance:write",
"approval:task:read",
"approval:task:write",
"base:app:copy",
"base:app:create",
"base:app:read",
"base:app:update",
"base:collaborator:create",
"base:collaborator:delete",
"base:collaborator:read",
"base:dashboard:create",
"base:dashboard:delete",
"base:dashboard:read",
"base:dashboard:update",
"base:field:create",
"base:field:delete",
"base:field:read",
"base:field:update",
"base:field_group:create",
"base:form:create",
"base:form:delete",
"base:form:read",
"base:form:update",
"base:record:create",
"base:record:delete",
"base:record:read",
"base:record:retrieve",
"base:record:update",
"base:role:create",
"base:role:delete",
"base:role:read",
"base:role:update",
"base:table:create",
"base:table:delete",
"base:table:read",
"base:table:update",
"base:view:read",
"base:view:write_only",
"base:workflow:create",
"base:workflow:delete",
"base:workflow:read",
"base:workflow:update",
"base:workflow:write",
"base:workspace:list",
"board:whiteboard:node:create",
"board:whiteboard:node:delete",
"board:whiteboard:node:read",
"board:whiteboard:node:update",
"calendar:calendar.acl:create",
"calendar:calendar.acl:delete",
"calendar:calendar.acl:read",
"calendar:calendar.event:create",
"calendar:calendar.event:delete",
"calendar:calendar.event:read",
"calendar:calendar.event:reply",
"calendar:calendar.event:update",
"calendar:calendar.free_busy:read",
"calendar:calendar:create",
"calendar:calendar:delete",
"calendar:calendar:read",
"calendar:calendar:subscribe",
"calendar:calendar:update",
"calendar:time_off:create",
"calendar:time_off:delete",
"cardkit:card:read",
"cardkit:card:write",
"comment_sdk:comment_sdk",
"component:user_profile",
"contact:contact.base:readonly",
"contact:user.base:readonly",
"contact:user.basic_profile:readonly",
"contact:user.email:readonly",
"contact:user.employee_id:readonly",
"contact:user.id:readonly",
"contact:user:search",
"directory:department.external_id:read",
"directory:employee.base.external_id:read",
"directory:employee.idconvert:read",
"directory:employee.work.job_number:read",
"docs:component",
"docs:document.comment:create",
"docs:document.comment:delete",
"docs:document.comment:read",
"docs:document.comment:update",
"docs:document.comment:write_only",
"docs:document.content:read",
"docs:document.media:download",
"docs:document.media:upload",
"docs:document.subscription",
"docs:document.subscription:read",
"docs:document:copy",
"docs:document:export",
"docs:document:import",
"docs:event.document_deleted:read",
"docs:event.document_edited:read",
"docs:event.document_opened:read",
"docs:event:subscribe",
"docs:permission.member:apply",
"docs:permission.member:auth",
"docs:permission.member:create",
"docs:permission.member:delete",
"docs:permission.member:retrieve",
"docs:permission.member:transfer",
"docs:permission.member:update",
"docs:permission.setting:read",
"docs:permission.setting:readonly",
"docs:permission.setting:write_only",
"docs_tool:docs_tool",
"docx:document.block:convert",
"docx:document:create",
"docx:document:readonly",
"docx:document:write_only",
"drive:drive.metadata:readonly",
"drive:drive.search:readonly",
"drive:drive:version",
"drive:drive:version:readonly",
"drive:file.like:readonly",
"drive:file.meta.sec_label.read_only",
"drive:file:download",
"drive:file:favorite",
"drive:file:favorite:readonly",
"drive:file:upload",
"drive:file:view_record:readonly",
"event:ip_list",
"im:chat.access_event.bot_p2p_chat:read",
"im:chat.announcement:read",
"im:chat.announcement:write_only",
"im:chat.chat_pins:read",
"im:chat.chat_pins:write_only",
"im:chat.collab_plugins:read",
"im:chat.collab_plugins:write_only",
"im:chat.managers:write_only",
"im:chat.members:read",
"im:chat.members:write_only",
"im:chat.moderation:read",
"im:chat.tabs:read",
"im:chat.tabs:write_only",
"im:chat.top_notice:write_only",
"im:chat:delete",
"im:chat:moderation:write_only",
"im:chat:read",
"im:chat:update",
"im:message",
"im:message.group_msg:get_as_user",
"im:message.p2p_msg:get_as_user",
"im:message.pins:read",
"im:message.pins:write_only",
"im:message.reactions:read",
"im:message.reactions:write_only",
"im:message.urgent.status:write",
"im:message:readonly",
"im:message:recall",
"im:message:update",
"im:special_focus",
"llpp:model:write",
"llpp:resource",
"mail:event",
"mail:user_mailbox.mail_contact:read",
"mail:user_mailbox.mail_contact:write",
"mail:user_mailbox.message.address:read",
"mail:user_mailbox.message.body:read",
"mail:user_mailbox.message.subject:read",
"mail:user_mailbox:readonly",
"minutes:minute:download",
"minutes:minutes",
"minutes:minutes.artifacts:read",
"minutes:minutes.basic:read",
"minutes:minutes.media:export",
"minutes:minutes.search:read",
"minutes:minutes.statistics:read",
"minutes:minutes.transcript:export",
"minutes:minutes:readonly",
"offline_access",
"search:docs:read",
"search:message",
"sheets:spreadsheet.meta:read",
"sheets:spreadsheet.meta:write_only",
"sheets:spreadsheet:create",
"sheets:spreadsheet:read",
"sheets:spreadsheet:write_only",
"slides:presentation:create",
"slides:presentation:read",
"slides:presentation:update",
"slides:presentation:write_only",
"space:document.event:read",
"space:document:create",
"space:document:delete",
"space:document:move",
"space:document:retrieve",
"space:document:shortcut",
"space:folder:create",
"spark:app:read",
"spark:app:write",
"task:comment:write",
"task:task:read",
"task:task:write",
"task:tasklist:read",
"task:tasklist:write",
"vc:meeting",
"vc:meeting.bot.join:write",
"vc:meeting.meetingevent:read",
"vc:recording:read",
"vc:meeting.meetingid:read",
"vc:meeting.participant:write",
"vc:meeting.search:read",
"vc:meeting:export",
"vc:meeting:readonly",
"vc:note:read",
"vc:record",
"vc:record:readonly",
"vc:reserve",
"vc:reserve:readonly",
"wiki:member:create",
"wiki:member:retrieve",
"wiki:member:update",
"wiki:node:copy",
"wiki:node:create",
"wiki:node:move",
"wiki:node:read",
"wiki:node:retrieve",
"wiki:node:update",
"wiki:setting:read",
"wiki:setting:write_only",
"wiki:space:read",
"wiki:space:retrieve",
"wiki:space:write_only",
"wiki:wiki:readonly"
]
}
}
技术栈
| 组件 | 选型 | 说明 |
|---|---|---|
| 语言 | Go 1.21+ | |
| CLI 框架 | cobra | 子命令、自动补全 |
| 飞书 SDK | oapi-sdk-go/v3 | 官方 SDK |
| 配置管理 | viper | YAML / 环境变量 |
| Markdown | goldmark | GFM 扩展支持 |
项目结构
feishu-cli/
├── cmd/ # CLI 命令(每个子命令一个文件)
│ ├── root.go # 根命令、全局配置
│ ├── import_markdown.go # Markdown 导入(三阶段并发管道)
│ ├── export_markdown.go # 导出为 Markdown
│ └── ...
├── internal/
│ ├── client/ # 飞书 API 封装(含资源 URL 解析、业务错误解析、流式下载)
│ ├── converter/ # Markdown ↔ Block 转换器
│ ├── config/ # 配置管理与受控 HTTP 客户端
│ ├── auth/ # OAuth Device Flow、Token 存储与刷新
│ ├── clierr/ apidiag/ # 退出码分类、API 错误诊断(log_id / 缺失 scope)
│ ├── safefile/ textutil/ # 本地路径安全与原子写、UTF-8 安全截断
│ ├── skillbundle/ skillinstall/ # 内嵌技能的读取与安装
│ └── selfupdate/ # feishu-cli update
├── skills/ # Claude Code AI 技能文件
├── main.go
├── Makefile
└── install.sh # 一键安装脚本
开发
# 克隆项目
git clone https://github.com/riba2534/feishu-cli.git
cd feishu-cli
# 安装依赖
go mod tidy
# 构建
make build # 输出到 bin/feishu-cli
make build-all # 多平台构建
# 测试
go test ./...
make check-skills # 重新构建并校验 Skill 结构与命令归属
make check-privacy # 隐私扫描(内部邮箱、企业前缀域名、疑似真实 token)
# 代码检查
go vet ./...
# 发版打包(规范命名 tar.gz + checksums.txt,输出到 dist/)
make release-package VERSION=vX.Y.Z
贡献
欢迎提交 Issue 和 Pull Request!
- Fork 本仓库
- 创建特性分支:
git checkout -b feature/amazing-feature - 提交更改:
git commit -m 'feat: add amazing feature' - 推送分支:
git push origin feature/amazing-feature - 提交 Pull Request
提交信息请遵循 Conventional Commits 规范。
FAQ
什么时候需要 auth login?App Token 和 User Token 有什么区别?
大部分读写操作用 App(Bot)身份 即可(只需 App ID/Secret)。以下能力必须 User Token(feishu-cli auth login 一次即可,token 自动刷新):搜索(docs/messages/apps)、审批任务操作、邮箱全部、vc/minutes 全部、drive upload/download/add-comment/task-result/search/secure-label 等。markdown create/fetch/overwrite/patch/diff 与 drive import/export/export-download/move 支持 --as bot|user|auto(默认 auto:User 优先;未配置回退 Bot;已配置但刷新失败 fail-closed,不会静默切 Bot)。命令级要求见各命令 --help;feishu-cli auth check --scope "..." 可在执行前预检。
操作外部群报 232033 怎么办?
外部群(跨租户)的「群信息/成员/配置」类 API 默认拒绝,需要:① App 开启「对外共享能力」;② 该 App 的 Bot 已加入此群。临时切换:FEISHU_APP_ID=cli_xxx FEISHU_APP_SECRET=xxx feishu-cli <命令> --as bot。注意 msg history / msg send 等消息侧 API 不受此限制。
bitable 操作报 91403 no permission?
不是 token 问题,是 Bot 还不是这张多维表格的协作者。执行 feishu-cli perm add <base_token> --doc-type bitable --member-type open_id --member-id <bot_open_id> --perm full_access,或将文档可见性调整为组织内可见。
用 CLI 导入的文档,自己在飞书里看不到?
doc import 默认以 Bot 身份建档,文档归属于应用。已 auth login 时,CLI 会在 Bot 创建文档、表格、多维表格、文件夹、知识库节点、演示文稿后自动给当前登录用户授予 full_access(输出中的 permission_grant 字段给出结果);未登录时会在 stderr 提示。也可手动授权:feishu-cli perm add <doc_id> --doc-type docx --member-type email --member-id you@example.com --perm full_access,或配置 owner_email 让技能流程转移所有权(见 AI 技能集成)。
报 99991672 / 99991679 scope 不足?
99991672 是应用(tenant)权限未开通,重新登录无法解决——按错误信息里的开放平台链接为应用开通并发布版本,或直接导入上方完整权限清单;99991679 是用户授权缺 scope——feishu-cli auth login --scope "<所需 scope>" 增量授权即可。两者都以退出码 3 结束,错误信息附带缺失的 scope 与 log_id。feishu-cli auth scopes --scope "<scope>" 可以逐项诊断是应用未开通还是用户未授权。
更新日志
每个版本的完整变更记录见 CHANGELOG.md,发布产物与安装包见 Releases。
Star History
图表由 star-history.dera.page 生成,若上方未加载出来(该服务偶发超时),可直接查看交互式 Star 增长曲线。
License
MIT。部分实现与技能文档改编自 larksuite/cli(MIT),版权与许可声明见 THIRD_PARTY_NOTICES.md。
相关链接
- 飞书开放平台 — 创建应用、获取凭证
- 飞书 API 文档 — 接口参考
- Claude Code — AI 编程助手
- HappyClaw — 基于 Claude Agent SDK 的自托管多用户 AI Agent 系统
Похожие ресурсы

lark-cli (Lark CLI)
CLIOfficial Lark (Feishu) CLI with 200+ commands for messages, docs, Base, Sheets, calendar, mail, approvals, OKRs, meetings and Minutes, plus 20+ bundled lark-* agent skills and structured output. Create a Lark app and sign in first.
larksuite/cli17.7k
Lark CLI Skills
SkillThe 20+ skills that ship with the official Lark (Feishu) lark-cli, covering messages, docs, Base, Sheets, calendar, mail, tasks, approvals and meeting notes. Install lark-cli and complete app setup and authorization first.
larksuite/cli17.7k
lark-doc
SkillOfficial Lark (Feishu) skill to read, create and edit Lark docs and wiki pages, insert or download images and attachments, and work with whiteboards and mind notes. Depends on lark-cli and the lark-shared skill; requires Lark authorization.
larksuite/cli17.7k
feishu2md
CLIExports Feishu/Lark docs, whole folders or wikis to Markdown with images, so agents can read, migrate or archive them. Requires creating a custom app on the Feishu/Lark Open Platform and configuring its App ID and App Secret.
Wsine/feishu2md2.2k
gws (Google Workspace CLI)
CLIOne CLI for Gmail, Drive, Calendar, Docs, Sheets and other Google Workspace APIs, with commands generated from the Discovery service, JSON output and 100+ Agent Skills. From the googleworkspace org but not officially supported; needs OAuth via a Google Cloud project.
googleworkspace/cli31.6k
lark-workflow-standup-report
SkillOfficial Lark (Feishu) workflow skill that turns your calendar events and open tasks for today, tomorrow or this week into a standup summary, flagging conflicts and free slots. Needs lark-cli with Node.js, app setup, and calendar and task permissions on your own account.
larksuite/cli17.7k