
AI 对接飞书:用 lark-cli 生成一份可执行的旅游计划书
这次旅行计划不是从一张空白纸开始的。
我让 AI 调用 lark-cli 读取飞书知识库里的旅行文档,再对路线、住宿、交通和风险提醒进行反复核对,最后写回飞书文档,形成一份可以继续更新的旅游计划书。
这条链路可以概括成:
1 | AI 读取任务背景 |
为什么要把旅游计划放进飞书
普通聊天适合讨论想法,却不适合长期维护一份复杂行程。旅行计划通常同时包含:
- 每天去哪里,以及当天是否需要长距离转场。
- 高铁、飞机、景区接驳的先后关系。
- 酒店是否已定、是否可取消、行李如何处理。
- 门票和车票什么时候开售,最晚什么时候要买。
- 下雨、晚点、赶不上车时的备选方案。
这些信息分散在聊天里,很容易出现“前面说住沟口,后面又写成住景区内”的冲突。飞书文档提供了稳定的正文、表格和待办区,AI 每次修改前先读取当前版本,就能在原有结构上继续迭代,而不是重新生成一篇互相矛盾的攻略。
lark-cli 读取飞书文档
AI 可以直接调用 lark-cli,先以带 block ID 的 XML 形式读取文档:
1 | lark-cli docs +fetch ` |
with-ids 很重要。飞书文档中的标题、段落、表格和复选框都会对应一个 block ID,后续更新时需要准确定位目标 block。直接把整篇文档复制出来再覆盖,容易丢失原有结构,也更容易把旧版本内容带回来。
读取后,AI 先做事实整理,而不是马上改文档。我会把内容拆成四类:
- 已经确认的事实,例如已支付的酒店订单和已确定的航班。
- 推荐方案,例如为长距离转场安排更稳妥的交通衔接。
- 待确认事项,例如车票开售、门票预约和接驳询价。
- 风险和兜底,例如为天气、晚点和体力变化预留替代方案。
这样处理后,AI 不会把“建议住哪里”误写成“已经订好了”。
用 block 更新,而不是盲目重写全文
确认要修改的区域后,再使用 block 级更新:
1 | @' |
每做一次 block 修改,我都会重新 fetch 相关章节。因为一次更新可能改变后续 block 的结构,继续使用旧 ID 有机会得到“block not found”,也可能更新到错误位置。
文档更新完成后,至少检查三项:
- 飞书返回
result: success,并且 revision ID 已变化。 - 重新读取的内容中,旧路线和旧住宿描述已经消失。
- 待办、表格和正文之间没有互相冲突的日期。
这次实际生成的计划
这次以一份跨城山地旅行计划为例。文档没有停留在“推荐几个景点”,而是把城市段、景区段、交通节点和住宿落点放进同一套结构,再为关键转场保留主选、备选和确认时间。
其中最关键的不是景点数量,而是把约束写清楚:长距离转场日要控制节奏,景区游览要和住宿位置衔接,返程交通要倒排,天气和体力变化要有弹性方案。
AI 真正帮上忙的地方
AI 的价值不是凭空推荐更多景点,而是把分散信息变成有约束的执行方案。
例如,住宿表最终按“日期、酒店 / 落点、费用、简要备注”整理,明确区分已定和待定项目。交通表则把每一段的主选、备选、预算和最晚确认时间放在一起。
这种结构让计划书具备了三个属性:
1 | 能看懂:按日期和地点组织 |
如果下一次酒店变更,AI 只需要重新读取住宿章节,更新受影响的几行,再检查返程接驳是否仍然成立,不必从头写一篇攻略。
这套工作流的边界
AI 和 lark-cli 各自负责不同的事情:
| 组件 | 负责什么 | 不负责什么 |
|---|---|---|
| Codex | 理解上下文、运行命令、整理方案 | 保证外部票务信息永远准确 |
| lark-cli | 读取和更新飞书文档 | 替代飞书权限管理和数据备份 |
所以,外部信息仍然需要人工确认。高铁时刻、景区限流、接驳班次和节假日价格都可能变化,AI 生成的“推荐”不能当成已经出票或已经预约。更稳妥的做法,是在文档中明确标记“已定 / 推荐 / 待确认 / 备选”。
结语
这次实践让我看到,AI 对接飞书最有用的地方,不是把聊天内容搬到另一个窗口,而是建立一条可持续的工作链路:AI 负责推理和执行,lark-cli 把结果写回飞书,飞书再成为下一次修改的事实来源。
旅游计划书只是一个例子。同样的方法也可以用于会议纪要、项目排期、采购清单和家庭事务。只要文档结构稳定、权限边界清楚、每次更新后重新校验,AI 就能从“一次性生成器”变成真正参与维护的协作工具。
- 感谢您的赞赏。



