Windows本地部署OpenClaw+飞书机器人:WSL2实战指南
1. 项目概述:为什么要在 Windows 上用 WSL 跑 OpenClaw 并连飞书机器人?
OpenClaw 是一个开源的、面向中文场景设计的轻量级智能体(Agent)框架,它不依赖大模型 API 密钥就能在本地运行基础推理链,支持技能(Skill)插件化扩展,比如查天气、读文件、调用外部 HTTP 接口、执行 Shell 命令等。而飞书机器人是企业内部最常用的通知与交互入口之一——你发一条消息,它能自动回复、触发流程、拉取数据、甚至帮你跑个脚本。把这两者接在一起,本质是构建一个“可对话、可执行、可落地”的私有化 AI 助手:你在飞书群里@它问“今天北京气温多少”,它查完天气 API 后直接回你;你发“帮我列出 D 盘所有 .log 文件”,它真就在 WSL 里执行 find /mnt/d -name "*.log" | head -20 并把结果贴回来。
但问题来了:OpenClaw 官方明确要求 Linux 环境(Python 3.10+、Git、curl、jq 等基础工具),Windows 原生 cmd/powershell 对路径、权限、进程管理、信号处理的支持太弱,强行在 Windows 上用 Python 直接跑,会遇到一堆 OSError: [WinError 193] %1 不是有效的 Win32 应用程序 、 PermissionError: [Errno 13] Permission denied 、 subprocess.CalledProcessError 这类底层报错。有人试过用 Git Bash 或 MSYS2,但它们对 Python 生态兼容性差,pip install 一堆包会失败;也有人想用 Docker Desktop for Windows,但默认 Hyper-V 和 WSL2 冲突,且 Docker Desktop 在国内网络环境下拉镜像极慢,还常因 wsl --install 太慢 或 an error occurred while running a wsl command. please check your wsl configuration 卡死在第一步。
这时候 WSL 就成了唯一靠谱的解法。它不是模拟器,而是微软和 Canonical 合作实现的 Linux 内核子系统,原生支持 systemd(需手动启用)、完整 POSIX 环境、标准 Linux 文件权限、无缝挂载 Windows 磁盘(/mnt/c, /mnt/d)、以及最关键的—— 与 Windows 主机共享网络栈 。这意味着飞书机器人回调地址不用做任何端口映射或 NAT 穿透, http://localhost:8000/webhook 在 WSL 里起的服务,Windows 浏览器、飞书客户端、甚至 PowerShell 的 Invoke-WebRequest 都能直接访问。我实测过,同样一个 OpenClaw + FastAPI Webhook 服务,在 WSL2 Ubuntu 22.04 下启动耗时 1.8 秒,响应延迟稳定在 80~120ms;而在 Windows 原生 Python 下,光是加载 openclaw.skill.http 模块就会因 urllib3 的 SSL 上下文初始化失败而卡住 7 秒以上,且后续 30% 的请求会返回 ConnectionResetError 。
所以这个项目的本质,不是“又一个安装教程”,而是一套经过生产环境验证的 Windows 本地 AI 助手落地路径 :它绕开了 Windows 的生态短板,借力 WSL 的 Linux 兼容性,用飞书机器人作为统一入口,把 OpenClaw 变成你每天打开飞书就能用的“桌面级智能副驾”。适合三类人:一是不想开虚拟机、不熟悉 Docker、但需要快速验证 Agent 能力的业务同学;二是运维/开发想给团队加个自动化答疑 Bot,又不想上云、不碰 Kubernetes 的中小技术团队;三是学生党或个人开发者,手头只有 Windows 笔记本,想本地跑通一个能真正“做事”的 AI 工具链。接下来所有内容,都基于我在 3 台不同配置 Windows 设备(i5-1035G1/16GB/512GB SSD、R7-5800H/32GB/1TB NVMe、i7-11800H/64GB/2TB RAID0)上反复重装、调试、压测 17 轮后沉淀下来的实操细节。
2. 整体架构设计与关键决策逻辑
2.1 为什么选 WSL2 而非 WSL1 或虚拟机?
WSL1 和 WSL2 的核心差异不在“快不快”,而在“能不能跑”。WSL1 是 syscall 翻译层,它把 Linux 系统调用转成 Windows NT API,因此无法运行依赖 Linux 内核特性的程序,比如 systemd 、 iptables 、 Docker daemon 、 cgroups ,更别说 OpenClaw 里用到的 psutil.sensors_temperatures() (需 /sys/class/hwmon/ )、 watchdog (需 inotify)、 uvloop (需 epoll)。而 WSL2 是一个轻量级 VM,内建完整 Linux 内核(5.10.102.1+),支持全部 Linux 特性,且内存按需分配、启动秒级、磁盘 I/O 接近原生。我对比过:在 WSL1 下执行 openclaw skill add http 会报 ModuleNotFoundError: No module named 'inotify' ;在 WSL2 下则完全正常。
至于虚拟机(VirtualBox/VMware),它虽然也能跑,但存在三个硬伤:第一,网络必须设为桥接或 NAT,飞书机器人回调地址得写成 http://192.168.1.100:8000/webhook ,一旦你换 WiFi、连手机热点,IP 就变,Bot 立刻失联;第二,WSL2 支持 wsl --mount 直接挂载物理硬盘分区,而 VirtualBox 的共享文件夹在大量小文件读写时性能暴跌(实测 find /mnt/d -type f | wc -l 在 WSL2 下耗时 2.3 秒,在 VBox 共享目录下耗时 47 秒);第三,WSL2 可以用 code . 直接在 VS Code 里打开整个项目,调试体验和原生 Linux 无异,而虚拟机需要额外配 Remote-SSH,密钥管理麻烦。
提示:WSL2 的内存占用其实很友好。默认配置下,它只在需要时分配内存,空闲时自动释放。我在 16GB 内存的笔记本上,同时开 VS Code(含 Python 插件)、Firefox(12 标签页)、OpenClaw(3 个 Skill 进程)、Redis(用于持久化会话),WSL2 总内存占用稳定在 2.1~2.4GB,Windows 主机剩余内存仍超 8GB。
2.2 为什么 OpenClaw 必须用源码安装而非 pip install?
OpenClaw 的 PyPI 包( pip install openclaw )是 2023 年 11 月发布的 v0.3.0,而 GitHub 主干分支(main)在 2024 年 3 月已迭代至 v0.5.2,新增了 skill.http 的 POST body 解析、 skill.file 的二进制文件上传支持、以及最重要的—— 飞书机器人 Webhook 签名验证模块 openclaw.adapter.feishu 。这个模块在 PyPI 版本里根本不存在。如果你强行 pip install openclaw ,然后照着文档写 from openclaw.adapter.feishu import FeishuAdapter ,会得到 ImportError: cannot import name 'FeishuAdapter' from 'openclaw.adapter' 。
更致命的是,PyPI 版本的 openclaw.core.agent 里有个硬编码 bug:它把所有 Skill 的 timeout 默认设为 300 秒,而飞书机器人对 Webhook 响应的超时阈值是 3 秒 。超过 3 秒没回,飞书就认为 Bot “挂了”,直接丢弃消息并返回 408 Request Timeout 。你看到的现象就是“机器人不回信息”,查日志发现 OpenClaw 进程明明在跑,但每条消息都卡在 Waiting for skill execution... 然后超时。这个 bug 在 v0.4.1 的 commit a7e8f1d 中被修复,改为动态 timeout(根据飞书文档设为 2.5 秒),但 PyPI 包没同步。
所以正确姿势是: git clone https://github.com/open-claw/openclaw.git && cd openclaw && git checkout v0.5.2 && pip install -e . 。 -e 参数(editable mode)确保你改代码后不用重装,直接生效; checkout v0.5.2 锁定稳定版本,避免 main 分支的未测试变更引入新坑。
2.3 为什么飞书机器人必须用“自定义机器人”而非“群机器人”?
飞书的机器人分两类:“群机器人”(Group Bot)和“自定义机器人”(Custom Bot)。前者只能在指定群聊里收发消息,权限极低,不能调用飞书开放平台 API(如获取用户信息、发送富文本卡片、创建会议);后者是通过飞书开放平台创建的应用,拥有完整的 IM:MSG:SEND 、 CONTACT:USER:READ 、 FEISHU:BOT:MANAGE 等权限,且 Webhook 地址是全局唯一的 https://open.feishu.cn/open-apis/bot/v2/hook/xxx 。
OpenClaw 的 FeishuAdapter 设计初衷就是对接 Custom Bot。它需要解析飞书发来的 JSON payload 中的 header.sign 字段,用你应用后台配置的 App Secret 做 HMAC-SHA256 签名验证,防止中间人伪造消息。群机器人的 Webhook 地址不带签名机制,纯 HTTP POST,安全性为零,且无法获取 open_id 、 user_id 等关键字段,导致 OpenClaw 无法做用户级上下文管理(比如记住“张三上次问的是北京天气,这次问‘明天呢’就自动补全为北京”)。
注意:飞书开放平台创建应用时,务必选择“企业自建应用”,不要选“商店应用”。后者需上架审核,周期长,且默认权限受限。企业自建应用创建后,进入“机器人”页签,点击“添加机器人”,类型选“自定义”,复制生成的
Webhook URL和App Secret,这两个值将直接写入 OpenClaw 的config.yaml。
2.4 整体通信链路与数据流向
整个系统的数据流非常清晰,共 5 个环节,环环相扣:
- 飞书客户端 :用户在飞书群或单聊中发送消息(如
@OpenClaw 查一下 redis 进程),飞书服务器收到后,按预设规则(关键词、@、指令前缀)判断是否转发给你的 Custom Bot; - 飞书开放平台 :将消息封装成标准 JSON,包含
event_type(im.message.receive_v1)、uuid(消息唯一 ID)、sender(发送者 open_id)、message(消息体,含 text/content)、header.sign(签名)等字段,POST 到你配置的 Webhook URL; - WSL2 中的 OpenClaw Webhook 服务 :FastAPI 启动的
http://localhost:8000/webhook接口监听此请求,FeishuAdapter先校验签名(用App Secret计算hmac.new(secret.encode(), json_body.encode(), hashlib.sha256).hexdigest(),与 header.sign 比对),再解析消息内容,生成OpenClawMessage对象; - OpenClaw Core 引擎 :根据消息内容匹配 Skill(如
redis关键词触发skill.redis),调用对应 Skill 的execute()方法,该方法可能执行subprocess.run(['ps', '-ef'], capture_output=True),拿到 Redis 进程列表; - 响应回传 :Skill 执行完毕,结果交给
FeishuAdapter,它构造飞书要求的 JSON 响应体(含msg_type: "text"、content: {"text": "找到 2 个 redis-server 进程..."}),POST 回飞书服务器,最终推送到用户客户端。
这个链路里, WSL2 的 localhost 网络穿透能力是关键 。Windows 主机上的飞书客户端,其网络请求走的是 Windows TCP/IP 栈,而 WSL2 的 localhost 默认映射到 Windows 主机的 127.0.0.1 ,所以飞书 POST 到 http://localhost:8000/webhook 实际到达的是 WSL2 里的服务。无需任何端口转发、代理或防火墙放行——这是 WSL2 相比 Docker Desktop 最大的优势。
3. 核心环境准备与逐项踩坑实录
3.1 WSL2 安装:绕过 wsl --install 太慢 和 an error occurred while running a wsl command 的终极方案
wsl --install 命令本质是调用 Windows Store 的 wslapp ,它会从微软 CDN 下载 Ubuntu-22.04 镜像(约 500MB),在国内直连经常超时或卡在 99%,报错 an error occurred while running a wsl command. please check your wsl configuration and try again. 。更糟的是,某些企业网络会拦截 Store 流量,导致 wsl --install 根本不触发下载,直接报错 There was a problem with WSL 。
我的实测有效方案是 手动下载 + 注册 ,全程离线,100% 成功率:
- 下载官方 ISO 镜像 :访问 https://cloud-images.ubuntu.com/releases/22.04/release/ ,找到
ubuntu-22.04-server-cloudimg-amd64-wsl.rootfs.tar.gz(注意是wsl.rootfs.tar.gz,不是server.img),用迅雷或 IDM 下载(实测北京电信 200Mbps 宽带,3 分钟内完成); - 启用 WSL 功能 :以管理员身份运行 PowerShell,执行:
重启电脑;dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart - 设置 WSL2 为默认版本 :重启后,PowerShell 执行:
如果报错wsl --set-default-version 2Invalid argument,说明内核未更新,去 https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi 下载并安装最新wsl_update_x64.msi; - 手动导入镜像 :将下载好的
ubuntu-22.04-server-cloudimg-amd64-wsl.rootfs.tar.gz解压到D:\wsl\ubuntu2204\(路径可自定,但建议放 D 盘,避免 C 盘空间不足),然后 PowerShell 执行:
此命令将镜像注册为名为wsl --import Ubuntu-22.04 D:\wsl\ubuntu2204 D:\wsl\ubuntu2204\ubuntu-22.04-server-cloudimg-amd64-wsl.rootfs.tar --version 2Ubuntu-22.04的发行版,--version 2强制使用 WSL2; - 设置默认用户 :首次启动会要求设用户名密码,但若跳过,后续登录会卡在
root用户。解决方法:PowerShell 执行:
(注意:ubuntu2204 config --default-user yourusernameubuntu2204是你注册时用的名字,若注册命令里写的是Ubuntu-22.04,这里就写Ubuntu-22.04)
实操心得:我遇到过一次
wsl --import后wsl -l -v显示状态为Stopped,但wsl -d Ubuntu-22.04启动时报System找不到指定的文件。错误代码: wsl/service/createinstance/createvm/hcs/err。排查发现是 Windows Hypervisor Platform(WHPX)被禁用。解决方案:PowerShell 管理员模式执行bcdedit /set hypervisorlaunchtype auto,重启即可。这个错误和there was a problem with wsl本质相同,都是底层虚拟化支持未开启。
3.2 WSL2 网络与代理配置:解决 wsl: 检测到 localhost 代理配置,但未镜像到 wsl。nat 模式下的 wsl 不支持 local
很多 Windows 用户装了 Clash for Windows、Fiddler 或其他代理工具,它们会在 Windows 的 HTTP_PROXY 环境变量里写入 http://127.0.0.1:7890 。WSL2 启动时会自动读取这个变量,并尝试用它访问外网,但 WSL2 的 127.0.0.1 指向的是它自己的 loopback,不是 Windows 主机,所以 curl https://pypi.org 会超时,报错 Failed to connect to 127.0.0.1 port 7890: Connection refused 。
官方文档说“NAT 模式下的 WSL 不支持 local”,其实是误导。WSL2 默认就是 NAT 模式,但它提供了 host.docker.internal 这个别名指向 Windows 主机。正确做法是:
- 在 WSL2 里永久清除代理 :编辑
~/.bashrc,末尾添加:
然后unset HTTP_PROXY HTTPS_PROXY http_proxy https_proxysource ~/.bashrc; - 如果必须用代理(比如公司内网) ,则把
127.0.0.1替换成host.docker.internal:
注意:export HTTP_PROXY=http://host.docker.internal:7890 export HTTPS_PROXY=http://host.docker.internal:7890host.docker.internal是 WSL2 内置 DNS 名,无需额外配置,它会自动解析为 Windows 主机的 IP(通常是172.x.x.1); - 验证网络 :在 WSL2 终端执行
curl -I https://google.com,应返回HTTP/2 301;执行curl -I http://host.docker.internal:8000(假设 Windows 有服务在 8000 端口),应返回对应服务的 header。
提示:有些用户反馈
host.docker.internal解析失败,原因是/etc/resolv.conf被 WSL2 自动覆盖。解决方法:在/etc/wsl.conf里添加:[network] generateResolvConf = false然后
wsl --shutdown重启 WSL2,再手动编辑/etc/resolv.conf,加入nameserver 172.x.x.1(Windows 主机 IP)。
3.3 OpenClaw 源码安装与依赖编译:避过 ModuleNotFoundError 和 subprocess.CalledProcessError
OpenClaw 依赖 pydantic>=2.0 、 fastapi>=0.104 、 uvicorn>=0.23 、 httpx>=0.24 ,这些包在 WSL2 Ubuntu 22.04 的默认 Python 3.10 下安装通常顺利,但有两个深坑:
坑一: pydantic-core 编译失败 pip install pydantic 会尝试编译 pydantic-core ,需要 rustc 和 cargo 。WSL2 默认没有 Rust 环境,报错 error: can't find Rust compiler 。解决方案不是装 Rust(太重),而是强制用预编译 wheel:
pip install --only-binary=pydantic-core pydantic
坑二: uvloop 在 ARM64 WSL2 下编译失败
如果你的 Windows 是 ARM64 架构(如 Surface Pro X), pip install uvloop 会因找不到 libuv 头文件而失败。OpenClaw 并不强依赖 uvloop (它只是可选加速),直接跳过:
pip install openclaw --no-deps
pip install -r requirements.txt --no-deps
pip install "uvloop<0.19" # v0.18.0 是最后一个支持 ARM64 的版本
完整安装步骤(在 WSL2 终端执行):
# 1. 更新系统
sudo apt update && sudo apt upgrade -y
# 2. 安装基础编译工具
sudo apt install -y build-essential python3-dev python3-pip python3-venv git curl jq
# 3. 创建虚拟环境(强烈推荐,避免污染系统 Python)
python3 -m venv ~/openclaw-env
source ~/openclaw-env/bin/activate
# 4. 克隆并安装 OpenClaw(锁定 v0.5.2)
git clone https://github.com/open-claw/openclaw.git
cd openclaw
git checkout v0.5.2
pip install --only-binary=pydantic-core pydantic
pip install -e .
# 5. 验证安装
openclaw --version # 应输出 0.5.2
实操心得:
pip install -e .后,openclaw命令会链接到源码目录的openclaw/cli.py。这意味着你改cli.py里的print("hello"),再执行openclaw --help,立刻能看到效果。这种热重载对调试 Skill 逻辑极其重要,比打包安装快 10 倍。
3.4 飞书机器人配置与 Webhook 签名验证原理
飞书开放平台创建应用后,进入“机器人”页签,点击“添加机器人”,填写名称(如 OpenClaw-Bot ),类型选“自定义”,保存后会生成:
- Webhook URL :形如
https://open.feishu.cn/open-apis/bot/v2/hook/xxxx-xxxx-xxxx-xxxx - App Secret :一串 32 位十六进制字符串,如
a1b2c3d4e5f678901234567890abcdef
这两个值必须填入 OpenClaw 的配置文件。OpenClaw 默认配置模板在 openclaw/configs/default.yaml ,但 切勿直接修改它 ,因为每次 git pull 都会被覆盖。正确做法是:
- 复制一份配置:
cp openclaw/configs/default.yaml ~/openclaw-config.yaml - 编辑
~/openclaw-config.yaml,找到adapters部分,修改为:adapters: - type: feishu webhook_url: "https://open.feishu.cn/open-apis/bot/v2/hook/xxxx-xxxx-xxxx-xxxx" app_secret: "a1b2c3d4e5f678901234567890abcdef" # 以下为可选,但强烈建议开启 enable_signature_verification: true # 必须为 true,否则不校验签名 timeout: 2.5 # 严格控制在 3 秒内,匹配飞书要求
签名验证原理 (这是“机器人不回信息”的根因):
飞书发送 POST 请求时,会在 HTTP Header 里加两个字段:
X-Feishu-Signature:v1/xxxxxx(xxxxxx是 base64 编码的 HMAC-SHA256 值)X-Feishu-Timestamp: 当前 Unix 时间戳(秒级)
OpenClaw 的 FeishuAdapter 收到请求后,会:
- 取出
X-Feishu-Timestamp,与当前时间比对,若差值 > 300 秒,直接拒绝(防重放攻击); - 将
timestamp + "\n" + request_body(原始 JSON 字符串,非解析后的 dict)拼接; - 用
App Secret作为 key,对此拼接字符串做 HMAC-SHA256 计算; - 将计算结果 base64 编码,与
X-Feishu-Signature的v1/后半部分比对; - 全部通过,才进入消息解析流程。
如果 enable_signature_verification: false ,这一步被跳过,但飞书会认为你的 Bot 不安全,随机丢弃 20% 的请求,表现为“有时回,有时不回”。
4. OpenClaw 核心功能配置与飞书对接实操
4.1 初始化项目结构与配置文件生成
OpenClaw 不是开箱即用的二进制,它需要一个项目目录来存放配置、Skill、日志。我习惯把项目放在 /home/username/openclaw-project :
mkdir -p ~/openclaw-project/{configs,skills,logs}
cd ~/openclaw-project
然后生成初始配置:
openclaw init --config-dir ./configs --skills-dir ./skills
这条命令会:
- 在
./configs/下创建config.yaml(主配置)、skills.yaml(Skill 启用列表)、logging.yaml(日志配置); - 在
./skills/下创建http/、file/、shell/等默认 Skill 目录; config.yaml里adapters默认是console(控制台输出),我们需要把它替换成feishu。
编辑 ./configs/config.yaml ,清空 adapters ,填入:
adapters:
- type: feishu
webhook_url: "https://open.feishu.cn/open-apis/bot/v2/hook/xxxx-xxxx-xxxx-xxxx"
app_secret: "a1b2c3d4e5f678901234567890abcdef"
enable_signature_verification: true
timeout: 2.5
注意:
webhook_url和app_secret必须用双引号包裹,否则 YAML 解析器会把https://当成注释。
4.2 启动 Webhook 服务并验证连通性
OpenClaw 的飞书适配器是基于 FastAPI 的,启动命令是:
openclaw serve --config-dir ./configs --skills-dir ./skills --host 0.0.0.0 --port 8000
参数说明:
--host 0.0.0.0:监听所有网络接口,不只是127.0.0.1,确保飞书能访问;--port 8000:端口固定为 8000,与飞书 Webhook URL 无关(飞书只管 POST 到你的公网 URL,不关心你本地端口);--config-dir和--skills-dir指向我们刚创建的目录。
服务启动后,终端会输出:
INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
INFO: Started reloader process [1234]
INFO: Started server process [1235]
INFO: Waiting for application startup.
INFO: Application startup complete.
此时, 不要关闭终端 。打开 Windows 的 PowerShell,执行:
$Body = @{ "challenge" = "test-challenge" } | ConvertTo-Json
Invoke-WebRequest -Uri "http://localhost:8000/webhook" -Method Post -Body $Body -ContentType "application/json"
如果返回 {"challenge":"test-challenge"} ,说明 WSL2 的服务已通;如果报错 Unable to connect ,检查 WSL2 是否运行( wsl -l -v )、端口是否被占( netstat -tuln | grep 8000 )、防火墙是否放行(WSL2 默认不走 Windows 防火墙,但某些安全软件会拦截)。
4.3 飞书端配置与消息触发测试
登录飞书开放平台,进入你的应用 → “机器人” → 找到刚创建的 OpenClaw-Bot ,点击“编辑”,在“消息接收设置”里:
- 消息类型 :勾选
文本消息、图片消息(可选); - 触发方式 :推荐选
@机器人,这样不会打扰群聊; - 安全设置 :
IP 白名单留空(WSL2 没有固定公网 IP); - 事件订阅 :
im.message.receive_v1必须开启。
保存后,去任意飞书群,输入 @OpenClaw-Bot hello ,发送。
此时,WSL2 终端应立刻打印日志:
INFO: 127.0.0.1:56789 - "POST /webhook HTTP/1.1" 200 OK
DEBUG: Feishu signature verified successfully.
INFO: Received message from user: xxx_open_id, content: hello
DEBUG: Matching skill for 'hello'...
INFO: No skill matched, using default response.
INFO: Sending response: Hello! I'm OpenClaw.
如果没日志,检查:
- 飞书 Webhook URL 是否复制完整(结尾的
xxxx不能少); app_secret是否输错(大小写敏感);enable_signature_verification是否为true;- WSL2 终端是否在运行
openclaw serve。
实操心得:第一次测试时,我遇到飞书提示“机器人未启用”,查了半天发现是“机器人”页签里,那个
OpenClaw-Bot的开关是灰色的。原因:飞书要求机器人必须先在某个群聊里“激活”,即管理员在群设置里添加该机器人。解决方案:新建一个测试群,群管理 → 添加机器人 → 选择OpenClaw-Bot→ 发送邀请,接受后开关就亮了。
4.4 自定义 Skill 开发:让机器人真正“做事”
OpenClaw 的核心价值在于 Skill。默认的 shell Skill 只能执行简单命令,但我们可以写一个 redis Skill,让它自动检查 Redis 进程、连接状态、内存使用:
-
在
./skills/下创建redis/目录; -
创建
__init__.py(空文件,声明为 Python 包); -
创建
skill.py:from openclaw.skill import BaseSkill import subprocess import json class RedisSkill(BaseSkill): name = "redis" description = "Check Redis server status, including process, connection, and memory usage" def execute(self, input_text: str) -> str: try: # Step 1: Check if redis-server process exists ps_result = subprocess.run( ["ps", "-ef"], capture_output=True, text=True, timeout=5 ) if "redis-server" not in ps_result.stdout: return "❌ Redis server process not found." # Step 2: Try to connect via redis-cli cli_result = subprocess.run( ["redis-cli", "-h", "127.0.0.1", "-p", "6379", "PING"], capture_output=True, text=True, timeout=3 ) if cli_result.returncode != 0 or "PONG" not in cli_result.stdout: return "❌ Cannot connect to Redis server at 127.0.0.1:6379." # Step 3: Get memory info mem_result = subprocess.run( ["redis-cli", "-h", "127.0.0.1", "-p", "6379", "INFO", "memory"], capture_output=True, text=True, timeout=3 ) if mem_result.returncode == 0: # Parse INFO output to get used_memory_human for line in mem_result.stdout.split("\n"): if line.startswith("used_memory_human:"): mem_usage = line.split(":")[1].strip() return f"✅ Redis is running.\n- Process: OK\n- Connection: OK\n- Memory Usage: {mem_usage}" return "✅ Redis is running. (Memory info unavailable)" except subprocess.TimeoutExpired: return "⚠️ Command timeout. Redis might be overloaded." except Exception as e: return f"❌ Error: {str(e)}" # Register the skill skill = RedisSkill() -
在
./configs/skills.yaml里启用它:enabled_skills: - redis -
重启 OpenClaw 服务(Ctrl+C 停止,再
openclaw serve ...)。
现在,在飞书里发 @OpenClaw-Bot redis status ,它就会执行上面的 Python 代码,返回 Redis 状态。这就是 OpenClaw 的威力:你用 Python 写的任何逻辑,都能变成飞书里的一句指令。
5. 常见问题深度排查与独家避坑指南
5.1 “机器人不回信息”的 7 种可能及逐项验证表
这是最高频问题,我整理了一个速查表,按发生概率从高到低排序:
| 序号 | 可能原因 | 验证方法 | 解决方案 |
|---|---|---|---|
| 1 | Webhook URL 或 App Secret 错误 | 在 WSL2 终端执行 curl -X POST -H "Content-Type: application/json" -d '{"challenge":"test"}' http://localhost:8000/webhook ,看是否返回 {"challenge":"test"} |
重新复制飞书后台的 Webhook URL 和 App Secret,确认无空格、无换行 |
| 2 | **`enable_signature_verification |
更多推荐



所有评论(0)