终端操作企业微信与飞书的完整实践指南:wecom-cli 与 lark-cli 深度解析
如何在黑乎乎的终端窗口里,通过敲击键盘来完成原本需要频繁点击鼠标的办公软件操作,甚至让 AI 自动接管这些流程?本篇文章将详细介绍两款分别针对企业微信和飞书的命令行工具——wecom-cli 与 lark-cli,通过实际操作场景拆解它们的安装配置、参数逻辑与底层架构,帮助你将日常办公行为转化为可自动化执行的代码指令。
图片来源:Unsplash
如何通过命令行接管企业微信日常业务?
wecom-cli 通过将通讯录、待办、会议等七大业务域封装为独立的终端命令,让黑底白字的命令行窗口成为操控企业微信的核心控制台。
这款基于 Rust 语言开发的工具,核心设计目标是同时服务于人类和 AI Agent。它将企业微信中最核心的通讯录、待办、会议、消息、日程、文档和智能表格封装成了 7 个品类及 12 个专属 AI Skills。对于工程团队而言,这意味着你可以摆脱图形界面的束缚,将日常操作直接写入脚本或交给 AI 处理。
环境准备与凭证配置
在使用任何业务命令之前,必须完成基础环境的搭建。wecom-cli 依赖 Node.js 环境,你需要提前准备好企业微信机器人的 Bot ID 和 Secret。
安装过程分为两步,缺一不可。第一步是通过 npm 全局安装 CLI 主体:
npm install -g @wecom/cli
第二步是安装对应的 CLI Skill,这是工具能够被 AI 识别和调用的前提:
npx skills add WeComTeam/wecom-cli -y -g
安装完成后,需要进行一次性的凭证初始化。执行 wecom-cli init 会进入交互式引导,你也可以通过附加参数直接传入 Bot ID。配置完成后,凭证不会以明文形式散落在系统中,而是被加密存储在本地路径 ~/.config/wecom/bot.enc 中。
场景一:快速查找人员与分配任务
在跨部门协作时,快速定位人员并下发任务是最高频的场景。通过通讯录品类,你可以直接拉取权限内的成员列表:
wecom-cli contact get_userlist '{}'
这里的 {} 表示传入一个空的 JSON 参数。因为获取全量列表不需要任何过滤条件,所以直接传空参即可。如果你忘记了某个品类下有哪些可用方法,直接输入品类名称(如 wecom-cli contact),终端会列出该域下的所有工具。
当需要给团队分配任务时,待办品类提供了完整的生命周期管理。创建待办时,必须严格按照要求的格式传入参数:
wecom-cli todo create_todo '{"content": "完成Q2规划文档", "remind_time": "2026-06-01 09:00:00"}'
在这个 JSON 结构中,content 承载任务内容,而 remind_time 的时间格式必须精确到秒。当任务推进后,可以通过更新命令修改状态,在示例逻辑中,将 todo_status 设置为 0 即代表标记完成。需要极其警惕的是 delete_todo 命令,文档明确标注此操作不可撤销,一旦执行,数据将永久丢失。
场景二:会议调度与历史消息追溯
组织会议往往涉及多方时间的协调与确认。通过会议品类,你可以直接在终端中完成会议的创建与人员邀请:
wecom-cli meeting create_meeting '{"title": "技术方案评审", "meeting_start_datetime": "2026-03-30 15:00", "meeting_duration": 3600, "invitees": {"userid": ["zhangsan", "lisi"]}}'
仔细观察这个参数结构,meeting_duration 的单位是秒而非分钟,3600 代表 1 小时。此外,invitees 字段接收的是一个包含 userid 数组的对象。如果你后续需要修改参会人员,使用更新受邀成员的工具时,它会执行“全量覆盖”逻辑——你必须把想保留的人和新人一起传进去,否则原名单会被清空。
在消息追溯场景中,工具支持按时间维度拉取包含文本、图片、文件等多种类型的聊天记录:
wecom-cli msg get_message '{"chat_type": 1, "chatid": "zhangsan", "begin_time": "2026-03-29 09:00:00", "end_time": "2026-03-29 18:00:00"}'
如果在记录中发现了重要的多媒体文件,可以通过获取到的 media_id 直接将其下载到本地。反之,发送文本消息也只需构建好对应的 JSON 结构即可完成。
“
扫码加入企业微信交流群:
场景三:复杂日程与异步文档处理
日程管理在命令行下展现出了极高的结构化优势。除了基础的增删改查,它支持直接查询多成员的时间冲突情况(1至10人),并且支持日程参与人的动态增删,无需重建日程。创建日程时,参数的嵌套层级较深:
wecom-cli schedule create_schedule '{"schedule": {"start_time": "2026-03-30 14:00:00", "end_time": "2026-03-30 15:00:00", "summary": "需求评审", "attendees": [{"userid": "zhangsan"}], "reminders": {"is_remind": 1, "remind_before_event_secs": 900, "timezone": 8}}}'
在这个结构中,reminders 对象控制着提醒逻辑:is_remind 为 1 表示开启,remind_before_event_secs 设为 900 意味着提前 15 分钟触发,timezone 设为 8 代表东八区。
在处理云文档时,你会遇到一个非常典型的异步编程场景。读取基于 Markdown 格式的文档时,第一次调用读取接口通常不会直接返回正文,而是返回一个 task_id,因为服务端需要时间进行格式转换。你必须拿着这个 task_id 发起第二次轮询调用,才能获取到真正的文档内容。编辑文档则是直接使用 Markdown 语法对正文进行完全覆写。
场景四:智能表格的数据结构化操作
智能表格的操作逻辑被严格映射为“子表-字段-记录”三层结构。创建表格时 doc_type 需指定为 10。在操作字段(列)时,你需要明确指定字段类型,例如添加一个单选列:
wecom-cli doc smartsheet_add_fields '{"docid": "DOC_ID", "sheet_id": "SHEET_ID", "fields": [{"field_title": "状态", "field_type": "FIELD_TYPE_SINGLE_SELECT"}]}'
而在操作记录(行)时,JSON 的嵌套变得非常严密。添加记录时,values 里的键是列名,值必须是包含 type 和 text 属性的对象数组。更新记录时,为了告诉系统如何匹配列,你必须在参数中显式声明 key_type 为 CELL_VALUE_KEY_TYPE_FIELD_TITLE。与待办类似,子表、字段和记录的删除操作均不可逆。
“
个人反思:在拆解 wecom-cli 的参数结构时我意识到,纯 JSON 交互虽然对初学者的心智负担较重,要求严格遵循格式,但这恰恰是 AI Agent 最友好的形态。它消除了图形界面中状态机的复杂性(比如按钮变灰、弹窗遮挡),将所有业务逻辑转化为绝对确定的数据结构。
飞书开放平台的三层架构调用怎么用?
lark-cli 通过构建“快捷命令-API命令-通用调用”的三层架构,在保持极简操作体验的同时,提供了覆盖飞书开放平台 2500 多个底层接口的无限可能。
相比于企业微信的工具,飞书的 lark-cli 体量更为庞大,涵盖了日历、即时通讯、云文档、多维表格、电子表格、任务、知识库、通讯录、邮箱、视频会议等 11 个业务域。它内置了 200 多条精选命令和 19 个 AI Agent Skills,并且经过了专门的“AI 友好调优”,通过提供更合理的默认值和结构化输出来提升 AI 调用的成功率。
安装配置的人机分流机制
lark-cli 的安装配置过程体现出了极强的工程实用性,它明确区分了人类用户和 AI Agent 两种操作路径。
人类用户可以通过 npm 一键安装并使用交互式的 config init 和 auth login --recommend 完成配置,--recommend 参数会自动勾选常用权限,省去了繁琐的手动选择。
但如果是由 AI Agent 来执行配置,逻辑则完全不同。Agent 必须在后台运行配置命令(附加 --new 参数),此时终端会输出一个授权链接。Agent 的任务是截获这个链接并发送给人类用户,人类在浏览器中完成授权后,后台命令才会自动结束。登录过程同理。这种设计完美解决了 AI 无法进行图形界面交互的痛点。
细粒度权限控制与身份切换
在认证层面,lark-cli 提供了极其精细的控制颗粒度。你不仅可以使用常规的登录、登出和状态查看,还可以通过 --domain 参数按业务域进行权限隔离(例如只授权日历和任务域),甚至可以通过 --scope 参数精确到某一个具体的权限字符串。
为了适应自动化流程的非阻塞需求,登录命令提供了 --no-wait 参数。使用该参数后,命令会立即返回一个验证 URL 和设备码(Device Code),终端不会被挂起。Agent 可以在后续任意时刻通过设备码恢复轮询状态。
更实用的是身份切换机制。在任意业务命令末尾附加 --as user 或 --as bot,就可以强制指定该次调用是以当前登录用户的身份执行,还是以机器人的身份执行,这在一套配置下处理不同权限等级的任务时极为关键。
图片来源:Unsplash
三层架构的深度解析与场景应用
为什么需要三层架构?因为不同技术背景的使用者对操作粒度的需求差异巨大。lark-cli 将命令分为了快捷命令、API 命令和通用 API 调用三个层次。
快捷命令层: 这类命令以 + 号为前缀,例如 lark-cli calendar +agenda 或 lark-cli im +messages-send --chat-id "oc_xxx" --text "Hello"。这层命令的核心价值在于“屏蔽复杂性”。它内置了智能默认值,默认以表格形式输出结果,非常适合人类快速查看或 AI 进行简单的日常操作。
API 命令层: 当快捷命令无法满足定制化需求时,可以使用这层命令。它是从飞书官方元数据自动生成并经过筛选的 100 多条命令,与平台端点一一对应。调用时需要手动传入 JSON 格式的 params,例如:
lark-cli calendar events instance_view --params '{"calendar_id":"primary","start_time":"1700000000","end_time":"1700086400"}'
通用 API 调用层: 这是拥有最高权限的“上帝模式”。它直接暴露了 HTTP 方法和接口路径,覆盖了 2500 多个底层端点。通过 --params 传递查询参数,通过 --body 传递请求体。当你需要调用极为生僻或尚未被封装为快捷命令的接口时,这是唯一的出路。
进阶实操技巧:格式化、分页与安全预演
面对大量数据的返回,lark-cli 提供了强大的输出控制能力。通过 --format 参数,你可以将默认的 JSON 响应转换为适合阅读的 pretty 格式、适合快速浏览的 table 格式、适合管道处理的 ndjson 格式,以及可以直接用表格软件打开的 csv 格式。
在处理全量数据时,分页参数至关重要。--page-all 会自动翻页抓取所有数据;--page-limit 可以限制最大页数;而 --page-delay 则允许你在每页请求之间设置毫秒级的延迟,这在调用有严格频率限制的接口时是防止触发封禁的核心手段。
在执行发送消息、创建文档等具有副作用的操作前,强烈建议使用 --dry-run 参数。加上这个参数后,工具只会在终端展示构建好的请求结构,但不会真正将其发送到服务器,这相当于提供了一个绝对安全的沙盒环境。
如果你对某个命令的参数结构存疑,无需去翻阅网页文档,直接使用 Schema 自省功能。例如执行 lark-cli schema calendar.events.instance_view,终端会直接列出该方法需要的参数、请求体结构、响应结构以及所需的权限,相当于把文档直接内置到了终端里。
“
个人反思:从 wecom-cli 的直接调用到 lark-cli 的三层抽象,我看到的是对“人机共用”这个难题的妥协与智慧。快捷命令降低了人类的认知门槛,而底层的 HTTP 调用保留了 AI 的绝对自由度,这种分层设计在复杂的系统工程中非常值得借鉴。
将办公软件交给终端和 AI,安全边界在哪里?
赋予 AI 终端操作权限意味着将用户身份直接暴露给不可控的模型输出,因此必须通过严格的工具底层限制和使用规范来划定安全红线。
这两款工具虽然极大提升了效率,但也引入了模型幻觉、执行不可控和提示词注入等固有风险。一旦 AI 误解了意图,或者在读取文档时被恶意文本误导,它可能会以你的身份执行越权操作或导致敏感数据泄露。
为了应对这些威胁,lark-cli 在底层启用了多重默认安全保护,包括输入防注入机制、终端输出净化(防止敏感信息残留在屏幕上),以及调用操作系统原生的密钥链来存储凭证,这比单纯的本地文件加密具有更高的系统级安全性。
然而,技术手段无法覆盖所有的业务风险。基于文档的明确规范,对接这类工具的机器人必须被严格限制为“私人对话助手”。绝对不能将其拉入任何群聊,也不能允许其他用户与其产生交互。因为一旦进入群聊环境,任何群成员都有可能通过对话触发 AI 执行高危操作,或者间接获取你的私人数据。同时,文档强烈建议不要修改任何默认的安全配置,一旦放开限制,由此产生的一切后果将完全由使用者承担。
实用摘要 / 操作清单
-
环境依赖: 确保本地已安装 Node.js 及 npm/npx 环境。 -
wecom-cli 核心流程: 全局安装主体及 Skill 包 -> 执行 wecom-cli init加密存储凭证 -> 通过wecom-cli <category> <method> '{json}'格式调用业务。 -
lark-cli 核心流程: 全局安装主体及 Skill 包 -> 区分人类交互配置与 Agent 后台提取链接配置 -> 按需使用 +快捷命令或底层 API 调用。 -
安全红线: 严禁修改默认安全配置;严禁将关联机器人拉入群聊或暴露给他人使用。 -
防错机制: 涉及数据变更的操作前,务必在 lark-cli 中使用 --dry-run预览;在 wecom-cli 中警惕带有“不可逆”标注的删除指令。
一页速览(One-page Summary)
wecom-cli 与 lark-cli 是两款专为终端和 AI Agent 设计的办公软件控制工具。wecom-cli 聚焦企业微信七大核心品类,通过严格的 JSON 参数交互实现业务操作,特色在于文档读取的异步轮询与智能表格的三层结构管理。lark-cli 覆盖飞书十一大业务域,创新性地提出了“快捷命令-API命令-通用调用”三层架构,兼顾了人类易用性与 AI 的全接口覆盖能力,并配备了强大的格式化输出、防封分页与 Schema 自省功能。两者均在底层构建了防注入与凭证加密机制,但使用者必须恪守“仅作私人助手、严禁入群”的安全底线,以防范模型幻觉带来的越权风险。
常见问答(FAQ)
wecom-cli 的凭证存储在本地安全吗?
工具会将凭证进行加密处理,并存储在本地系统的 ~/.config/wecom/bot.enc 路径下,不会以明文形式暴露。
为什么使用 lark-cli 读取文档时第一次没有返回内容?
读取基于 Markdown 的文档是一个异步过程,第一次调用通常只返回一个 task_id,你需要携带该 task_id 进行第二次轮询调用才能获取正文。
lark-cli 的三层调用架构应该选哪一层?
日常查看或简单操作使用带 + 前缀的快捷命令;需要精细控制参数时使用 API 命令;当需要调用未被封装的生僻接口时,使用通用 API 调用层。
wecom-cli 中更新会议受邀成员时需要注意什么?
更新受邀成员执行的是“全量覆盖”逻辑,你必须在新参数中包含所有需要保留的原成员和新成员,否则原名单会被清空。
如何防止 AI Agent 在飞书中执行危险的发送或删除操作?
在 lark-cli 中,可以在危险命令后附加 --dry-run 参数,这会让工具只展示请求结构而不实际发送,起到安全沙盒预演的作用。
能否将配置好权限的飞书机器人拉入项目群让团队共用?
绝对不能。文档明确警告,必须将此类机器人作为私人对话助手使用,拉入群聊会导致权限被群内其他成员恶意或误触发,造成严重的数据泄露或越权操作。
