写这篇教程之前,我先说一个背景:我在 Windows 11 上把 OpenClaw(也就是 Clawdbot)以 WSL 2 为运行底座完整部署了一遍,然后把它接到了飞书机器人上,实现了群里直接对话、查多维表格、让它执行常规运维命令。整个过程踩了不少坑,从 wsl --install 太慢、wsl --update 无法启动服务、openclaw 无法识别为 cmdlet,到飞书事件订阅回调验签各种问题,都遇到过。这篇教程就是把这条完整路径重新走一遍,把安装、配置、接飞书、排错的全过程写清楚。适合想在 Windows 上部署 OpenClaw 并用飞书做前端入口的开发者,也适合被 WSL 折腾过但还没彻底搞定的人。
1. 整体思路与环境选型
1.1 OpenClaw 是什么,为什么需要一套 Windows 部署方案
OpenClaw 是一个可以承载 AI 智能体运行和工具调用的本地服务框架。它的核心价值在于把大模型的能力暴露成一组可调用的接口,让外部应用(飞书、Web H5、命令行等)通过标准协议和它交互。你可以把它理解成一个“AI 代理网关”:机器人、定时任务、自动化脚本、多维表格操作,都可以挂在它上面,由它统一调度模型和工具。
我选择把 OpenClaw 跑在 WSL 2 里,而不是 Windows 原生环境,原因有几个。第一,OpenClaw 依赖的很多底层组件在 Linux 环境下的兼容性远好于 Windows,尤其是涉及文件权限、进程管理和 Python/Node 原生模块时;第二,WSL 2 是一个完整的轻量虚拟机,和宿主机共享网络,但环境隔离干净,不会污染 Windows 系统;第三,后面如果要接 NVIDIA NIM 这类本地模型服务,WSL 2 对 CUDA 的支持也比原生 Windows 更顺滑。
整套方案的结构可以这样理解:Windows 11 作为宿主机,WSL 2 里跑 Ubuntu 发行版,OpenClaw 以服务方式运行在 Ubuntu 内,飞书开放平台通过事件订阅把用户消息推送给 OpenClaw,OpenClaw 处理后再通过飞书 API 把回复传回群里。对外暴露的入口只有一个飞书机器人,用户感知不到底层是 WSL 还是云服务器。
1.2 部署方式对比与最终选型
我在调研阶段对比了三种常见的 OpenClaw 部署方式:原生 Windows 直接装、便携包手动解压、WSL 2 内安装。对比结果如下:
| 部署方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| Windows 原生安装 | 操作简单,路径直观 | 依赖兼容性差,服务化麻烦,Powershell 下偶发命令不识别 | 快速体验,不打算长期跑 |
| 便携包解压 | 免安装,可指定目录 | 升级困难,环境变量要手配 | 内网离线环境、临时测试 |
| WSL 2 + Ubuntu | 兼容性最好,服务稳定,CUDA 友好 | 初次安装耗时,磁盘占用偏大 | 长期使用、生产级别接入 |
最终我选了 WSL 2 + Ubuntu 22.04 的方案。这个方案虽然前期准备工作多一些,但后续接入飞书、配置技能(skills)、安装依赖包都会顺畅很多。如果你的 Windows 版本是 Win11 或者较新的 Win10,默认的 wsl --install 流程已经足够傻瓜化,剩下的大头其实是网络问题和配置细节。
1.3 部署前的环境检查清单
在动手之前,建议先花五分钟确认环境,免得装到一半才发现基础版本不对:
- 操作系统版本:Windows 11(Build 22000 以上)或 Windows 10 21H2 以上。
- 已开启 BIOS 虚拟化(VT-x/AMD-V),可以在任务管理器-性能-CPU 里确认。
- PowerShell 以管理员身份运行,且执行策略允许脚本执行。
- C 盘预留至少 20GB 空间,如果紧张,后面会把发行版迁移到 D 盘。
- 确认网络环境中可以正常访问下载源(内核包、Ubuntu 镜像等),这一步关系到
wsl --install是否卡住。
把这些确认完,基本上就可以进入安装了。如果你之前已经装过 WSL 1,需要先升级到 WSL 2,因为 OpenClaw 的很多文件监控和端口转发能力依赖 WSL 2 的完整内核。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. WSL 2 环境安装与踩坑全记录
2.1 5 分钟快速安装 WSL 2 的正确姿势
在 Win11 上,安装 WSL 2 最直接的方式是管理员身份打开 PowerShell,执行:
powershell复制wsl --install
这个命令会默认开启 Microsoft-Windows-Subsystem-Linux 和 VirtualMachinePlatform 两个 Windows 功能,下载并安装 WSL 2 内核,然后把默认发行版设置为 Ubuntu。装完重启一次,就会进入 Ubuntu 初始化界面,让你设置用户名和密码。
但实际执行中,wsl --install 卡在“正在下载”或者直接提示 403 的情况非常常见。我遇到的报错是“wsl --install 已禁止403”,根源是 Windows Update 下载通道在某些网络环境下被阻断。如果你也遇到这种情况,不要反复重试,改用下面的手动方案:
- 下载 WSL 2 内核更新包(文件名类似
wsl_update_x64.msi),本地安装。 - 安装完成后,管理员 PowerShell 执行:
powershell复制dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
- 重启后执行:
powershell复制wsl --set-default-version 2
- 手动下载 Ubuntu 22.04 的 appx 安装包,放到 D 盘后右键安装。这样可以明显提速,也不会再受网络 403 影响。
2.2 wsl --update 无法启动服务的处理
有段时间我用 wsl --update 升级内核,系统提示“无法启动服务,原因可能是已被禁用或与其相关联的设备没有启动”。这个问题的本质是 WSL 相关的 Windows 服务没有处于运行状态。
处理步骤是:
- 打开服务管理器(
Win + R,输入services.msc)。 - 找到
LxssManager服务(也可能叫“适用于 Linux 的 Windows 子系统”服务),右键-启动,并把启动类型改为“自动”。 - 如果服务列表里没有这个服务,说明 Windows 功能没有启用成功,回到上面的 dism 命令重新启用功能。
- 最后在 PowerShell 里执行
wsl --update验证是否恢复。
还有一个容易忽略的点:如果你装过旧版 WSL 1,老的发行版配置可能会干扰内核更新。建议先把所有发行版导出备份后,wsl --unregister 注销掉旧发行版,再做更新。
2.3 默认系统盘空间不够怎么办:WSL 目录迁移实践
WSL 2 的虚拟磁盘文件默认放在 C:\Users\<用户名>\AppData\Local\Packages\... 里,用久了会膨胀到十几 GB。如果你 C 盘空间紧张,最稳妥的做法是迁移到 D 盘。
迁移过程不复杂,但一定要按顺序操作:
powershell复制wsl --shutdown
wsl --export Ubuntu-22.04 D:\wsl-backup\ubuntu-22.04.tar
wsl --unregister Ubuntu-22.04
wsl --import Ubuntu-22.04 D:\WSL\Ubuntu-22.04 D:\wsl-backup\ubuntu-22.04.tar
注意:unregister 会删除原有发行版的所有文件,所以 export 那一步必须确认导出文件完整,建议看下 tar 文件大小是否合理(Ubuntu 22.04 基础系统导出后一般在 1-2 GB 左右,如果是几百 MB 就要警惕)。迁移完成后,原默认用户会变成 root,用 wsl -d Ubuntu-22.04 进入后修改一下 wsl.conf 里的 [user] default=你的用户名 即可。
2.4 WSL 内基础运行环境配置
OpenClaw 对运行时的要求主要是 Node.js 和 Python。我在 Ubuntu 里装了 Node.js 20 LTS 和 Python 3.10,中间还碰到了一个必须装的工具 binwalk(用于固件类任务,如果你的技能里用不到可以跳过)。
Node.js 安装命令:
bash复制curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt-get install -y nodejs
Python 环境:
bash复制sudo apt update
sudo apt install -y python3 python3-pip python3-venv
因为后面 OpenClaw 和飞书的交互脚本会用到不少 Python 包,建议建一个虚拟环境,不要直接往系统 Python 里塞东西。
如果你要配置 NVIDIA NIM 或者本地模型推理,WSL 2 里还要装 CUDA Toolkit。在 WSL 2 里装 CUDA 跟在物理 Linux 上有点区别:不需要 NVIDIA Linux 驱动,用 Windows 侧驱动即可,直接装 CUDA Toolkit 就行。装完后用 nvidia-smi 验证是否能识别 GPU。
3. OpenClaw 安装配置全流程
3.1 三种安装方式与适用场景
OpenClaw 的安装方式主要有三种,我试下来各有侧重:
第一种是官方脚本一键安装。这是最省事的方式,在 Ubuntu 终端执行:
bash复制curl -fsSL https://openclaw.ai/install.sh | bash
脚本会自动把 OpenClaw 安装到用户目录,并把相关命令写入 PATH。适合大多数使用者,省心。
第二种是 PowerShell 安装。在 Windows 侧执行:
powershell复制iwr -useb https://openclaw.ai/install.ps1 -OutFile install-openclaw.ps1
./install-openclaw.ps1
注意一个细节:这个安装方式默认装到 C:\Users\Administrator\.openclaw,如果你不想默认路径,可以在执行脚本时加上目录参数,比如:
powershell复制./install-openclaw.ps1 -Dir D:\openclaw
我是强烈建议指定一个非系统盘目录的,因为后续 workspace 和技能文件都会放在 .openclaw 目录下,C 盘容易爆。
第三种是便携包手动解压。这种方式适合在内网环境或者网络受限环境,下载便携包后直接解压到一个目录,手动把该目录的 bin 路径加入环境变量即可。不过便携包通常不带自动更新,后续升级就得手工替换文件。
3.2 安装后必须先搞清楚:配置文件与目录结构
OpenClaw 装好后,会在用户目录下生成一个 .openclaw 文件夹。整个目录结构大致如下:
code复制~/.openclaw/
└── workspace/ # 工作区,智能体读写文件都在这
└── exec-approvals.json # 命令执行审批白名单
└── skills/ # 技能目录,每个技能一个文件夹
└── openclaw.json # 主配置文件(也可能叫 config.json,看版本)
└── logs/ # 运行日志
讲一下 exec-approvals.json,这个文件是 OpenClaw 的安全机制。默认情况下,OpenClaw 不允许智能体直接执行任意系统命令,你必须先把允许的命令加入审批列表,其他命令会提示“legacy exec approvals exist at /root/.openclaw/exec-approvals.json. run openclaw exec-approval”。我一开始看到这个提示以为报错了,其实是提示我去配置审批。解决方法是运行 openclaw exec-approval 命令,把常用命令(比如 ls、cat、git、sqlite3 等)加进去。千万别一时图省事直接全放行,安全级别太低。
3.3 启动服务与技能(Skill)管理
OpenClaw 的启动命令,不同版本略有不同。我用的版本是 openclaw serve 加上 --port 参数指定监听端口:
bash复制openclaw serve --port 8080
启动后,服务会监听在本机 8080 端口,支持 MCP 协议。此时可以用 MCP 客户端连接测试,也可以继续配置飞书接入。
技能(Skill)是 OpenClaw 的扩展能力核心。你可以安装官方技能库里的技能,也可以自己写。安装技能的命令:
bash复制openclaw skill install <skill-name>
我实际装了飞书机器人和多维表格相关技能。这里建议按需安装,不要一次装太多,因为技能之间可能有依赖冲突,排错的时候会非常痛苦。
4. 飞书机器人接入:从零到群可用
飞书接入是整套方案里最“有成就感”的部分,但也是坑最多的地方。我把它拆成了四步:创建应用、配置权限、对接回调、发消息验证。
4.1 在飞书开放平台创建机器人应用
打开飞书开放平台,进入开发者后台,点击创建企业自建应用。填好应用名称和描述之后,在“添加应用能力”里启用机器人,这个操作会给应用生成一个机器人,之后你在飞书群里 @它 就能交互。
创建后,一定要去“凭证与基础信息”页面拿到三个关键值:App ID、App Secret、Verification Token。这三个值是后面所有 API 调用的凭据,App Secret 尤其敏感,泄露了别人就能冒充你的应用。
接下来要配置权限。在“权限管理”里搜索并开通以下权限:
im:message或im:message:send_as_bot:允许机器人发送消息。im:message.p2p_msg或im:message.group_msg:接收单聊和群聊消息。bitable:app:读写多维表格。contact:user.base:readonly:读取用户基本信息(按需开启)。
权限开通后需要发布版本并等待管理员审核通过,审核通过前权限是不生效的。这一步容易被忽略,我一开始配好了回调却收不到消息,最后发现是版本没发布。
4.2 事件订阅回调:让飞书消息进入 OpenClaw
要让飞书把用户 @机器人的消息推给 OpenClaw,需要在飞书开放平台的应用里配置事件订阅。进入“事件与回调”页面,在“订阅方式”里选“将事件发送至开发者服务器”,然后填写请求地址,也就是 OpenClaw 对外可访问的回调 URL。
因为我是本地调试,没有公网域名,这里我用内网穿透的方式把 WSL 里的端口映射到公网临时地址,再填到飞书回调里。这个临时地址会变,正式环境建议部署到云服务器或配置固定域名。
加密策略我选了“使用加解密 Key”,这样飞书在推送事件时会对请求体做 AES 加密,回调服务必须先验签和解密才能拿到真实数据。验签逻辑稍后会在代码里体现。
事件订阅需要添加的事件类型是 im.message.receive_v1(接收消息)。保存后飞书会发送一个 URL 验证请求,回调服务必须正确响应 challenge 才能通过验证。这里有一个容易踩坑的点:如果你开了加密 Key,challenge 也是加密的,必须先解密再返回,不能直接 echo 原文。
4.3 回调服务实现:验证、解密、分发
OpenClaw 本身可以挂载回调处理逻辑,但更灵活的做法是写一个轻量回调服务,收到飞书事件后转发给 OpenClaw。我用 FastAPI 写了一个最小实现:
python复制from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse
import json
app = FastAPI()
@app.post("/openclaw/feishu/webhook")
async def feishu_webhook(request: Request):
body = await request.json()
# 1. 校验请求头里的 Timestamp 和 Nonce,防止重放攻击
# 2. 用 Verification Token 做签名校验
# 3. 如果配置了 Encrypt Key,对 body["encrypt"] 做 AES 解密
# 4. 如果 body 里有 challenge 字段,解密后原样返回
# 5. 否则解析 event,提取 message content 和 chat_id,转发给 OpenClaw 的 MCP 接口
return JSONResponse({"code": 0})
解密逻辑的细节需要参考飞书开放平台的加解密方案,核心参数是 Encrypt Key,用 AES-256-CBC 模式,密钥做 MD5 后取前 32 字节。如果你不想手写,飞书也提供了多语言 SDK,Python 直接用 lark_oapi 的 EventDispatcherHandler 会更省事。
我实际用下来发现,验签和解密这两步千万别省。不验签,任何人都可以伪造请求打进你的回调服务;不加密,消息内容在网络传输中可能是明文。虽然开箱功能能跑通,但既然飞书给了安全选项,就都配上。
4.4 让 OpenClaw 把消息发回飞书群
回调服务收到飞书消息后,把内容交给 OpenClaw 处理,处理结果需要调用飞书 API 发送到群里。飞书发送机器人消息的接口是 im/v1/messages,用 POST 请求,关键参数是 receive_id_type 和 receive_id,在群聊场景里 receive_id_type 用 chat_id。
我在 OpenClaw 里写了一个飞书发送技能,本质上就是封装这个 API:
bash复制curl -X POST "https://open.feishu.cn/open-apis/im/v1/messages?receive_id_type=chat_id" \
-H "Authorization: Bearer <tenant_access_token>" \
-H "Content-Type: application/json" \
-d '{
"receive_id": "oc_xxxxx",
"msg_type": "text",
"content": "{\"text\":\"hello from openclaw\"}"
}'
注意 tenant_access_token 是通过 App ID 和 App Secret 调用 auth/v3/tenant_access_token/internal 获取的,有效期内可以缓存复用,不用每次请求都拿一次。
发送成功的前提有两个:一是机器人和目标群在同一个租户下,二是机器人有群聊权限且发送消息权限已通过版本审核。我遇到过能收到用户消息但发不出去的情况,仔细排查后发现是权限配置里只勾了接收消息,没勾发送消息。
4.5 进阶:飞书网页应用免登录与 Vue H5 集成思路
热词里有很多人搜“vue 飞书h5免登录授权”,这里顺带说下思路。飞书网页应用免登录的内核是 OAuth 2.0 授权码模式:前端跳转到飞书授权页,用户同意后飞书重定向回你的 H5 地址并带上 code 参数;后端拿到 code 再用 App Secret 换取 user_access_token,后续调用飞书开放接口都带着这个 token。
这种免登能力非常适合用来做企业内部工具站:用户在飞书里点开应用卡片,第一次自动拉起授权,之后再用飞书身份直接访问后端接口,不需要额外注册账号。OpenClaw 可以作为这个流程的后端服务承载者,把飞书 H5 的登录态和智能体能力打通。
不过要提醒一点:网页应用的免登流程对回调域名有严格的校验,本地联调时需要在开放平台配置本地地址或者用内网穿透,否则会一直提示域名不匹配。
5. 常见问题与排查技巧实录
5.1 高频问题速查表
这里整理一下我在安装和接入过程中遇到的高频问题,以及排查思路:
| 报错/现象 | 原因分析 | 解决方案 |
|---|---|---|
openclaw : 无法将“openclaw”项识别为 cmdlet |
安装目录未加入 PATH,或安装未成功 | 检查安装目录,手动将 bin 目录加入系统 PATH;PowerShell 里用绝对路径验证 |
wsl --install 卡住或 403 |
Windows Update 下载受限 | 改用手动内核包 + dism 启用功能 + 手动安装 Ubuntu 包 |
wsl --update 无法启动服务 |
LxssManager 服务未启动或 Windows 功能未启用 | services.msc 启动服务;dism 重新启用两个功能 |
an error occurred while running a wsl command |
当前发行版状态异常,或默认版本不是 2 | wsl -l -v 查看状态;wsl --set-default-version 2;必要时注销重建 |
legacy exec approvals exist at /root/.openclaw/exec-approvals.json |
未配置命令执行白名单 | 运行 openclaw exec-approval 添加白名单命令 |
| 飞书能收到消息但发不出来 | 发送权限未开通或版本未发布 | 检查权限管理是否包含 im:message:send_as_bot,发布新版本 |
| 飞书 URL 验证不通过 | Encrypt Key 解密逻辑有误 | 确认 AES-256-CBC 解密的 key 和 IV 生成规则与飞书 SDK 一致 |
| 回调偶尔收不到消息 | 没有配置长连接或回调地址公网不可达 | 使用内网穿透固定地址;确认服务器响应码为 0 |
5.2 那些文档里不会写的避坑心得
第一,WSL 里跑 OpenClaw 这类长驻服务,一定要用 systemd 或者 nohup 方式管理,否则 SSH 一断开服务就没了。Ubuntu 22.04 在 WSL 2 里默认没有启用 systemd,需要在 /etc/wsl.conf 里加 [boot] systemd=true,然后 wsl --shutdown 重启。启用之后就能用 systemctl 管理 OpenClaw 服务了,稳定很多。
第二,飞书的 Webhook 回调地址如果变了,旧地址会一直保持 pending 状态,不会自动删除。排查问题的时候建议先看飞书后台事件订阅页面是否提示“配置待验证”,是的话重新点击“验证”按钮,不要干等消息。
第三,OpenClaw 的 workspace 目录是智能体读写文件的根目录,飞书发来的附件、OpenClaw 生成的表格文件都会存在这里。定期清一下临时文件,否则虚拟磁盘镜像会越来越大。
第四,如果想让 OpenClaw 操作飞书多维表格,建议单独申请一个多维表格的 API 令牌,不要直接用机器人身份的 token。多维表格的权限模型和 IM 消息模型不一样,分开管理更安全、排查也方便。
5.3 一条容易走岔的路:能力边界要提前划好
最后说一个容易被忽略的点:OpenClaw 的能力很强,它可以执行命令、读写文件、调用 API。但接飞书之后,意味着任何能 @机器人 的人都能间接触发这些能力。所以我在配置 exec-approvals.json 的时候刻意做了一些限制,只允许只读类命令和明确指定的脚本放行,写操作全部需要二次审批。这个安全边界请在接入前就规划好,别等服务暴露出去以后再临时补。
另外,如果公司内部使用,建议优先通过飞书后台的“可用范围”设置限制谁能使用这个应用,而不是让全公司的人都来试用。这个设置位置在飞书开放平台应用详情页的“权限安全”区域,初期可以只添加测试部门。
文章写到这里,我实际操作中的体会是:WSL + OpenClaw + 飞书这条路,真正难的部分并不是安装命令本身,而是把 Linux 环境、网络回调、开放平台权限这三套体系的逻辑对齐。任何一个环节的配置都在自己的体系内合理,但放到整体链路里就可能对不上。解决的关键就是逐步验证:先确认 WSL 正常、再确认 OpenClaw 服务可访问、再确认飞书回调能打通、最后才联调完整对话。每一步都能独立验证,就不会在最后阶段面对一堆未知变量。最后再分享一个小技巧:OpenClaw 的日志文件默认在 ~/.openclaw/logs/ 下,飞书回调出问题时,一边触发事件一边 tail -f 看日志,比盲猜要高效得多。
