OpenClaw 除了操作计算机、调用本地工具、利用模型内置的"记忆",从网上查资源其实是 agent 非常核心的一项工作能力。很多时候,问题不是"会不会推理",而是"能不能找到最新、准确、可用的资料"。
OpenClaw 安装完成后,理论上已经具备联网能力,但如果你真想让它"上网干活",还需要额外做一些配置。不然它更多只是一个会思考、但信息来源受限的本地劳动力。
本文就围绕这一点,梳理一下在当前阶段,OpenClaw 想要访问互联网的几种可行方式,以及各自的配置方法和坑点。不讨论哪种最优,只尽量把路讲清楚,方便你按自己的环境和偏好来选。
1 自带的上网功能
在 OpenClaw 里,"上网"其实并不是一个单一的问题,大致可以分成以下几个场景:一类是已知目标的接口调用。比如查天气、查汇率、查某个服务的状态,这类场景往往已经知道具体的网站或 API,只需要把参数(位置、时间、代码等)通过 curl 或 SDK 传进去,就能直接拿到结果。这种更像是调用一个远程函数,很多 skill 本身就已经封装好了,基本不需要额外配置,上来就能用。
更常见、也更麻烦的,是不确定目标的信息获取。比如"搜一下某个问题""找一篇最近的文档""看看别人是怎么配置的",本质上接近人类用百度 / Google 搜索;再往下一步,则是需要在网页之间跳转、点击、输入内容,完成多步操作,这时就已经非常接近"让 agent 像人一样用浏览器"。
OpenClaw 自带的联网能力,主要覆盖的是前一种复杂度较低的搜索与抓取场景:通过搜索引擎拿链接,再把页面内容读下来。更偏向"读资料",而不是"操作网页"。下面先从这套内置能力说起。
联网搜索是通过内置工具 web_search 找链接 → web_fetch 读内容 来完成的。
openclaw 默认的联网功能使用 web_search实现, 具体来说,它并非百度或 Google,而是 Brave 的搜索服务(Brave 本身也是一个搜索引擎,有 Web 界面,同时支持 API)。它支持地区定向和语言过滤,返回标题、URL 和片段。需要设置 API Key。
Brave Search 有免费 tier:每月 2000 次查询免费,注册地址:brave.com/search/api,需要银行卡,我的国内招行信用卡不行(我不确定别人有没有这个问题),有能用的可以试试。获取 API Key 之后:
bash
openclaw configure --section web
然后输入 API Key。
另一个相关工具 web_fetch 则是直接请求目标 URL,把 HTML 转成 markdown/text------不经过搜索引擎,是直接抓取页面内容。
2 使用浏览器
因为我无法使用 Brave,所以直接让 OpenClaw 控制浏览器搜索。具体参数见官方文档的 browser 部分,例如显示当前状态:
bash
node dist/index.js browser status
下面介绍了两种方法,一种更简单,一种更合理,先别着急安装,看完两种方法之后,选择更适合你的方法。
2.1 方法一
使用 GitHub Docker 官方文档中最简单的方法,直接在 Gateway image 里安装 headless 的 browser。
bash
docker exec -u root -it $CONTAINER_ID bash # 以 root 身份登录
node /app/node_modules/playwright-core/cli.js install chromium
node /app/node_modules/playwright-core/cli.js install-deps chromium
find /app -name "chromium" # 查看安装在哪儿了,试一下能否正常运行
这样下载后安装的数据大部分在 /home/node/.cache/ms-playwright 下,约 600MB+,这部分可以在镜像之外持久化,install-deps 相关的内容很多需要安装到系统目录,想要保存则需要 commit Docker 镜像,后面再升级也比较麻烦。
然后,通过 Web 界面配置,指向本地已安装的浏览器。
在 WebUI 中:Setting->Config->Browser->Executable Path,把上面找到的可执行程序路径填入。设置之后,openclaw.json 中的 browser 部分会被自动填充为:
bash
"browser": {
"executablePath": "/home/node/.cache/ms-playwright/chromium_headless_shell-1208/chrome-headless-shell-linux64/chrome-headless-shell"
},
2.2 方法二
在 Linux+Docker 环境下为 OpenClaw 配置浏览器,标准的实现架构是运行两个独立的 Docker 容器,让它们互联。
具体说明在 Docker 文档中的 Sandbox browser image:https://github.com/openclaw/openclaw/blob/main/docs/install/docker.md
构建沙盒浏览器镜像:
bash
. scripts/sandbox-browser-setup.sh
docker run --rm -d -p 9222:9222 openclaw-sandbox-browser:bookworm-slim # 运行
curl http://localhost:9222/json/version # 测试一下
镜像构建完成后约 1.02GB。
然后在 openclaw.json 中手动修改(目前 Web UI 尚不支持修改这些详细配置):
bash
{
"browser": {
"enabled": true,
"attachOnly": true,
"defaultProfile": "remote",
"profiles": {
"remote": {
"cdpUrl": "http://你的IP:9222",
"color": "#FF4500"
}
}
}
}
3 问题与解决
3.1 总提示 token 不匹配
查看配置文件 .env、openclaw.json,以及登录 Web UI 时在浏览器中输入的 token 是否一致。
3.2 cdpHost: 127.0.0.1
Gateway 容器连接浏览器容器时,浏览器返回的 cdpHost 为其 Docker 内部的 IP:127.0.0.1;而对于 Gateway 来说 127.0.0.1 为其内部 IP。因此 CDP 无法连接成功。这可能是作者基于安全因素考试------不允许非本地的程序使用浏览器工具,但在双docker模型下确实没法用。
主要原因是浏览器的镜像 openclaw-sandbox-browser:bookworm-slim,它启动的程序是 openclaw-sandbox-browser,其中写死了 --remote-debugging-address=127.0.0.1,使得在别的 Docker 内部无法调用 CDP。
修改方法有两种,一种是修改源码中的文件 scripts/sandbox-browser-entrypoint.sh,将 127.0.0.1 改为 0.0.0.0,然后重新构建镜像。另一种是修改 docker-compose.yml,将端口映射的 port 部分改为:network_mode: host,使 Gateway 容器与宿主机使用同一网络。