OpenClaw+扣子+飞书:无代码搭建AI机器人全流程拆解
从上个月开始我们团队一直在折腾一个“能自动回消息、能查资料、还能顺手往群里丢表格”的飞书机器人。大多数同事听到这个需求的第一反应都是“那得写个后端服务吧”但说实话我不想为这点事情养一台常驻服务器更不想把时间全砸在鉴权、回调、事件签名这些重复劳动上。后来我把整个方案换成了扣子编程 OpenClaw 飞书机器人三件套全程没有手写业务代码就跑通了“群里发消息 → AI 理解意图 → 调取数据 → 回传文本甚至表格”的完整链路。这篇文章就是这次项目的拆解记录包括为什么选这套组合、Windows 下搭 OpenClaw 环境的坑、扣子侧的流程编排、飞书表格的发送方式以及本地推理和云端 API 的选型实测。如果你也在用无代码思路落地 AI 助理这篇应该能帮你少走不少弯路。1. 这套组合凭什么成立OpenClaw、扣子和飞书各自干哪摊活1.1 三个组件在链路里的分工先说清楚 OpenClaw 是什么。OpenClaw 是一个开源 AI 代理执行框架它本身不聊天也不直接面对用户而是负责把模型、消息渠道、工具调用粘合在一起。它能同时对接多个 IM 平台可以在收到消息后自己规划下一步动作查知识库、调接口、执行本地脚本、生成表格最后把结果发回对应的渠道。OpenClaw 对 Linux 环境依赖较重Windows 上一般通过 WSL2 跑起来。扣子编程则是另一层东西。它名义上叫“编程”实际操作全是可视化的建知识库、拖工作流节点、配插件、填人设 prompt最后把 Bot 一键发布到飞书。扣子解决的正是“不写代码也能编排对话逻辑”这件事。飞书机器人则是最外层的出入口用户在群聊里 它或者直接私聊它消息从飞书发出来经过扣子的编排再落到 OpenClaw 去执行。用一个厨房类比扣子是前厅的点餐面板把客人一句“来个套餐”拆解成“要哪几道菜、加不加辣、几号桌上”OpenClaw 是后厨真正负责炒菜、控制火候、处理食材飞书机器人就是传菜口。前厅可以随时改菜单后厨可以换菜系传菜口稳定地把菜端出去。1.2 为什么这种组合能做到“不写代码”答案很简单扣子把传统后端服务里最繁琐的那几层全包了。事件订阅、消息收发、URL 回调、签名校验、知识库检索、输出格式化这些如果走原生飞书开放平台至少要写一遍 Python 或 Node 服务还要处理 Challenge 验证、Token 管理、并发重试。扣子这边全是平台代管你只需要在界面上点“发布到飞书”填几个密钥参数剩下的链路它自己打通。OpenClaw 这边同样不需要写业务代码它吃的是配置文件模型供应商、渠道接入、技能列表、工具调用规则全部写在 YAML 或 JSON 里。真正需要动手的地方只有两块一块是环境安装另一块是 prompt 编写。所以标题里说的“不写代码”准确理解应该是“不手写服务端代码、不写业务逻辑代码”配置和提示词还是要做的。这套组合最适合的场景包括内部客服机器人、IM 助理、定时巡检报告推送不适合的反倒是那些涉及复杂审批流、强审计、严格合规的场景临时脚本跑起来很爽长期看还是要正规工程化。下表是三个组件在最终链路里的角色速览组件实际干的活需要写代码吗扣子编程对话流程编排、知识库、插件、飞书发布不写OpenClaw模型接入、工具调用、多通道 Agent 执行不写业务代码只改配置飞书机器人群聊入口、消息卡片、表格展示不写这个分工带来的最大好处是改机器人逻辑不用发版。今天想让机器人先查库存再回复只需要在扣子工作流里拖一个节点明天想让某个动作换成本地模型也只需要改 OpenClaw 的 provider 配置。对一个小团队来说这种灵活度非常重要。2. Windows 上把 OpenClaw 环境捣鼓明白WSL 报错排障全程2.1 为什么要 WSL以及最省事的搭法OpenClaw 的 Agent 动作经常要调 Linux 工具链比如 curl、jq、docker甚至是系统级的定时任务。在 Windows 上直接跑这些会有各种环境差异所以最稳的宿主就是 WSL2。这里的关键是“2”不是第一版WSL2 有完整的内核性能也接近原生 Linux。搭法并不复杂给你一份可以直接照着做的步骤以管理员身份打开 PowerShell执行Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux和Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform完成后重启系统。安装 WSL2 内核更新包然后在 PowerShell 里执行wsl --set-default-version 2确保默认版本是 2。运行wsl --status检查当前状态这一步很关键后面排错也要用到。在 WSL 终端里安装 Node.js LTS。OpenClaw 本体是基于 Node 实现的所以这一步绕不开。建议先装 nvm-windows再用nvm install 20指定版本比直接从官网下个安装包要灵活得多。按 OpenClaw 官方仓库的 README 执行安装命令。不同版本的安装方式略有差异但基本上就是一条命令加一个初始化向导向导会让你选择模型供应商、填写渠道密钥最后生成配置文件。第一次跑的时候可以在 WSL 里执行openclaw doctor如果版本带了的话来做环境自检它会列出缺哪些依赖、哪里的权限不对。这一步能帮你省掉很多“运行时才报错”的诡异问题。2.2 “无法安全验证”这个报错到底卡在哪最近网上有个高频问题就是 OpenClaw 启动时报“无法安全验证”之类的错误很多人以为是 OpenClaw 本身的问题其实绝大多数情况下是 WSL 环境没初始化好导致 OpenClaw 启动时去连接某个 Linux 内核服务失败了。我第一次遇到时也被带偏了浪费了半天去查配置文件。完整的排查链路应该是这样的打开管理员 PowerShell先跑wsl --status看输出。如果提示当前没有已安装的发行版或者内核状态异常那就继续往下走。执行wsl --update更新内核组件。如果系统提示需要重启重启之后再跑一次wsl --status确认。打开“启用或关闭 Windows 功能”确认“适用于 Linux 的 Windows 子系统”和“虚拟机平台”两个功能都勾上了。两者缺一不可缺任何一个都会导致 WSL 启动失败。执行wsl --set-default-version 2如果这里报错或者提示“需要更新”就说明内核包没装对。如果你的 Windows 版本比较老还需要单独去官方页面下载 x64 的内核更新包手动安装装完再重试。最后在 WSL 里跑一次wsl --shutdown然后重新打开终端再启动 OpenClaw 看是否正常。我整理了一张常见 WSL 报错对照表排查时可以对着看现象大概率原因处理方式wsl --status提示未安装或状态异常功能未完全开启或内核未更新重新开启功能、执行wsl --update启动 WSL 报版本错误默认版本是 WSL1执行wsl --set-default-version 2OpenClaw 启动时报“无法安全验证”WSL 内核或系统服务初始化失败按上面第 1 到第 5 步逐项检查Node 命令不存在没在 WSL 里装 Node先在 WSL 内安装 nvm-windows 和 Node LTS还有一个容易忽略的小细节如果你是在 PowerShell 里直接执行wsl -- status中间多了空格也会得到一个“命令不存在”的错误。正确的命令是wsl --status中间没有多余空格。这种低级错误排查起来特别烦因为一眼看去命令长得差不多但就是跑不通。2.3 Windows Companion 和 Node 版本的小提醒OpenClaw 在 Windows 场景下有一个 Companion 组件它主要是用来让 WSL 里的 OpenClaw 能调用 Windows 本机的资源比如浏览器、文件系统、某些 Windows 专属工具。配置方式不复杂基本上就是下载 Windows 端程序、设置一个本地端口、然后在 OpenClaw 配置里填上对应地址。如果你是纯跑飞书机器人不涉及调用 Windows 本地软件这个组件可以先不强上省得引入额外变量。Node 版本则建议固定在 LTS 那一档。OpenClaw 依赖的不少 npm 包会比较挑 Node 版本太老或者太新的都会出现兼容问题。用 nvm 管理是正经做法切换版本就两条命令nvm install 20、nvm use 20。别贪图省事直接下载一个最新版一路下一步后面被版本兼容问题折磨的时候会后悔当初没花这五分钟。3. 扣子编程这边从人设到工作流到飞书发布一个代码都不碰3.1 创建 Bot 与“人设 Prompt”的写法环境跑通之后紧接着就要去扣子平台建 Bot。登录后选择“扣子编程”模式很多人一上来就急着填功能反而忽略了人设 prompt。我的经验是人设 prompt 决定了机器人后面所有的行为边界写好了工作流可以省一大半。给你一份我这边在用的模板你是公司内部助理 Agent负责解答行政、HR、IT 类问题。回答前先检索知识库知识库里找不到答案时再调用 OpenClaw 的动作查询接口。输出控制在 200 字以内涉及多步骤操作的使用带编号的短列表。遇到不确认的信息时明确说“我不确定正在查询”不要编造。这份 prompt 看起来简单但它把四个关键信息都定死了角色、优先级、输出格式、失败时的态度。扣子的底层沿用了大语言模型prompt 写不清楚后面工作流再精致也白搭。同时把开场白和几个快捷指令配置好。开场白是用户私聊机器人的第一眼内容快捷指令则适合放高频问题比如“查报销流程”“看今天的巡检报告”。这些配置都是可交互表单不需要写代码却直接影响飞书里实际对话的体验。3.2 工作流编排拖节点把“意图识别→调用→回传”串起来扣子编程的核心操盘点在工作流页面。它的逻辑和我以前用 Zapier 这类工具很像开始节点 → 大模型节点 → 分支条件 → 动作节点 → 结束节点全部靠拖拽连接。我们要做的就是用一个工作流把“收到消息 → 判断意图 → 调用 OpenClaw → 返回结果”串起来。实际节点这样搭开始节点接收飞书消息作为输入把content字段和user_id字段透传下去。接着接一个大模型节点让它判断这条消息是“咨询类”“查询类”还是“闲聊类”输出一个 JSON 结构比如{intent: inquiry}。然后按意图走条件分支咨询类直接在知识库里检索检索结果格式化后返回查询类则进入一个 HTTP 请求插件节点调用 OpenClaw 暴露出来的 webhook 接口。HTTP 请求节点是扣子和 OpenClaw 连接的关键它的配置只需要填三样请求地址、请求方法、Payload 模板。我这边用的 Payload 大致长这样{ action: query, text: 帮我查一下昨天巡检报告, user_id: ou_xxx, channel: feishu }字段设计得越简单越稳。OpenClaw 侧只需要按约定返回一个统一的 JSON比如{ status: ok, content: 巡检结果服务A正常服务B延迟偏高。 }然后扣子的格式化节点把content字段转成飞书友好的文本最后通过结束节点回传。全程没有写代码但链路已经完整闭环了。重点在于请求和响应的字段契约一定要固定下来任何一方想加字段先改契约文档再改配置否则后面联调时会遇到一堆让人摸不着头脑的“假死”问题。3.3 发布到飞书绕开那些最繁琐的原生配置工作流跑通之后在扣子平台右侧的发布入口选择“飞书”按提示填入飞书开放平台创建的应用凭证App ID、App Secret、Encrypt Key 这些。填完之后扣子会自动帮你完成事件订阅、URL 回调、签名校验等繁琐环节。这一点是我觉得这套组合里最赚的地方。如果走飞书开放平台原生对接你需要自己搭一个公网可达的后端服务配置事件订阅回调地址处理 URL 验证时的 Challenge 请求签名校验失败还要排查时间戳偏差、Token 不一致等问题。扣子直接把这一层全部包了我只填了几个参数点了发布飞书群里立刻就能 到机器人。两种方式的差异很直观对比维度扣子一键发布原生飞书开放平台代码量零代码填密钥即可需要搭建回调服务、处理签名调试成本平台自动处理大部分链路每一步都可能报错要逐步排查灵活性受平台编排能力限制完全可控可接任意自定义逻辑适合人群无代码/低代码场景有后端开发资源的场景如果你的需求只是“把 AI 能力放进飞书里”扣子这条路的性价比非常高。但如果未来要深度定制消息卡片样式、做复杂权限控制还是得上原生平台。4. 让机器人把表格叠进飞书群多维表格和消息卡片的配置思路4.1 先选形态文件表格 vs 展示卡片飞书机器人发表格很多教程没有先讲清楚“发什么形态的表格”导致配置一做就乱。通常有两种常见形态。第一种是真正的文件比如.xlsx附件适合需要下载存档的报表、对账数据、完整清单第二种是消息卡片适合在群里直接瞄一眼的榜单、巡检状态、周报摘要。前者要走飞书上传文件的接口后者只需要按飞书消息卡片的 JSON 格式拼一段内容。我的建议是小数据量、高频查看的场景用卡片数据量大、要二次处理的场景用文件。无代码方案里卡片形态明显更容易实现因为它不需要处理文件流只需要拼 JSON。4.2 卡片式表格用 interactive 消息搭一个轻量“表格视图”很多群里的业务场景根本不需要真的 Excel 文件只需要把结构化数据以清晰的方式展示出来。飞书消息卡片里的interactive类型就能做到。下面是我在 OpenClaw 配置文件里实际用过的一个简化模板{ msg_type: interactive, card: { header: { title: { tag: plain_text, content: 服务巡检日报 } }, elements: [ { tag: div, text: { tag: lark_md, content: **服务A**正常\n**服务B**延迟偏高\n**服务C**异常重启中\n\n生成时间2025-01-12 09:00 } } ] } }header是卡片头部elements里可以放多个模块lark_md标签支持简单的文字排版。在飞书群里展示出来的视觉效果就是一张带标题、带要点的卡片几乎可以当作“轻量表格”来用。如果你想要更接近表格的样式也可以把content里的内容替换成多行字段名值照样清晰。如果真的要操作“飞书多维表格”里的数据那就要换一条路径在飞书开放后台创建一张多维表格然后让 OpenClaw 通过 HTTP 请求插件去调用多维表格的开放接口按行写入数据。扣子侧的工作流里加一个 HTTP 节点把要写入的行数据 POST 过去即可。这里主要还是权限和 App ID 配置账密不对的话调用会直接 403。4.3 一次实测每日巡检机器人自动把状态表发进群拿我这边跑通的一个真实场景举例每天早上 9 点OpenClaw 里挂一个定时任务去拉取各服务的健康检查结果生成上面那种卡片 JSON再通过飞书机器人推送到运维群。配置环节分三段。第一段是定时触发在 OpenClaw 的配置里加一个 cron 表达式每天 9 点触发动作。第二段是动作逻辑让 OpenClaw 用预置的 tool 去请求各服务健康接口把返回状态整理成一段文本。第三段是消息发送匹配到飞书渠道的message_card类型把 JSON 发出去。扣子这一侧根本不用做定时OpenClaw 直接自己发就可以了。这也是当初选择这套组合的原因之一扣子适合做需要“理解意图”的交互式对话OpenClaw 适合做需要“主动触发、定时执行”的自动化任务。两者互补得很好。如果你遇到的是“机器人收到指令后生成表格并回复”那就把定时触发改成“收到消息关键词时触发”操作路径是一样的只是入口不同。5. 接入本地推理还是云端 APIOpenClaw 算力选型实测5.1 一个常见误解OpenClaw 是不是只能用 API网上有个高频问题OpenClaw 是不是只能通过 API 的方式用算力答案是否定的。OpenClaw 走的是模型供应商抽象层支持 OpenAI 兼容接口也支持本地推理服务比如 Ollama。想本地跑起来只需要三步装 Ollama、拉一个合适的模型、在 OpenClaw 配置里把 provider 指到本地地址。Ollama 的安装和模型下载本身不复杂两条命令就走完ollama pull qwen2.5:7b ollama serve然后把 OpenClaw 的配置指向http://localhost:11434/v1模型名填qwen2.5:7b。需要注意OpenClaw 大多按 OpenAI 兼容协议来通信Ollama 默认就开放了这套兼容层所以可以直接对接不需要额外转换服务。我自己在配置里同时开了两套 provider一套指向本地 Ollama一套指向云端的 OpenAI 兼容 API。OpenClaw 的健康检查、简单分类、定时任务走本地需要长文生成、复杂推理的场景切到云端。这样做既控制了成本又保住了复杂任务的质量。5.2 本地 vs API 的实测对比实际跑了一两周之后我对两边的表现有个很直观的判断对比维度本地 Ollama7B 模型云端 API数据隐私数据只在内网流转数据会出网交给服务商处理成本结构固定硬件成本 电费按 token 计费量大会有账单压力首字延迟看显卡性能本地越快越爽受网络往返影响复杂指令能力简单任务够用复杂推理容易偷懒综合能力更强长文表现稳部署难度需要多维护一个本地服务填一个 API Key 即可一个很典型的例子让机器人从一大段巡检日志里提取“哪些服务挂了、挂了多久”本地 7B 模型能做得不错关键在于任务边界清晰输出格式固定。但如果让它读一遍上月的工作周报然后生成一份有观点、有结构的总结本地小模型就会开始偷懒遇到这种情况我还是老老实实切回云端 API。所以我的选型结论是高频、固定格式、低风险的任务全部走本地把成本压下来低频、高质量要求、需要创造力的任务走 API把体验提上去。5.3 模型的本地部署规模怎么选本地跑模型还有一个硬件适配问题。我个人经验是 7B 到 14B 这个范围比较适合普通工作站比如 16G 显存能跑得很流畅32G 内存加量化也能凑合。70B 级别本地跑就不太现实除非你有数据中心级别的硬件。Ollama 里常见的做法是拉量化版本也就是文件名带q4或q8的标签量化会牺牲一点精度但对大多数结构化任务来说完全够用。如果你是想在一台老的笔记上跑建议先别上大模型优先保证 OpenClaw 环境本身稳定模型临时先用云端 API 凑合等硬件到位再切换本地 provider。循序渐进比一步到位稳妥得多。6. 联调时最容易翻车的三个点以及我的处理习惯6.1 回调地址和 Challenge 校验联调阶段的第一个坑基本都出在 Webhook 上。扣子把消息转发给 OpenClaw 的接口时如果通过飞书开放平台直接配回调经常会在“URL 验证”这一步死掉。飞书验证回调的机制是平台向你配置的回调地址发送一个 GET 请求附带一个 Challenge 参数你的服务需要原样把它返回去才算验证通过。如果回调地址公网不可达、路径带中文、SSL 证书有问题Challenge 就过不了。在扣子托管方案里这个问题不明显因为扣子自己处理了回调链路但一旦你想跳开扣子让 OpenClaw 直接接飞书事件订阅就会撞上。我的建议是先确认 Webhook 地址具备公网可达能力路径只保留简单字母和数字再确认证书正常。如果团队没有方便的公网入口那就让扣子继续充当消息入口OpenClaw 只做旁路动作执行器不要去碰飞书原生回调这样可以绕开一整类问题。6.2 字段契约不一致导致的“假死”还有一个特别隐蔽的问题是扣子传过去的字段和 OpenClaw 读出来的字段差一个名字日志里看不出报错但流程就是原地卡住。比如 OpenClaw 这边读的是content扣子那边传的是text两个字段都对就是名字对不上结果就是机器人收到消息后毫无反应。处理这个问题的核心方法是固化契约。请求和响应各固定一个极简 JSON 结构任何一方要改字段先改契约文档再改配置。我这边实际定的契约是// 请求扣子 - OpenClaw { action: query, text: ..., user_id: ... } // 响应OpenClaw - 扣子 { status: ok, content: ... }只有两个字段做核心数据通道其他都算附加信息。这样契约足够稳排错也容易。如果有一天要加“表格”功能就新增一个message_type字段但不要动text和content这两个老字段避免影响已经跑通的链路。6.3 群聊触发和消息死循环另一个“群消息爆炸”的坑也同样典型机器人自己发出来的消息又触发了自己或者两个机器人互相 形成 A 回 B、B 回 A 的循环群里消息量瞬间爆掉。飞书机器人的消息回调里默认会包含发送者信息但如果不加过滤机器人之间也会互相当作“用户”来回复。处理办法很简单在扣子工作流的入口加一个判断节点当发送者类型是bot时直接结束流程在 OpenClaw 的动作配置里同样按sender_type过滤一遍。双保险比单保险稳因为有可能扣子已经判断完了但 OpenClaw 主动发起的回调又触发了一遍。我踩过一次后把两边的过滤都加上了之后再没出过循环。6.4 我的联调习惯最后分享几个我自己留下的联调习惯。第一步先在飞书建一个只有我和机器人两个人的小群不要一上来就丢大群测试。第二步用 curl 手工向 OpenClaw 发一条 Payload先确认 openclaw 接口本身没问题再接扣子那一侧绑定参数。第三步把 OpenClaw 的日志级别切到 DEBUG每次只改一个变量确认生效后再动第二个。这套习惯帮我省下的排错时间相当可观。尤其是字段类问题一次只改一个字段出问题立刻能定位到是哪边配置不对如果一次改三四个配置再去测试报错时根本不知道怪谁。说实话这套组合的搭建难度并不高真正磨人的是细节。先把环境跑通再加功能你会少很多的烦恼。