Windows本地部署OpenClaw打造7×24小时AI员工实战指南
1. 项目概述:为什么需要一个“7×24小时的AI员工”?
“打造7×24小时的AI员工”这个说法听起来像营销话术,但落到具体执行层面,它指向一个非常务实的技术目标: 在本地可控环境中,部署一个长期稳定、无需人工值守、能自主响应任务、具备多模态交互与工作流编排能力的智能体系统 。而OpenClaw,正是当前少数几个真正面向“生产级AI员工”定位设计的开源框架——它不是聊天机器人,也不是单点工具调用器,而是一个可配置、可扩展、带状态管理、支持技能(Skill)热插拔、能连接真实业务系统(如飞书、微信、数据库、HTTP API、本地文件系统)的轻量级智能体运行时。
我从去年底开始在三类典型场景中落地OpenClaw:
- 内部IT支持岗 :自动响应研发同事提交的“Jenkins构建失败”“GitLab权限申请”“Docker镜像拉取超时”等工单,解析日志、检索知识库、触发修复脚本、生成摘要并推送飞书;
- 财务数据核对岗 :每天凌晨3点自动从共享盘读取Excel格式的销售日报,比对ERP导出的SQL Server数据表,标记差异行,生成PDF报告并邮件发送给主管;
- 客户初筛岗 :接入企业微信客服API,对新添加的客户自动发送结构化问卷(产品兴趣、预算区间、决策链角色),将结果清洗后写入本地SQLite人事/客户管理系统,同步打标至CRM字段。
这些都不是Demo,而是已连续运行287天、平均每日处理132个有效请求、故障中断<0.3次/月的真实岗位替代。关键在于: 所有数据不出内网,所有模型运行在本地GPU或CPU上,所有技能代码由团队自主编写和审计,所有调度逻辑可调试、可回滚、可监控 。这恰恰是SaaS型AI助手无法满足的核心诉求——合规性、确定性、可解释性。
你可能注意到热搜词里反复出现“Windows本地安装”“Docker安装成功后部署Java项目”“防火墙USG6000V配置”“局域网连接”——这些不是偶然。它们共同指向一个被严重低估的现实: 绝大多数中小企业、传统行业部门、科研实验室、甚至部分金融机构的科技团队,其AI落地的第一道门槛根本不是模型能力,而是“如何让AI在一个没有云账号、没有公网IP、没有K8s集群、只有几台Windows工作站和一台群晖NAS的局域网里,老老实实跑起来,并且别三天两头崩掉” 。
OpenClaw之所以成为这个场景下的高关注度选项,正因为它把“本地生存力”刻进了架构基因:它不强制依赖CUDA(可纯CPU推理)、不绑定特定大模型(支持Ollama、LMStudio、本地vLLM服务)、不强求Redis/MongoDB(内置SQLite状态存储)、甚至允许你用bat脚本启动——这种“向后兼容”的务实感,在动辄要求Python 3.11+、Node 20+、NVIDIA Driver 535+的AI工具生态里,显得异常珍贵。
所以,这篇内容不讲“OpenClaw有多酷”,只讲一件事: 在一台刚重装完Windows 11专业版、连Docker Desktop都还没装的普通办公电脑上,从零开始,用最直白的操作步骤,把它变成一个能干活、不掉链子、出了问题你能自己看懂日志在哪、改哪行配置就能修好的AI员工 。过程中会穿插我踩过的17个坑、5个必须改的默认参数、3种不同硬件配置下的性能取舍建议,以及一个关键认知: 所谓“7×24小时”,90%的功夫不在AI本身,而在让整个运行环境像老式机械钟表一样,齿轮咬合严密、发条张力均匀、游丝振频稳定 。
2. 整体设计思路与方案选型逻辑
2.1 为什么放弃“一键安装包”和“云托管方案”?
看到标题里“本地安装”,很多人第一反应是找.exe安装程序或Docker Compose一键部署。但我在给6家客户做POC时发现,这两种路径在真实办公环境中失败率极高:
-
官方Windows安装包(.exe) :它本质是PyInstaller打包的Python应用,会把所有依赖(包括PyTorch CPU版、chromium内核、ffmpeg)全塞进一个几百MB的文件里。问题在于:
- 它强制使用自带的Python解释器(3.9.13),与你系统里已有的Anaconda/Miniconda环境冲突,导致后续想加自定义Skill(比如调用公司内部Java微服务)时,
subprocess.Popen(['java', '-version'])直接报错“找不到java命令”——因为PATH环境变量没被正确继承; - 它内置的chromium版本固定(114.0.5735.199),而我们某客户用的飞书Webhook接口在2024年Q3升级了JWT签名算法,旧chromium的crypto.subtle API不支持新算法,结果AI员工发飞书消息永远401;
- 最致命的是,它的日志全打在
%APPDATA%\OpenClaw\logs\下,而Windows组策略常限制普通用户写入APPDATA,导致服务启动后静默退出,连错误提示都没有。
- 它强制使用自带的Python解释器(3.9.13),与你系统里已有的Anaconda/Miniconda环境冲突,导致后续想加自定义Skill(比如调用公司内部Java微服务)时,
-
Docker版(群晖/WSL2) :Docker确实干净,但办公场景下有硬伤:
- 群晖DSM 7.x的Docker套件默认禁用
--privileged,而OpenClaw的Browser Relay技能(用于自动化网页操作)需要访问/dev/video*设备来调用摄像头做活体检测,不加特权直接Permission Denied; - WSL2的网络栈与Windows主机是NAT隔离的,当你在OpenClaw里配置
http://host.docker.internal:8080/api/order去调用本机Java Spring Boot服务时,WSL2根本解析不了host.docker.internal,必须手动改hosts或换http://172.28.0.1:8080——而这个IP每次重启WSL2都会变; - 更隐蔽的坑是:Docker Desktop for Windows默认启用“Use the WSL2 based engine”,但它会偷偷把你的C:\Users\XXX.ollama\models映射成只读卷,导致Ollama下载模型后,OpenClaw尝试加载时提示“Permission denied on /usr/share/ollama/.ollama/models/...”。
- 群晖DSM 7.x的Docker套件默认禁用
所以我的最终方案是: 放弃封装,回归本质——用原生Python环境 + 手动依赖管理 + 配置驱动启动 。这看似麻烦,但换来的是:
✅ 所有路径、端口、环境变量完全透明,出问题3分钟内定位到源码行;
✅ 可自由混用conda/pip/vcpkg,Java/Python/Node.js技能共存无冲突;
✅ 日志、数据库、模型缓存全部落在你指定的NTFS分区,备份恢复就是复制粘贴;
✅ 启动脚本里可以加 timeout /t 300 /nobreak && taskkill /f /im chrome.exe 这类Windows特有保活逻辑。
2.2 为什么选择SQLite而非PostgreSQL作为默认状态存储?
OpenClaw文档里推荐PostgreSQL,但我在所有客户现场都强制改用SQLite。原因很实际:
| 对比维度 | PostgreSQL | SQLite | 我的选择依据 |
|---|---|---|---|
| 安装复杂度 | 需单独安装服务端、初始化集群、配置pg_hba.conf | 零安装,一个.db文件即数据库 | 客户IT部门明确拒绝为AI员工开新的Windows服务,怕影响现有Oracle数据库稳定性 |
| 资源占用 | 常驻进程,空闲时内存占用120MB+ | 进程内嵌,仅在OpenClaw运行时加载,峰值<30MB | 办公电脑普遍是16GB内存,Chrome+IDEA+Teams已占10GB,再加PG易触发Windows内存压缩 |
| 备份方案 | 需 pg_dump 命令+定时任务 |
直接复制.db文件,支持Windows卷影复制(VSS) | 客户要求所有AI员工数据每日自动备份至NAS,SQLite文件天然支持VSS快照,PG需额外写脚本 |
| 并发写入 | 支持高并发读写 | WAL模式下支持>100TPS写入 | AI员工场景本质是“单写多读”:所有Skill执行结果写入state,只有监控页面读取,SQLite绰绰有余 |
更关键的是,OpenClaw的state schema设计本身就为SQLite优化过:
- 所有timestamp字段用
INTEGER存Unix时间戳(避免SQLite不支持DATETIME精度问题); skills表主键是skill_id TEXT PRIMARY KEY,而非自增ID——因为Skill是动态加载的,ID来自yaml文件名,字符串主键更安全;execution_log表用ZSTD压缩BLOB字段(需pip install pysqlite3-zstd),把一次完整浏览器操作的DOM快照从8MB压到1.2MB,避免SQLite单表过大触发锁表。
提示:如果你的AI员工需要对接外部业务系统(如SAP、用友U8),务必在
config.yaml里把state_backend设为postgresql,并用pgbouncer做连接池。但纯本地办公自动化,SQLite是更稳的选择。
2.3 模型层:为什么坚持“Ollama + 本地GGUF”而非直接调用API?
热搜词里高频出现“ollama安装本地模型”“deepseek接入”,这背后是成本与控制权的博弈。我做过测算:
假设AI员工每天处理200个客户咨询,每个咨询平均调用模型3次(意图识别+信息抽取+回复生成),按主流API价格:
- GPT-4 Turbo:$0.01/1K input tokens + $0.03/1K output tokens → 单日成本≈$18.7
- Claude 3 Haiku:$0.25/1M input + $1.25/1M output → 单日成本≈$3.2
- 而本地运行Qwen2-7B-Instill(4-bit量化GGUF):RTX 4090上推理延迟<800ms,电费≈$0.07/天
但成本只是表象,深层原因是 响应确定性 :
- API调用受网络抖动影响,P95延迟可能从300ms跳到8秒,导致AI员工在飞书对话中“卡住”,客户反复发送消息,触发重复执行;
- API返回格式不稳定(某天突然在JSON里加个
"trace_id"字段),而你的Skill解析逻辑是硬编码response["answer"],结果整条工作流崩掉; - 最致命的是审计:金融客户要求所有客户对话记录留存本地,API厂商的隐私协议里写着“为改进模型可能使用你的数据”,这直接违反GDPR和国内《个人信息保护法》。
所以我的模型层架构是三层:
- 兜底层 :
qwen2:0.5b(Ollama内置,1GB显存即可跑,用于健康检查和基础问答); - 主力层 :
deepseek-coder:6.7b-q4_K_M(从HuggingFace下载GGUF,Ollama load后绑定到/ollama/models/deepseek-coder,专攻代码类Skill); - 增强层 :
llava:13b(视觉模型,配合Browser Relay技能做网页截图分析,需NVIDIA GPU)。
注意:Ollama的
--num_ctx 4096参数必须显式设置!默认是2048,而DeepSeek-Coder处理长SQL日志时经常超限,导致截断后语义失真。我在start.bat里写死ollama run --num_ctx 8192 deepseek-coder:6.7b-q4_K_M。
3. 核心细节解析与实操要点
3.1 Windows环境预检:绕过那些“看起来正常却致命”的系统陷阱
在敲下第一条命令前,必须完成这5项Windows专属检查。跳过任何一项,后续90%的概率会在凌晨2点收到告警邮件说“AI员工离线”。
① 禁用Windows快速启动(Fast Startup)
这是最隐蔽的坑。快速启动本质是混合关机(Hybrid Shutdown),它会把内核会话保存到硬盘,下次开机直接加载。后果是:
- OpenClaw的SQLite数据库文件被Windows内核锁定,Python进程无法获得写锁,所有state更新失败;
- Docker Desktop的WSL2实例无法正常挂载NTFS分区,报错
mount: /mnt/c: wrong fs type, bad option, bad superblock。
✅ 正确操作:
# 以管理员身份运行PowerShell
powercfg /h off
# 然后彻底关机(不是重启):开始菜单 → 电源 → 按住Shift点击关机
② 关闭Windows Defender实时防护(仅限AI员工专用机)
Defender会扫描OpenClaw频繁读写的 skills/ 目录和 models/ 目录,当它扫描到 .gguf 文件时,会触发“可疑行为”规则,临时隔离文件导致模型加载失败。
✅ 正确操作(非永久关闭,仅排除目录):
# 创建排除目录列表
Add-MpPreference -ExclusionPath "C:\openclaw"
Add-MpPreference -ExclusionPath "C:\ollama\models"
# 验证是否生效
Get-MpPreference | Select-Object -ExpandProperty ExclusionPath
③ 配置Windows服务账户权限(关键!)
很多教程教你用 sc create 注册Windows服务,但默认用 LocalSystem 账户运行,它没有权限访问你的用户目录(如 C:\Users\Administrator\Documents\openclaw ),导致配置文件读取失败。
✅ 必须改为“本地用户账户”并赋予权限:
:: 创建专用服务账户(密码永不过期)
net user openclawsvc P@ssw0rd123! /add /expires:never
:: 加入Performance Monitor Users组(获取CPU/内存监控权限)
net localgroup "Performance Monitor Users" openclawsvc /add
:: 赋予对openclaw目录的完全控制权
icacls "C:\openclaw" /grant "openclawsvc:(OI)(CI)F" /T
④ 修正Windows时间同步(解决JWT签名失效)
OpenClaw调用飞书/微信API时,JWT token包含 iat (issued at)和 exp (expires at)字段,要求客户端时间与服务器误差<300秒。Windows默认NTP服务器(time.windows.com)在某些网络环境下同步不准。
✅ 强制使用国内可靠NTP:
# 停止Windows时间服务
Stop-Service w32time
# 配置阿里云NTP
w32tm /config /syncfromflags:manual /manualpeerlist:"ntp1.aliyun.com ntp2.aliyun.com" /reliable:yes /update
# 强制立即同步
w32tm /resync /force
# 启动服务
Start-Service w32time
⑤ 检查Windows Subsystem for Linux(WSL)状态
即使你不用Docker,OpenClaw的某些Skill(如 git_skill )会调用 git 命令。Windows自带的Git for Windows有时与OpenClaw的subprocess环境变量冲突。
✅ 推荐方案:启用WSL2并安装Ubuntu,把 git 、 curl 、 jq 等工具全放WSL里:
# 启用WSL
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
# 重启后安装Ubuntu 22.04
wsl --install Ubuntu-22.04
# 在WSL内配置git
sudo apt update && sudo apt install -y git curl jq
git config --global user.name "OpenClaw"
git config --global user.email "ai@company.local"
然后在OpenClaw Skill里,把 subprocess.Popen(['git', 'status']) 改成 subprocess.Popen(['wsl', 'git', 'status']) ,彻底规避Windows Git的PATH污染问题。
3.2 OpenClaw核心配置文件深度解析: config.yaml 里藏着90%的稳定性
OpenClaw的 config.yaml 不是简单的参数列表,而是一份“运行契约”。我逐行解读生产环境必改的12个字段:
# C:\openclaw\config.yaml
server:
host: "0.0.0.0" # 必须写0.0.0.0,不能写127.0.0.1!否则飞书回调URL无法访问
port: 8000 # 建议避开8080(常被Java服务占用)、3000(常被前端占用)
cors_origins: ["https://open.feishu.cn", "http://localhost:3000"] # 飞书和本地调试前端
model:
provider: "ollama" # 支持"ollama", "lmstudio", "vllm"
base_url: "http://localhost:11434" # Ollama默认端口,若改过需同步
default_model: "deepseek-coder:6.7b-q4_K_M" # 主力模型,必须与Ollama中模型名完全一致
# 关键!设置超时,避免模型卡死拖垮整个服务
timeout: 120 # 秒级超时,比默认30秒更稳妥
max_retries: 2 # 失败后重试2次,避免瞬时OOM
state:
backend: "sqlite" # 生产环境首选
sqlite_path: "C:/openclaw/state.db" # 绝对路径,用正斜杠!Windows下反斜杠会被YAML解析器误认为转义
# SQLite性能调优:开启WAL模式,提升并发写入
sqlite_wal: true
# 自动备份:每天凌晨2点备份state.db为state_20240520.db
sqlite_backup: true
skills:
# 技能目录必须用绝对路径,相对路径在Windows服务模式下会解析失败
directory: "C:/openclaw/skills"
# 热重载开关:开发时true,生产环境必须false!否则文件监视器会吃光CPU
hot_reload: false
browser_relay:
# Browser Relay是网页自动化核心,必须配置
enabled: true
# Chromium路径:指向你安装的Chrome稳定版,而非Ollama内置的旧版
chromium_path: "C:/Program Files/Google/Chrome/Application/chrome.exe"
# 关键!禁用沙箱,否则在Windows服务模式下无法启动
disable_sandbox: true
# 设置用户数据目录,避免与你日常Chrome冲突
user_data_dir: "C:/openclaw/chrome_user_data"
logging:
level: "INFO" # 生产环境用INFO,DEBUG日志量太大
file: "C:/openclaw/logs/openclaw.log"
# 按天轮转,保留30天
rotation: "1 day"
retention: "30 days"
# 飞书集成(最常用的企业IM)
feishu:
app_id: "cli_xxx" # 从飞书开放平台获取
app_secret: "xxx" # 严格保密!不要硬编码,用环境变量
verification_token: "xxx" # 飞书事件订阅验证用
encrypt_key: "xxx" # 加密消息用,若未开启加密可为空
# 关键!设置事件订阅URL,必须是公网可访问地址(如内网穿透)
callback_url: "https://your-domain.com/api/feishu/event"
实操心得:我把所有敏感字段(
app_secret,verification_token)从config.yaml中移出,改用Windows环境变量:setx OPENCLAW_FEISHU_APP_SECRET "xxx" /M setx OPENCLAW_FEISHU_VERIFICATION_TOKEN "xxx" /M然后在代码里用
os.getenv("OPENCLAW_FEISHU_APP_SECRET")读取。这样既避免配置文件泄露,又方便在不同环境(测试/生产)切换密钥。
3.3 技能(Skill)开发规范:让AI员工真正“会干活”
OpenClaw的Skill不是简单函数,而是遵循严格契约的模块。一个合格的Skill必须包含:
skill.yaml:声明元数据、输入输出schema、触发条件;main.py:实现核心逻辑;requirements.txt:独立依赖(避免污染主环境);README.md:使用说明和调试指南。
以“自动核对销售日报”Skill为例( C:\openclaw\skills\sales_check ):
① skill.yaml —— 让OpenClaw理解这个Skill能做什么
name: "sales_check" # Skill唯一ID,也是目录名
description: "每日自动核对销售日报与ERP数据"
trigger:
type: "schedule" # 触发类型:schedule/cron/http/webhook
cron: "0 3 * * *" # 每天凌晨3点执行(UTC+0),注意时区!
input_schema:
type: "object"
properties:
report_date:
type: "string"
format: "date" # YYYY-MM-DD格式
description: "要核对的报表日期"
output_schema:
type: "object"
properties:
status:
type: "string" # "success"/"failed"
mismatch_count:
type: "integer"
report_pdf:
type: "string" # 生成的PDF文件路径(供后续Skill发送邮件)
② main.py —— 真正干活的代码(含防错设计)
import os
import pandas as pd
import sqlite3
from datetime import datetime
import logging
# 获取OpenClaw注入的logger,自动接入统一日志系统
logger = logging.getLogger(__name__)
def execute(input_data):
try:
# 1. 读取Excel报表(容错:文件不存在则跳过)
report_path = f"C:/shared/sales_report_{input_data['report_date']}.xlsx"
if not os.path.exists(report_path):
logger.warning(f"Sales report not found: {report_path}")
return {"status": "skipped", "reason": "report missing"}
# 2. 读取ERP数据(容错:数据库连接失败则重试3次)
conn = None
for i in range(3):
try:
conn = sqlite3.connect("C:/erp/production.db")
break
except Exception as e:
logger.warning(f"ERP DB connect failed (attempt {i+1}): {e}")
if i == 2: raise e
# 3. 执行核对逻辑(关键:用pandas merge而非循环,性能差10倍)
df_report = pd.read_excel(report_path)
df_erp = pd.read_sql_query(
f"SELECT * FROM sales WHERE date = '{input_data['report_date']}'",
conn
)
# 左连接找出报表有但ERP没有的记录
diff = df_report.merge(df_erp, on="order_id", how="left", indicator=True)
mismatch_count = len(diff[diff["_merge"] == "left_only"])
# 4. 生成PDF报告(用weasyprint,比matplotlib快5倍)
from weasyprint import HTML
html_content = f"<h1>销售核对报告 {input_data['report_date']}</h1><p>差异订单数:{mismatch_count}</p>"
pdf_path = f"C:/openclaw/reports/sales_diff_{input_data['report_date']}.pdf"
HTML(string=html_content).write_pdf(pdf_path)
logger.info(f"Sales check completed. Mismatch count: {mismatch_count}")
return {
"status": "success",
"mismatch_count": mismatch_count,
"report_pdf": pdf_path
}
except Exception as e:
logger.error(f"Sales check failed: {e}", exc_info=True)
return {"status": "failed", "error": str(e)}
finally:
if conn: conn.close()
③ requirements.txt —— 独立依赖,避免“DLL地狱”
pandas==2.0.3
openpyxl==3.1.2
weasyprint==62.2
# 注意:不要写numpy>=1.24,必须锁定版本!
numpy==1.24.3
实操心得:我在
C:\openclaw\skills\下建了一个common目录,放所有Skill公用的工具函数(如db_utils.py,email_sender.py),并在每个Skill的main.py开头加:import sys sys.path.insert(0, "C:/openclaw/skills/common") from db_utils import get_erp_connection这样既避免重复代码,又保持Skill的独立性(
common目录不参与hot_reload)。
4. 实操过程与核心环节实现
4.1 分步安装:从零开始搭建OpenClaw本地环境(Windows 11)
以下步骤经23台不同配置的Windows 11机器实测,耗时最长不超过22分钟。请严格按顺序执行,每步完成后确认输出无ERROR。
步骤1:安装Python 3.10(精确版本!)
OpenClaw官方要求Python 3.9-3.11,但3.10.12是经过最多生产验证的版本。
- 下载地址:https://www.python.org/ftp/python/3.10.12/python-3.10.12-amd64.exe
- 安装时勾选:☑ Add Python to PATH,☑ Install pip,☑ Install for all users
- 验证:
python --version # 应输出 Python 3.10.12 where python # 应输出 C:\Program Files\Python310\python.exe
步骤2:创建专用虚拟环境(隔离主环境)
# 创建目录
mkdir C:\openclaw
cd C:\openclaw
# 创建venv(关键:用--system-site-packages,否则Ollama的DLL找不到)
python -m venv venv --system-site-packages
# 激活(Windows PowerShell需先执行:Set-ExecutionPolicy RemoteSigned -Scope CurrentUser)
venv\Scripts\activate.bat
# 升级pip到最新版(避免依赖解析错误)
python -m pip install --upgrade pip
步骤3:安装OpenClaw核心包(指定版本)
# 安装OpenClaw 0.8.5(当前最稳版本,0.9.0有Browser Relay内存泄漏Bug)
pip install openclaw==0.8.5
# 安装Windows专用依赖
pip install pywin32 psutil
# 验证安装
openclaw --version # 应输出 0.8.5
步骤4:安装Ollama并加载模型(离线优先)
- 下载Ollama Windows版:https://github.com/jmorganca/ollama/releases/download/v0.3.10/ollama-windows-amd64.zip
- 解压到
C:\ollama,添加到PATH:setx PATH "%PATH%;C:\ollama" /M - 重启CMD,验证:
ollama --version # 应输出 0.3.10 - 离线加载模型(避免半夜下载中断) :
- 从HuggingFace下载
deepseek-coder:6.7b-q4_K_M.Q8_0.gguf(约4.2GB); - 放到
C:\ollama\models\目录; - 手动创建Modelfile:
FROM C:/ollama/models/deepseek-coder:6.7b-q4_K_M.Q8_0.gguf PARAMETER num_ctx 8192 PARAMETER stop "```" - 构建模型:
cd C:\ollama ollama create deepseek-coder:6.7b-q4_K_M -f Modelfile
- 从HuggingFace下载
步骤5:初始化OpenClaw项目结构
# 生成默认配置
openclaw init
# 替换为生产级配置(覆盖config.yaml)
echo [config.yaml内容] > config.yaml
# 创建必要目录
mkdir skills logs reports chrome_user_data
# 复制一个基础Skill模板
openclaw skill new sales_check
步骤6:启动并验证服务
# 启动(后台运行,不阻塞CMD)
start /min cmd /c "venv\Scripts\activate.bat && openclaw start --config config.yaml"
# 等待10秒,检查端口
netstat -ano | findstr :8000 # 应看到LISTENING状态
# 检查日志是否有ERROR
more +100 logs\openclaw.log | findstr "ERROR"
步骤7:注册为Windows服务(实现7×24)
# 创建服务启动脚本 start_service.bat
echo @echo off > start_service.bat
echo venv\Scripts\activate.bat >> start_service.bat
echo openclaw start --config config.yaml >> start_service.bat
# 注册服务(使用前面创建的openclawsvc账户)
sc create OpenClawSvc binPath= "C:\openclaw\start_service.bat" start= auto obj= "openclawsvc" password= "P@ssw0rd123!"
sc description OpenClawSvc "OpenClaw AI Employee Service"
sc failure OpenClawSvc actions= restart/60000/restart/60000//60000 reset= 86400
# 启动服务
net start OpenClawSvc
实测数据:在一台i5-1135G7/16GB/512GB SSD的办公本上,从执行
sc start到OpenClaw API可响应,平均耗时4.2秒。服务启动后内存占用稳定在1.2GB,CPU空闲时<3%。
4.2 浏览器中继(Browser Relay)深度配置:让AI员工真正“看得见、点得着”
Browser Relay是OpenClaw区别于其他框架的核心能力——它让AI员工能像真人一样操作网页。但Windows环境下有3大雷区:
① Chromium沙箱冲突
Windows服务模式下,Chromium的沙箱机制会因权限不足崩溃。解决方案已在 config.yaml 中体现:
browser_relay:
disable_sandbox: true # 必须为true!
# 同时禁用GPU加速(办公机常无独显)
disable_gpu: true
# 启用无头模式(节省资源)
headless: true
② 用户数据目录(User Data Dir)隔离
若不指定 user_data_dir ,Chromium会尝试写入 C:\Users\XXX\AppData\Local\Google\Chrome\User Data ,而服务账户 openclawsvc 对此目录无写入权限,导致启动失败。
✅ 正确做法:在 config.yaml 中指定独立目录,并赋予权限:
mkdir C:\openclaw\chrome_user_data
icacls "C:\openclaw\chrome_user_data" /grant "openclawsvc:(OI)(CI)F" /T
③ 网页元素定位稳定性
Browser Relay用CSS Selector定位元素,但企业网页常动态生成class名(如 class="btn_abc123" )。我的经验是:
- 优先用
data-testid属性(要求前端在开发时加上); - 其次用XPath的文本匹配:
//button[contains(text(), '提交')]; - 最后才用CSS:
button[type='submit']。
以飞书登录页为例,Skill中这样写:
from openclaw.browser import BrowserRelay
br = BrowserRelay()
br.goto("https://open.feishu.cn")
# 等待登录按钮出现(显式等待,避免sleep硬编码)
br.wait_for_selector("button:has-text('密码登录')", timeout=10000)
br.click("button:has-text('密码登录')")
# 输入账号(用fill而非type,避免触发前端防爬)
br.fill('input[name="mobile"]', "13800138000")
br.fill('input[name="password"]', "P@ssw0rd")
br.click("button:has-text('登录')")
实操心得:我在
C:\openclaw\skills\common\browser_utils.py里封装了通用方法:def safe_click(br, selector, timeout=5000): try: br.wait_for_selector(selector, timeout=timeout) br.click(selector) return True except Exception as e: logger.warning(f"Click failed on {selector}: {e}") return False所有Skill调用
safe_click(br, "button:has-text('确认')"),失败时不抛异常,继续执行后续逻辑。
4.3 飞书集成实战:从事件订阅到自动回复
让AI员工接入飞书,不是配个Webhook那么简单。以下是生产环境完整链路:
① 飞书开放平台配置
- 创建自建应用 → 获取
app_id,app_secret; - 在“事件订阅”中启用:
im.message.receive_v1(接收消息)contact.user.updated_v3(用户
更多推荐


所有评论(0)