skills/feishu-cli-chat/SKILL.md
飞书会话浏览、消息互动与群聊管理。看聊天记录(单聊/群聊/话题群)、搜群、获取消息详情、 Reaction 表情回应、Pin 置顶/取消置顶、删除消息,以及群聊信息管理(获取/更新/解散/成员)。 当用户请求"看群消息记录 / 拉群聊天记录 / 导出聊天记录 / 获取群历史 / 看话题回复 / 搜群 / 看私聊记录 / dump 飞书消息"时使用本技能;包括话题群(chat_mode=thread)的整线程展开。 读类(msg history/list/get/mget/thread-messages)登录后默认 User Token、未登录回落 Bot; 互动类(reaction/pin/search-chats/chat get/update/delete/member)必需 User Token; msg delete 默认 App Token 用于 Bot 自撤回,可显式 User Token 给管理员撤回场景; chat create/link 默认 Bot 身份创建群/获取群链接。
npx skillsauth add riba2534/feishu-cli feishu-cli-chatInstall 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-msg;构造卡片走 feishu-cli-card。
| 场景 | 走哪 |
|---|---|
| 看一段时间窗内的群消息(含话题回复、名字反解、卡片解析) | scripts/fetch_chat_history.py(一条命令搞定) |
| 看一页群聊最新消息(v1.27.1+ 默认自动展开所有话题) | msg history 单次调用 |
| 看私聊记录 | msg history --user-email 或 --user-id |
| 找群 | msg search-chats --query |
| 看单条消息 / 合并转发 | msg get / msg mget |
| 看一个话题的全部回复 | msg thread-messages <thread_id> |
| 按关键词搜消息 | search messages(属于 feishu-cli-search) |
| 群成员管理、改群名 | chat update / chat member ... |
| Reaction / Pin / 删除 | msg reaction / msg pin / msg delete |
按命令类型区分:
msg history/list/get/mget/thread-messages/resource-download):登录后自动从 ~/.feishu-cli/token.json 加载 User Token,未登录回落 App Token(要求 Bot 在群里)。外部群 Bot 通常不在群里,读外部群必须先登录:
feishu-cli auth check --scope "im:message:readonly im:message.group_msg:get_as_user"
feishu-cli auth login --domain chat --recommend
reaction add/remove/list、pin/unpin/pins、search-chats、chat get/update/delete、chat member list/add/remove):未登录直接报错。chat create、chat link):默认 App Token,无需登录;显式 --user-access-token 时切到 User(以本人身份创建)。msg delete:默认 App Token,用于 Bot 撤回自己 24 小时内发送的消息;传 --user-access-token 或环境变量时可走管理员撤回场景。最常见的需求——"把群 X 最近 24 小时的全部消息拉出来"——同时涉及翻页、话题展开、
名字反解、撤回消息、富文本和卡片渲染。这些步骤每一步都有不止一个坑(详见
references/output-quirks.md),单条 CLI 解不完,所以封装成脚本:
# 默认最近 24 小时
python3 skills/feishu-cli-chat/scripts/fetch_chat_history.py oc_xxxxxxxx --since 24h
# 自定义时间窗 / 输出目录 / Bot 显示名
python3 skills/feishu-cli-chat/scripts/fetch_chat_history.py oc_xxxxxxxx \
--start 2026-05-20T00:00:00 --end 2026-05-22T00:00:00 \
--output-dir /tmp/my_chat \
--bot-name "你的 Bot 显示名"
# 不展开线程(更快,但话题群会丢回复)
python3 skills/feishu-cli-chat/scripts/fetch_chat_history.py oc_xxx --since 24h --no-thread
输出 4 个文件到 --output-dir(默认 /tmp/lark_chat/):
| 文件 | 内容 |
|---|---|
| history.json | 主消息原始 JSON + 飞书侧返回的部分 sender_names |
| threads.json | 每个 thread_id → 完整回复列表 |
| names.json | 合并后的 open_id / app_id → 名字映射 |
| timeline.txt | 可读时间线:主消息升序 + 缩进 4 空格的线程回复(└─ 标识) |
脚本默认行为:
msg history 用 ByCreateTimeAsc + start-time + end-time,按 page_token 翻页到 has_more=false;thread_id,对每个 tid 调 msg thread-messages 展开(不传 -o json,因为它默认就是 JSON 且加了反报错);mentions[].name → sender_names API 字段 → user info 调用(外部用户会 41050,静默跳过);cli_xxx)单独映射成 --bot-name 提供的名字;如果脚本不能用,看下面的"手工拉群消息"小节,知道每步在做什么再退化到 jq + bash。
# 群聊一页历史(v1.27.1+ 默认自动展开线程:一次拉根 + 所有话题回复)
feishu-cli msg history --container-id oc_xxx --container-id-type chat --page-size 50 -o json
# 关闭自动展开(仅拉根消息,更快)
feishu-cli msg history --container-id oc_xxx --container-id-type chat \
--page-size 50 --expand-threads=false -o json
# 调整展开规模(默认 per=50, total=500,与 lark-cli 对齐)
feishu-cli msg history --container-id oc_xxx --container-id-type chat \
--threads-per-page 30 --threads-total-limit 300 -o json
# 私聊:邮箱或 open_id 自动反查 P2P chat_id
feishu-cli msg history --user-email [email protected] --page-size 50 -o json
feishu-cli msg history --user-id ou_xxx --page-size 50 -o json
# 时间窗内全部消息(升序 + 翻页)
feishu-cli msg history --container-id oc_xxx --container-id-type chat \
--start-time $(date -v-24H +%s) --end-time $(date +%s) \
--sort-type ByCreateTimeAsc --page-size 50 -o json
# 单条 / 批量消息详情
feishu-cli msg get <message_id> -o json
feishu-cli msg mget --message-ids <id1,id2>
# 话题回复(注意:thread-messages 不接受 -o json,默认就是 JSON 输出)
feishu-cli msg thread-messages <thread_id> --page-size 50 --sort ByCreateTimeAsc
msg history -o json 顶层新增三个字段,与官方 lark-cli +chat-messages-list 对齐:
| 字段 | 说明 |
|------|------|
| thread_replies | {thread_id: [reply, ...]},ASC 顺序,不含根消息 |
| thread_has_more | {thread_id: true} 标记该话题在 threads-per-page 限额内未拉完 |
| thread_replies_card_texts | 线程内 interactive 卡片的 card_texts 提取 |
sender_names 字段同时合并主消息 + merge_forward + thread_replies 三处来源的 mentions 名字,外部用户名字解析率显著提升(实测话题群从 8% → 42%)。
仍未解析的发送者通常是真正的跨租户外部用户且本话题内无人 @过他——这是飞书 OpenAPI 限制,contact basic_batch 不返回,官方 lark-cli 同样拿不到。
feishu-cli msg search-chats --query "项目群" -o json # 搜群
feishu-cli search messages "关键词" --chat-type p2p_chat -o json
feishu-cli search messages "关键词" --chat-ids oc_xxx -o json
搜消息属于 feishu-cli-search,本技能在阅读任务里顺带调用。
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>
feishu-cli msg pin <message_id>
feishu-cli msg unpin <message_id>
feishu-cli msg pins --chat-id <chat_id>
feishu-cli msg delete <message_id> # Bot 自撤回
feishu-cli msg delete <message_id> --user-access-token u-xxx # 管理员撤回
feishu-cli chat get oc_xxx # 外部群可能 232033(看下方"外部群操作")
feishu-cli chat update oc_xxx --name "新群名"
feishu-cli chat member list oc_xxx # 默认 auto;外部群推荐 --as bot
feishu-cli chat member add oc_xxx --id-list ou_xxx,ou_yyy
feishu-cli chat member remove oc_xxx --id-list ou_xxx
feishu-cli chat create --name "项目群" --user-ids ou_xxx,ou_yyy
feishu-cli chat delete oc_xxx
chat member list/add/remove 支持 --as bot|user|auto:
auto(默认):优先 User Token,回退 Bot Tokenbot:强制 Bot Token,外部群推荐(前提:App 开了"对外共享能力" + Bot 在群里)user:强制 User Token凡是碰到 232033 错误 或 想拉外部群完整成员名单,先读 references/external-chat.md。
v1.27.2+ 新增:
msg history 支持 --as bot|user|auto flag(默认 auto = User 优先回退 Bot)msg history 对群聊容器自动拉一次 chat member list,结果挂在顶层 chat_members 字段
[{member_id, member_id_type, name, tenant_key}, ...] 完整成员名单(含群昵称)chat_members_note 提示字段,告诉 Agent 怎么用(避免错配)msg history 输出的每条 items[*] 注入 sender_name 字段,省去查 sender_names 字典chat member list/add/remove 全部支持 --as bot|user|autochat get/update/delete/link/member 命令收到 232033/232011/232006 时自动打印中文解决方案⚠️ 重大陷阱:外部群里 chat_members[*].member_id 和 items[*].sender.id 是不同 namespace,
永远不要用 member_id 反查 sender 名字。详见 references/external-chat.md 「重大陷阱」段。
# 切到对外共享 App + Bot Token,从 msg history 顺带拉
FEISHU_APP_ID=cli_xxx FEISHU_APP_SECRET=xxx \
feishu-cli msg history --container-id oc_xxx --container-id-type chat \
--page-size 1 --as bot --expand-threads=false -o json \
| jq '.chat_members[] | select(.tenant_key != "<my_tenant>") | .name'
# → 输出所有外部商家名字(即群昵称),可直接喂给名字规范检查脚本
一句话:外部群(external=true)的「群信息/成员/配置」类 API 默认禁用,必须满足:
如果你有另一个开了对外共享能力的 App,临时切换即可:
# 临时切 App(不写盘)
FEISHU_APP_ID=cli_对外共享App \
FEISHU_APP_SECRET=xxx \
feishu-cli chat member list oc_xxx --as bot
返回的 name 字段就是用户在该群的群昵称(没设则回落全局名),可直接用于名字规范检查等场景。
判断 chat 是否外部群:feishu-cli msg search-chats --query "..." -o json 看返回的 external 字段。
完整路径/错误码/排错见 references/external-chat.md。
写代码前过一眼,否则容易卡 30 分钟。详细版见 references/output-quirks.md。
| 坑 | 一句话规避 |
|---|---|
| thread-messages 加 -o json 报错 | 不要传;它默认就是 JSON 输出 |
| thread-messages 返回 PascalCase | 用 d.get("items") or d.get("Items") 兼容两套 key |
| history 时间秒、thread-messages 时间毫秒 | start_sec vs start_sec * 1000,分别传 |
| 撤回消息 body.content 是字面字符串 | try: json.loads(...) 包住,失败时直接当字符串显示 |
| post content 两种结构 | 兼容 {zh_cn:{title,content}} 和扁平 {title,content} |
| system 消息 template 含 {from_user} 占位符 | 用同对象其他字段填充(list 逗号 join) |
| Bot 发送者 cli_xxx ≠ sender_names 中的 ou_xxx | 单独映射成已知的 bot 名字 |
| 外部群 chat get/member list/... 232033 | 必读 references/external-chat.md;切到开了对外共享的 App + --as bot |
| 跨企业 user info 41050 | 静默跳过,靠 mentions[].name 兜底 |
| msg history 默认不展开线程 | 话题群必须再调 thread-messages 展开,否则丢回复 |
外部群里大多数发送者飞书后端不返回名字。按可靠性 + 成本排序:
mentions[](消息自带):{"id":"ou_xxx","id_type":"open_id","name":"张三","key":"@_user_1"},
还能用 key 替换 text 消息里的 @_user_N 占位符。不受外部租户隔离限制,首选。sender_names(history/thread-messages 顶层):飞书反解的子集,覆盖率低,作为起点。user info <ou_xxx>:跨企业用户必返 41050 no user authority error,外部群几乎全部命中,静默跳过。cli_xxx:单独映射成你提前知道的 bot 名字(脚本的 --bot-name)。body.content 里,按 msg_type 解析 JSON 字符串(撤回消息除外,见上);mentions 字段同时含 open_id → name 映射 + @_user_N key → name 映射,比 sender_names 更全,优先用。msg history 默认带 --card-content-type user,会得到 v2 schema JSON + 抽取后的 card_texts。
脚本里已经覆盖 v2 schema 的递归(column_set / form / collapsible_panel / action /
button / img / note),手工解析见 references/output-quirks.md 的 §8。
需要"原版 cardDSL"或"OAPI 渲染版"时切换:
feishu-cli msg history --container-id oc_xxx --card-content-type raw -o json # 平台内部 cardDSL
feishu-cli msg history --container-id oc_xxx --card-content-type rendered -o json # OAPI 渲染版/降级版
scripts/fetch_chat_history.py — 端到端拉群消息的可执行脚本references/output-quirks.md — JSON key / 时间单位 / 错误码 / 卡片解析等所有 API 怪癖tools
飞书多维表格(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 专注高级能力。 当用户请求"筛选视图"、"筛选条件"、"加下拉框"、"数据验证"、"列下拉"、"浮动图片"、"插入图片"、"批量样式"时使用。