ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

OpenClaw 网络工具详解:从 web_search 到 Playwright 自动化的完整指南

OpenClaw 网络工具详解:从 web_search 到 Playwright 自动化的完整指南 1. 当 AI 助手需要“上网”OpenClaw 网络工具链到底解决什么问题OpenClaw 的网络工具链说白了就是让 AI 助手从“只会聊天”变成“能自己查资料、读网页、点按钮”的那套能力。它主要包含三个工具web_search 负责搜索、web_fetch 负责抓取静态网页正文、browser底层是 Playwright负责跑真实浏览器做交互。适合谁适合那些想让 AI 自动做资料检索、竞品监控、文档抓取、表单填写、登录后数据采集的开发者。你不需要自己从零封装 HTTP 客户端和浏览器驱动OpenClaw 已经把调用路径、参数、错误重试都设计好了。但实际落地时很多人卡在同一个地方工具能跑但联网请求不稳定或者 Key 管理混乱搜索、抓取、浏览器三条链路各配一套凭证排查起来非常痛苦。我这边的做法是把 OpenClaw 的网络工具统一走一个 API 通道用同一套 Key 管理搜索、抓取和模型调用减少配置分叉。下面我会从 config.toml 骨架开始一步步给出可复制的配置、验证命令和排障清单确保 web_search、web_fetch、browser 三条路径都能跑通。2. 前置准备用 TaoToken 统一 Key 与 API 通道在配置 OpenClaw 之前先把“通道”这件事定下来。OpenClaw 的网络工具本身负责发起请求但如果你希望搜索、抓取、以及后续的模型推理都走同一个入口可以用 TaoToken 作为统一 API 通道。它的官网是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end API 地址是 https://taotoken.net/api 注意 API 地址不带 UTM 参数。你需要先拿到一个 API Key。操作路径是登录后进入控制台在 API Keys 页面创建一个新 Key。控制台入口在这里https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 。创建时建议按用途命名比如 openclaw-net方便后面区分是网络工具专用还是模型调用专用。拿到 Key 之后不要直接硬编码在脚本里。推荐放到环境变量OpenClaw 的 config.toml 里用占位符引用。这样你在本地、CI、服务器上可以用不同的 Key而配置文件不用改。如果你后面还要接 Claude Code 或 Anthropic 风格的调用可以参考这份文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面把接入方式和参数说明写得比较清楚。注意API Key 属于敏感凭证不要提交到 Git 仓库。建议用 .env 或系统环境变量管理config.toml 里只写 ${TAOTOKEN_API_KEY} 这种引用形式。3. 可复制配置config.toml 骨架与三条工具链参数下面这份 config.toml 骨架覆盖了 web_search、web_fetch、browser 三条链路。你可以直接复制后按需改。核心思路是网络工具的出口统一指向 TaoToken 的 API 地址Key 从环境变量读取超时和重试参数分开设置避免一个工具拖垮整条链路。# config.toml - OpenClaw 网络工具链配置骨架 [api] # 统一 API 通道搜索/抓取/模型调用共用 base_url https://taotoken.net/api api_key ${TAOTOKEN_API_KEY} timeout_seconds 60 max_retries 3 retry_backoff 1.5 # 指数退避基数 [web_search] enabled true provider brave default_count 8 default_country CN default_search_lang zh default_ui_lang zh-CN default_freshness pw # pd一天, pw一周, pm一月, py一年 connect_timeout 10 read_timeout 30 [web_fetch] enabled true extract_mode markdown # markdown 或 text max_chars 15000 follow_redirects true connect_timeout 10 read_timeout 45 user_agent Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36 [browser] enabled true engine playwright headless true mode sandbox # sandbox 或 host page_load_timeout 45000 action_timeout 15000 max_sessions 3 cleanup_after_idle 120 # 秒空闲后自动关闭实例几个参数值得单独说。web_search 的 freshness 用 pd/pw/pm/py 控制时间范围做资讯类任务时设成 pd 能过滤掉大量旧内容。web_fetch 的 max_chars 建议不要设太大15000 左右既能保留正文又不会把 token 撑爆。browser 的 mode 选 sandbox 更安全处理不可信页面时优先用它如果任务需要访问本地资源再切到 host。环境变量这样设置export TAOTOKEN_API_KEY你的KeyWindows PowerShell 用$env:TAOTOKEN_API_KEY你的Key4. 逐步验证确认搜索、抓取、浏览器自动化均可用配置写完后不要直接上复杂任务按“搜索 → 抓取 → 浏览器”的顺序逐条验证。每条验证都给出预期结果方便你判断哪一环出了问题。4.1 验证 web_search先跑一个最小搜索请求确认搜索链路通。下面这段 Python 用 requests 模拟 OpenClaw 的搜索调用路径import os import requests api_key os.environ[TAOTOKEN_API_KEY] url https://taotoken.net/api/v1/search payload { query: OpenClaw web_fetch 用法, count: 5, country: CN, search_lang: zh, freshness: pm } headers { Authorization: fBearer {api_key}, Content-Type: application/json } resp requests.post(url, jsonpayload, headersheaders, timeout30) print(status:, resp.status_code) data resp.json() for item in data.get(results, []): print(-, item.get(title), item.get(url))预期结果是 status 返回 200并且打印出 5 条带标题和 URL 的结果。如果返回 401检查 Key 是否正确返回 429说明触发了限流把 count 调小或加延迟。4.2 验证 web_fetch搜索通了之后拿上一步结果里的任意 URL 做抓取验证import os import requests api_key os.environ[TAOTOKEN_API_KEY] url https://taotoken.net/api/v1/fetch payload { url: https://example.com/article, extractMode: markdown, maxChars: 8000 } headers { Authorization: fBearer {api_key}, Content-Type: application/json } resp requests.post(url, jsonpayload, headersheaders, timeout45) print(status:, resp.status_code) content resp.json().get(content, ) print(length:, len(content)) print(content[:300])预期结果是 status 200content 长度大于 0并且前 300 字是网页正文而不是导航栏。如果 content 为空可能是目标页面是动态渲染的需要改用 browser 工具。4.3 验证 browser / Playwright浏览器自动化验证稍微重一点先确认浏览器实例能启动、能导航、能取快照import os import requests api_key os.environ[TAOTOKEN_API_KEY] base https://taotoken.net/api/v1/browser headers { Authorization: fBearer {api_key}, Content-Type: application/json } # 1. 启动会话 start requests.post(f{base}/start, json{headless: True}, headersheaders, timeout30) session_id start.json()[sessionId] print(session:, session_id) # 2. 导航 nav requests.post(f{base}/navigate, json{ sessionId: session_id, targetUrl: https://example.com }, headersheaders, timeout45) print(navigate status:, nav.status_code) # 3. 取快照 snap requests.post(f{base}/snapshot, json{ sessionId: session_id, refs: aria }, headersheaders, timeout30) print(snapshot keys:, list(snap.json().keys())) # 4. 关闭会话 stop requests.post(f{base}/stop, json{sessionId: session_id}, headersheaders, timeout30) print(stop status:, stop.status_code)预期结果是四步都返回 200snapshot 里能看到页面结构信息。如果 start 就失败检查 Playwright 是否安装、浏览器内核是否下载完整。如果 navigate 超时把 page_load_timeout 调大或者确认目标站点在当前网络环境下可访问。5. 本篇常见错排查从 401 到浏览器超时实际跑的时候错误基本集中在几类。下面按现象、原因、处理方式列出来方便你对照。现象可能原因处理方式401 UnauthorizedKey 未设置或写错检查环境变量 TAOTOKEN_API_KEY确认没有多余空格403 Forbidden请求头被识别为脚本设置真实 User-Agent补全 Accept-Language429 Too Many Requests请求频率过高降低 count请求间加 1-2 秒延迟启用退避重试web_fetch 返回空页面是 JS 动态渲染改用 browser 工具或检查 extractMode 是否合适browser start 失败Playwright 内核未安装执行 playwright install确认版本匹配navigate 超时页面资源加载慢调大 page_load_timeout或拦截图片/广告资源snapshot 无元素页面尚未加载完在 snapshot 前加 wait 操作等待关键元素出现会话泄漏异常时未关闭实例用 try-finally 确保 stop 被调用设置 cleanup_after_idle其中“会话泄漏”是最容易被忽略的。browser 实例是重量级资源如果任务抛异常后没有关闭跑几次就会把内存吃满。建议所有 browser 调用都包在 try-finally 里或者用 OpenClaw 的 cleanup_after_idle 自动回收。另一个高频坑是 web_fetch 和 browser 的选型。很多人图省事所有页面都用 browser结果速度慢、资源占用高。正确做法是静态页面优先 web_fetch只有确认需要 JS 渲染或交互时才切到 browser。判断方法很简单用 web_fetch 抓一次如果正文长度明显偏短或为空再换 browser。6. 把三条链路串起来一个可运行的聚合流程单条验证通过后把它们串成一个最小可用流程搜索关键词 → 抓取正文 → 对动态页面用 browser 兜底。下面这段代码可以直接跑import os import requests API https://taotoken.net/api KEY os.environ[TAOTOKEN_API_KEY] HEADERS {Authorization: fBearer {KEY}, Content-Type: application/json} def search(query, count5): r requests.post(f{API}/v1/search, json{ query: query, count: count, country: CN, search_lang: zh, freshness: pw }, headersHEADERS, timeout30) return r.json().get(results, []) def fetch(url): r requests.post(f{API}/v1/fetch, json{ url: url, extractMode: markdown, maxChars: 12000 }, headersHEADERS, timeout45) return r.json().get(content, ) def fetch_with_browser(url): start requests.post(f{API}/v1/browser/start, json{headless: True}, headersHEADERS, timeout30) sid start.json()[sessionId] try: requests.post(f{API}/v1/browser/navigate, json{sessionId: sid, targetUrl: url}, headersHEADERS, timeout45) snap requests.post(f{API}/v1/browser/snapshot, json{sessionId: sid, refs: aria}, headersHEADERS, timeout30) return snap.json().get(content, ) finally: requests.post(f{API}/v1/browser/stop, json{sessionId: sid}, headersHEADERS, timeout30) def run(keyword): results search(keyword) for item in results: url item[url] content fetch(url) if len(content) 500: content fetch_with_browser(url) print(f{item[title]} - {len(content)} chars) run(OpenClaw Playwright 自动化)这段流程的关键点是先用 web_fetch 低成本抓取内容过短时自动降级到 browser。这样既保证了覆盖率又不会让所有请求都走重资源通道。跑通之后你可以把结果存到本地文件或数据库做后续分析。如果你后面要做长期编码任务或 Agent 类应用建议把模型调用也统一到同一个通道用 Coding Plan 管理额度会更省心https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。需要单独调试模型对话时用模型对话入口https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 。Key 管理仍然在 API Keys 页面https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。最后留一个我踩过的坑browser 的 wait 操作不要用固定 sleep 代替。固定等待要么不够、要么浪费正确做法是等具体元素出现或等网络空闲。OpenClaw 的 act 支持 wait 条件把条件写准自动化成功率会明显提升。
返回列表