1. 飞书自建应用对接 OpenClaw 到底在配什么
飞书开放平台自建应用对接 OpenClaw,本质上是把飞书当成消息入口,把 OpenClaw 当成消息处理与自动化执行的大脑。飞书这边负责创建企业自建应用、开启机器人能力、订阅消息事件、开通权限并发布版本;OpenClaw 这边只负责接收两组凭证:App ID 和 App Secret。很多开发者第一次做的时候会以为要填一堆回调地址、Token、EncodingAESKey,其实 OpenClaw 的飞书渠道走的是长连接模式,本地 WebSocket 直接和飞书通信,不需要公网域名,也不需要服务器回调。所以整篇的重点就落在两个地方:飞书侧把应用配置到“可发布、可收消息”的状态,OpenClaw 侧把两组凭证准确回填并启用渠道。
适合谁看:需要在飞书里接入一个能收发消息、能联动文档和多维表格的机器人,但手上没有公网服务器、也不想折腾内网穿透的开发者。如果你之前接过企业微信或钉钉机器人,会发现飞书这套凭证逻辑更简单,但权限和事件这两块更容易漏配,漏一个就会出现“保存成功但机器人不回消息”的情况。下面按飞书后台操作、OpenClaw 配置、连通性验证、排错四段展开,配置骨架可以直接复制。
2. 前置准备:OpenClaw 安装包与飞书账号权限
在动飞书后台之前,先把 OpenClaw 跑起来,否则凭证复制出来没地方填。OpenClaw 飞书渠道只需要 App ID、App Secret 两组参数,但程序本身要先能正常启动。
Windows 整合包获取路径(含推广码,直接拼在链接里):
https://xiake.yun/api/download/package/18?promoCode=IV4E9B04A80C苹果系统版本:
https://openclaw.ikidi.top/api/download/package/35?promoCode=IV4E9B04A80C下载后解压启动,确认主界面能打开、Gateway 服务处于运行状态。飞书侧需要你有一个能登录飞书开放平台的账号,并且具备可用的企业或团队空间来承载自建应用。个人飞书空间也能创建自建应用,发布版本时通常不需要管理员审核;企业空间提交版本后要等管理员通过,配置才会真正生效。这一点很关键,很多人卡在“明明填对了但没反应”,其实是版本还在待审核。
如果你后续想让机器人调用大模型能力做问答或代码辅助,可以提前在 TaoToken 官网了解模型接入方式,飞书只负责消息通道,模型能力由 OpenClaw 侧配置决定。
3. 飞书开放平台侧:从创建应用到拿到 App ID / App Secret
3.1 创建企业自建应用并添加机器人能力
打开飞书开放平台https://open.feishu.cn/app,右上角进入开发者后台,选择“创建企业自建应用”。填写应用名称、功能描述、图标,创建完成后进入应用详情页。左侧找到“添加应用能力”,在能力列表里选中“机器人”并添加。没有这一步,后面的事件订阅里不会出现消息接收相关事件。
3.2 事件订阅选长连接,添加 im.message.receive_v1
左侧切到“事件与回调”,在事件订阅区域点编辑,订阅方式选择“使用长连接接收事件”。不要选服务器回调模式,OpenClaw 本地部署没有公网地址,选错会导致事件推送失败。保存后点“添加事件”,搜索“接收”,勾选im.message.receive_v1(接收消息事件)。这个事件是机器人读取飞书消息的核心,缺了它机器人就是哑巴。添加时系统会弹权限推荐,直接确认开通,先把事件依赖的基础权限补齐。
3.3 权限批量导入与数据范围
如果只做收发消息,事件弹窗自带的权限基本够用。但如果你要让 OpenClaw 联动飞书文档、多维表格、云盘、知识库,建议直接批量导入完整权限。左侧进入“权限管理”,找到“批量导入 / 导出权限”,清空默认内容后粘贴下面这段 JSON:
{ "scopes": { "tenant": [ "aily:message:read", "aily:message:write", "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: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", "bitable:app", "bitable:app:readonly", "board:whiteboard:node:create", "board:whiteboard:node:delete", "board:whiteboard:node:read", "board:whiteboard:node:update", "cardkit:card:write", "contact:contact.base:readonly", "contact:user.base:readonly", "contact:user.employee_id:readonly", "contact:user.employee_number:read", "contact:user.id:readonly", "docs:doc", "docs:doc:readonly", "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", "docs:permission.member:auth", "docs:permission.member:create", "docs:permission.member:delete", "docs:permission.member:readonly", "docs:permission.member:retrieve", "docs:permission.member:transfer", "docs:permission.member:update", "docs:permission.setting", "docs:permission.setting:read", "docs:permission.setting:readonly", "docs:permission.setting:write_only", "docx:document", "docx:document.block:convert", "docx:document:create", "docx:document:readonly", "drive:drive", "drive:drive.metadata:readonly", "drive:drive.search:readonly", "drive:drive:readonly", "drive:drive:version", "drive:drive:version:readonly", "drive:export:readonly", "drive:file", "drive:file.like:readonly", "drive:file.meta.sec_label.read_only", "drive:file:download", "drive:file:readonly", "drive:file:upload", "drive:file:view_record:readonly", "event:ip_list", "im:app_feed_card:write", "im:chat", "im:chat.members:read", "im:chat:read", "im:message", "im:message.group_msg", "im:message:send_as_bot", "im:message:readonly", "im:message:update", "sheets:spreadsheet", "sheets:spreadsheet:create", "sheets:spreadsheet:read", "space:folder:create", "wiki:node:create", "wiki:node:read", "wiki:node:update", "wiki:space:read" ], "user": [] } }点下一步确认新增,若弹出可访问数据范围,保持默认“与应用的可用范围一致”即可。权限不是越多越好,但这份清单覆盖了消息、文档、表格、云盘、知识库,后续扩展功能不用反复回来补。
3.4 发布版本并复制凭证
权限和事件配完后,进入“版本管理与发布”,创建版本,版本号写1.0.0或1.0.1,移动端和桌面端能力都选机器人,更新说明标注事件与权限变更,保存后提交发布。个人空间直接生效,企业空间等管理员审核。发布完成后回到“凭证与基础信息”,复制 App ID 和 App Secret。注意 App Secret 只在特定位置展示,复制时不要带前后空格,也不要用旧版本遗留的密钥。
4. OpenClaw 侧配置:config.toml 骨架与凭证回填
OpenClaw 的飞书渠道配置可以走图形界面,也可以直接改配置文件。图形界面路径是右上角设置 → 聊天配置 → Feishu/Lark 卡片,粘贴 App ID、App Secret,打开启用开关,保存。如果你习惯用配置文件管理,下面是一个可复制的config.toml骨架,字段名按 OpenClaw 渠道配置逻辑组织:
[gateway] host = "127.0.0.1" port = 18789 [channels.feishu] enabled = true app_id = "cli_xxxxxxxxxxxxxxxx" app_secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" event_mode = "websocket" receive_event = "im.message.receive_v1"几个参数说明:event_mode必须是websocket,对应飞书后台的长连接模式;receive_event保持im.message.receive_v1;app_id以cli_开头,app_secret是一串较长的字符。改完配置文件后重启 Gateway 服务,让配置重新加载。如果你在图形界面填过,再改配置文件时注意两边不要冲突,以最后一次保存的为准。
注意:App Secret 属于敏感凭证,不要提交到公开仓库,也不要在截图里完整暴露。团队协作时建议用环境变量注入,而不是硬编码在配置文件里。
5. 连通性验证:确认机器人真的能收消息
配置保存后不要急着在群里 @ 机器人,先做两步验证。第一步,看 OpenClaw 的 Gateway 日志,飞书渠道启用并连接成功后,日志里会出现 WebSocket 连接建立、事件订阅相关的记录。如果日志里反复出现重连或鉴权失败,说明凭证或事件模式有问题。
第二步,在飞书里找到这个自建应用机器人,发一条私聊消息,比如“ping”。正常情况下 OpenClaw 会收到im.message.receive_v1事件并触发处理逻辑。如果你在 OpenClaw 里配置了模型回复,机器人会回消息;如果只做事件接收,日志里能看到消息体。验证时重点看三件事:事件是否到达、消息内容是否完整、机器人是否有发送权限(im:message:send_as_bot)。
如果你想让机器人具备模型对话能力,可以在 OpenClaw 里接入 TaoToken 的模型对话能力,飞书负责把用户消息送进来,模型负责生成回复,再通过机器人发回飞书。这样一套下来,飞书就是入口,OpenClaw 是调度层,模型是能力层。
6. 本篇常见错排查:凭证填了但机器人没反应
现象一:App ID、App Secret 填完保存,飞书发消息机器人完全没响应。按顺序核对:飞书应用版本是否已发布生效(企业空间看管理员是否审核通过);事件订阅是否为im.message.receive_v1;事件接收模式是否为长连接;OpenClaw 保存配置后是否重启了 Gateway;复制凭证时是否带了空格或用了旧密钥。这五项里任何一项不对,都会表现为“静默无响应”。
现象二:日志报鉴权失败或 tenant_access_token 获取失败。大概率是 App Secret 复制错误,或者应用被停用、密钥被重置过。回飞书“凭证与基础信息”重新复制一次,注意不要复制到隐藏字符。
现象三:机器人能收到私聊但收不到群消息。检查是否开通了im:message.group_msg和im:chat相关权限,群消息需要额外权限,且机器人要被拉进群。
现象四:教程没让填公网回调地址,是不是漏了。没漏。OpenClaw 飞书渠道走长连接,本地 WebSocket 直接和飞书通信,不需要公网服务器和回调域名,这也是它比服务器回调模式更适合本地部署的原因。
现象五:权限 JSON 导入后部分权限显示未开通。有些权限需要管理员审批或依赖应用发布状态,先完成版本发布再看。如果只是收发消息,事件弹窗自带权限就够,完整 JSON 是为了后续联动文档和表格。
7. 凭证配好之后:把飞书机器人接进你的工作流
App ID 和 App Secret 填完、渠道启用、消息能通,这只是第一步。接下来你可以让 OpenClaw 在收到飞书消息后做更多事:调用模型生成回复、读写多维表格、把文档内容拉进来做摘要。如果你需要长期跑编码类或 Agent 类任务,可以了解 TaoToken 的 Coding Plan,把模型调用额度固定下来,避免频繁换 Key。
接入过程中如果遇到鉴权或事件订阅报错,优先去 TaoToken 的接入文档对照参数,再检查飞书后台的事件与权限状态。凭证配置本身不复杂,复杂的是飞书侧事件、权限、版本三者必须同时到位。把这三块对齐,OpenClaw 的飞书渠道基本一次就能跑通。