
1. Clawdbot 是什么把一个网页聊天框变成能自己干活的 AgentClawdbot 这个名字我最早是在技术社群里看到的乍一听还以为是某个新模型后来才发现它指的是一类基于浏览器自动化技术、把 Claude 网页版包装成可编程 Agent 的解决方案。圈子里习惯把这类方案统称为 Clawdbot核心思路就一句话打破网页只能手动聊这堵墙让 Claude 网页版可以被脚本驱使自动接收任务、自动推理、自动把结果写回文件或系统。这就是标题里破壁人的含义。这个方向对谁最有价值我总结下来是三类人。第一类是想快速验证 Agent 原型的人暂时没决定上不上 Claude API或者申请接口还在排队用 Clawdbot 接管网页版可以先跑通自动多轮任务的完整链路。第二类是做批量数据处理的人比如把一堆零散文本整理成结构化表格、逐条翻译、批量改写这类重复性工作交给 Clawdbot 非常合适。第三类是做自动化测试的工程师让 AI 充当测试设计和结果分析的大脑让脚本负责执行两者配合能省下大量人工。全文我会从设计思路讲起给出完整的环境搭建、核心实现、两个可以直接抄作业的实战案例以及我踩过的一堆坑。内容偏工程实践适合有一点前端或 Node.js 基础、同时想了解 Agent 自动化怎么落地的读者。如果你完全是新手也不用担心每一条命令、每一个参数我都会解释它到底在干什么按步骤操作就能跑起来。2. 动手前的设计思路为什么选浏览器接管这条路2.1 三条技术路线其实各有利弊要把 Claude 变成自动化 Agent市面上大体有三条路官方 API、浏览器自动化、浏览器插件。很多人一上来就纠结选哪个我的建议是先想清楚自己的场景。官方 API 最稳定、最规范返回的是 JSON 结构化数据适合生产环境。但它的劣势也很明显需要单独开通、按量计费还要处理模型名称、上下文窗口、并发配额这些细节。对只是想本地跑一个自动化脚本的人来说光申请和计费那套流程就够劝退的了。浏览器插件可以读取页面 DOM、向页面注入按钮实现半自动操作但插件受限于浏览器安全模型跨域请求、文件系统读写都很麻烦。真要拿它做深度 Agent 编排你会发现处处碰壁。Clawdbot 走的是浏览器自动化路线本质是用 Playwright 这类工具驱动一个真实浏览器像人一样操作网页。它不需要后端接口不需要单独申请密钥直接用你已有的 Claude 账号登录态就能干活。优点是既能看页面表现、又能拿到对话内容调试直观缺点是需要维护页面选择器、应对网页改版。这些代价在工程上是可控的后面我会详细讲怎么降低维护成本。2.2 Clawdbot 的三层架构设计我在实际搭建 Clawdbot 时把整个工程拆成了三层这样思路最清晰任务编排层、浏览器控制层、对话解析层。任务编排层负责接收外部指令。比如你丢给它一句话帮我把 data.csv 里每一行的产品名翻译成英文结果写到 out.txt这一层会把指令解析成 Claude 对话里的提示词同时维护一个待办队列记录哪些任务完成了、哪些失败了需要重试。浏览器控制层是核心。它用 Playwright 启动浏览器、打开 Claude 网页、定位输入框、发送消息、等待回复。所有操作都尽量模拟真实用户行为包括自然输入间隔、滚动页面降低被风控识别的概率。对话解析层负责把 Claude 网页端的回复从 DOM 里取出来清理成纯文本或者结构化数据再交给编排层做下一步判断。三层之间用 JSON 消息传递互不耦合。这样做的好处是后期如果决定切换到官方 API只需要替换浏览器控制层和对话解析层编排层几乎不用动。这套架构里最重要的一个原则是控制逻辑和提示词分离。Clawdbot 的代码里不应该写死任何业务提示词而是把提示词作为配置文件传入。换任务时只改配置不用动代码。我见过太多人把所有逻辑揉在一个文件里看起来省事后面维护起来非常痛苦。2.3 什么场景不适合用 Clawdbot边界要清楚在投入精力之前我得先泼一盆冷水。Clawdbot 不是万能的至少有四类场景我不建议用它。第一对稳定性和实时性要求极高的生产系统请直接走 API。浏览器自动化受页面加载速度、网络波动影响单次响应时间可能从几秒到几分钟不等没法做严格的 SLA 保障。第二需要大规模并发调用的场景开十几个浏览器窗口会非常消耗内存远不如 API 高效。第三对输出格式有严格 JSON Schema 要求的业务网页版回复的自由度太高解析成本不低。第四涉及敏感数据的任务要谨慎评估网页版的数据处理链路这个我后面专门用一节来讲。把边界想清楚你才不会在错误的地方硬生生套用一个工具。Clawdbot 真正擅长的是批量的、确定性的、可重试的把 A 转成 B这类流程。3. 环境准备把 Clawdbot 跑起来的最短路径3.1 安装 Node.js 与 PlaywrightClawdbot 我用的是 Node.js 加 Playwright 的组合这是目前浏览器自动化生态最成熟、资料最多的方案。安装步骤一共四步到 Node.js 官网下载 LTS 版本装完在终端执行node -v确认版本号。我建议用最新的 LTS不要用尝鲜版避免一些依赖兼容性问题。新建一个项目目录执行npm init -y初始化 package.json。安装 Playwright 驱动库npm install playwright。下载浏览器内核npx playwright install chromium。这里我要强调一个很多人第一次搞错的点npm install playwright只是装了驱动库真正运行的浏览器内核需要单独下载。如果跳过第四步运行时大概率会报browserType.launch: Executable doesnt exist之类的错误到时候别慌回去执行一下安装命令就行。装 Playwright 时你可能会顺手想装 Claude Code然后遇到一个非常经典的报错claude : 无法将claude项识别为 cmdlet、函数、脚本文件或可运行程序的名称。这个报错和 Clawdbot 本体无关本质是 Claude Code 的安装目录没有写进系统 PATH 环境变量。解决方案是把%USERPROFILE%\.local\bin添加到系统环境变量里然后重新打开终端。macOS 和 Linux 下也有类似报错处理方式一样都是 PATH 的问题。3.2 登录态持久化告别每次扫码跑过浏览器自动化的人都知道最大的痛点是每次启动浏览器都要重新登录。Clawdbot 用了 Playwright 的userDataDir机制来解决这个问题。userDataDir的作用就是给浏览器指定一个本地目录作为它的用户数据目录。第一次运行脚本时浏览器会在这个目录里写入 cookie、localStorage、IndexedDB 等所有持久化数据。下次再用同一个目录启动登录态就还在。我推荐userDataDir而不是storageState原因是 Claude 网页版有些状态存在 IndexedDB 里storageState只保存 cookie 和 localStorage不一定全覆盖。实测下来userDataDir的兼容性更好。使用方法很简单启动浏览器时传入一个目录参数const context await browser.newContext({ userDataDir: ./claude-profile, });首次执行时脚本可以只负责打开浏览器然后暂停你手动登录一次账号。之后中断脚本也没关系登录态已经存进目录了下次运行直接可用。提示userDataDir目录里存的就是你的登录凭证相当于一把钥匙。千万不要把这个目录提交到 Git 仓库也不要随意分享给别人。建议在 .gitignore 里加上它。3.3 验证环境跑通第一个你好任务环境装好之后我们先跑一个最小任务验证整体链路是否通畅。新建一个test.js文件写下面这段代码const { chromium } require(playwright); (async () { const browser await chromium.launch({ headless: false }); const context await browser.newContext({ userDataDir: ./claude-profile }); const page await context.newPage(); await page.goto(https://claude.ai/new, { waitUntil: domcontentloaded }); await page.waitForTimeout(3000); const input await page.$(div[contenteditabletrue]); await input.click(); await page.keyboard.type(你好请用一句话介绍你自己。, { delay: 30 }); await page.keyboard.press(Enter); await page.waitForTimeout(20000); await browser.close(); })();这段代码的逻辑是启动浏览器、打开 Claude 新建对话页、定位输入框、输入一句话、按回车发送、等 20 秒后关闭浏览器。如果你在浏览器窗口里看到了 Claude 的回复说明整条链路通了接下来就可以做真正的自动化了。headless: false是为了让你看得到浏览器运行过程方便排查问题。如果你已经很有把握可以改成headless: true让它后台静默运行这样不占桌面窗口适合部署在服务器上跑批处理任务。4. 核心实现从聊天框到可编程接口4.1 定位输入框与发送按钮Clawdbot 的核心第一步是找到页面上在哪里输入和点哪里发送。这一步依赖 DOM 选择器。Claude 网页版的界面会不定期改版所以我在代码里采用多选择器回退策略先尝试一组选择器失败就挨个换备选。我平时维护的选择器列表长这样const SELECTORS { input: [ div.ProseMirror[contenteditabletrue], div[contenteditabletrue], textarea, ], send: [ button[aria-label*Send], button[aria-label*发送], ], };定位逻辑是遍历这个数组第一个能匹配到的就用它。为什么不用一个固定选择器因为网页改版时类名可能变但contenteditable这种通用属性往往还在。多保留几个备选改版时脚本存活的时间就会长一些。定位到输入框之后模拟输入要注意一点尽量用page.keyboard.type(text, { delay: 30 })而不是直接给 DOM 赋值。Claude 网页版的输入框是富文本编辑器用input.value直接赋值可能不会触发框架内部的状态更新导致发送按钮不可点击。用键盘事件模拟真实输入最稳妥。4.2 等待回复与内容提取发送消息之后Clawdbot 不能立刻去抓内容因为模型生成需要时间。怎么判断生成完了我用的策略是轮询等待发送按钮状态Claude 网页版在生成回复时发送按钮会变成暂停按钮生成完成后再恢复。观察这个状态变化就能判断回复是否结束。async function waitForReply(page) { await page.waitForFunction(() { const stopBtn document.querySelector( button[aria-label*Stop], button[aria-label*暂停] ); if (stopBtn) return false; // 还在生成 const sendBtn document.querySelector( button[aria-label*Send], button[aria-label*发送] ); return sendBtn ! null; // 发送按钮恢复生成结束 }, null, { timeout: 180000 }); }这个轮询的超时时间我设的是 180 秒如果你的任务涉及长文本生成可以适当加大。但我不建议无脑加大因为超时时间越长脚本卡死的风险越大。更好的做法是配合心跳日志每 10 秒打印一次当前等待状态这样出问题时你能知道它卡在哪一步。内容提取方面我踩过一个坑直接用innerText会把按钮文字、复制图标、时间戳这些杂项一起带出来。我的做法是先克隆节点把button、svg、style这些元素删掉再取文本async function getLastMessage(page) { return page.evaluate(() { const blocks document.querySelectorAll( [data-testiduser-message], [data-testidassistant-message] ); if (!blocks.length) return ; const last blocks[blocks.length - 1]; const clone last.cloneNode(true); clone.querySelectorAll(button, svg, style, script).forEach((el) el.remove()); return clone.innerText.trim(); }); }如果你需要保留 Markdown 结构可以读innerHTML再转换但转出来的东西通常不如innerText直观。我的经验是Clawdbot 处理的大多数任务只需要纯文本innerText足够用了。4.3 任务循环与上下文管理Clawdbot 和普通脚本最大的区别在于它能根据任务描述自主决定下一步做什么。我把这个逻辑封装成一个简单的任务循环从外部输入读取任务描述。组装提示词发送给 Claude。等待回复提取文本。判断任务是否完成。如果没完成把当前结果作为上下文的一部分继续下一轮。完成后输出最终结果。多轮任务对上下文长度消耗很快这是很多人忽略的坑。Claude 网页版的上下文窗口有限任务越长早期信息越容易被挤掉。我的做法是每轮对话结束后让 Claude 输出一段进度摘要下一轮把摘要作为上下文起点而不是把完整的历史对话全部带进去。这个摘要接力的技巧在长任务里非常管用能让上下文利用率提高不少。另外为了让任务可追溯我给每一轮任务都加了编号比如[TASK-20240521-001]。注入页面后后续提取时就能过滤出属于当前任务的消息不会被之前的历史对话干扰。4.4 提示词工程让网页版人格化执行任务Clawdbot 能不能干好活一半取决于页面操作另一半取决于提示词。这里分享几个我调出来的有用模式。第一明确角色和输出格式。比如你要提取信息提示词里就要写死输出格式而不是让 Claude 自由发挥。不规定格式的话每轮输出的字段名、分隔符都会不一样后续解析会非常痛苦。哪怕格式简单一点比如字段名值换行排列也比没有格式强。第二用步骤化指令拆分复杂任务。比如让它处理一份报告不要直接说分析这份报告而是说第一步总结核心观点第二步列出三个风险点第三步给出改进建议。Claude 网页版对分步指令的执行效果明显好于一个大而化之的问题。第三加入自我校验指令。在任务的最后加一句请检查你的输出是否满足需求如果不满足请修正。这一招看起来简单但实测能明显减少输出内容缺胳膊少腿的情况。Claude 网页版在收到这类指令时会真的进入一个自我审视的状态。5. 实战案例两个开箱即用的 Clawdbot 应用5.1 案例一批量内容整理自动生成结构化表格第一个案例是批量内容整理。假设你手头有几百条产品描述需要提取名称、目标人群、核心卖点并整理成表格。手动在网页里一条条粘贴特别痛苦用 Clawdbot 可以这样设计。提示词模板放在配置文件里维护module.exports { taskPrompt: (content) 你是一个信息提取助手。请从下面的产品描述中提取信息严格按以下格式输出 产品名 目标人群 核心卖点 产品描述 ${content} , };然后在任务循环里逐条喂给 Claude把返回结果按字段拆分用fs.appendFileSync追加写进 CSV 文件。整个过程不需要任何 API 调用只要网页端登录一次剩下的全部自动跑。我实测下来100 条文本大概 15 到 20 分钟能跑完中途偶尔断连接上重试逻辑就行。这里有一个关键细节每轮任务之间一定要加随机延迟比如await page.waitForTimeout(3000 Math.random() * 5000)。原因有两个一是模拟真人操作间隔降低被风控识别的概率二是给网页端留出足够的空闲时间避免连续请求导致页面卡死。还有一个容易忽略的点是 CSV 转义。如果提取出来的文本里包含逗号、换行符、引号直接拼进 CSV 会导致格式错乱。我的做法是写一个转义函数把所有字段值用双引号包起来内部的双引号再翻倍。这一步虽然不起眼但能帮你省去后期清洗数据的麻烦。5.2 案例二自动化测试助手让 AI 当测试大脑第二个案例和自动化测试相关也是我很看好的方向。很多团队在纠结要不要上 AI 自动化测试但传统测试框架维护成本高AI 生成的用例又不稳定。Clawdbot 提供了一个折中方案让 Claude 网页版充当测试设计和结果分析的大脑自动化脚本负责执行。具体来说我先让 Clawdbot 读取一段需求描述让 Claude 输出测试点列表。这些测试点通常是自然语言比如点击登录按钮后检查错误提示是否出现。然后我把每个测试点转换成 Playwright 脚本去真实页面上跑。跑完之后再把执行日志粘贴给 Claude让它判断哪些测试点通过、哪些失败、失败原因可能是什么。这样设计、执行、分析三段式里有两段是 AI 在干活测试工程师的负担大大降低。实际执行时要注意一个问题Claude 生成的测试点可能过于理想化比如元素定位写得和真实页面对不上。我通常会在把它交给 Playwright 之前加一道校验选择器是否存在的步骤存在才执行不存在的先跳过并记录原因。这样既保留了 AI 的效率又把不稳定因素控制在可接受范围内。这个案例的启发是Clawdbot 不一定要直接操作浏览器本身它也可以作为大脑去驱动其他自动化框架。把 AI 的生成能力和你现有的测试工具链结合往往比纯粹让 AI 做一切更可靠。5.3 断点续跑与任务日志让长任务可被救回跑批量任务时最怕的就是跑到一半脚本崩了然后一切重来。所以我从第一天起就给 Clawdbot 加了断点续跑能力。做法是在任务循环里维护一个progress.json文件记录当前处理到第几条、成功和失败的列表。每次处理完一条就更新一次。脚本崩溃后重启先读这个文件跳过已经处理完的条目从断点继续执行。任务日志同样重要。我把每轮对话的输入输出、耗时、是否出错都追加写入一个run.log文件。出问题时你能在 5 分钟内定位到是哪一轮、哪条数据、哪个环节出了岔子而不是对着黑框干瞪眼。这个习惯让我省了无数时间强烈建议你也养成。6. 高频问题排查与避坑实录6.1 选择器大面积失效怎么办Claude 网页版改版是所有 Clawdbot 使用者最大的痛点。我遇到过一次头天晚上脚本还好好的第二天一早全部报错。排查方式分三步第一步打开浏览器开发者工具手动确认当前页面的真实选择器。第二步对比代码里的选择器列表看是类名变了、属性变了还是 DOM 结构整个变了。第三步更新选择器列表并在代码里加日志打印当前实际使用的选择器方便下次快速定位。为了避免每次改版都全盘重写我在代码里维护了一个选择器版本号常量每次验证通过后把版本号和数据记录在注释里。下次改版时看版本号就知道上次是什么时候验证的能快速缩小排查范围。还有一个技巧尽量选择语义化的选择器而不是纯视觉类名。比如button[aria-label*Send]这类基于无障碍属性的选择器通常比基于 hash 类名的稳定性更高因为无障碍属性是给辅助技术用的前端改版时很少会改动它们。6.2 登录失效、验证码与限流userDataDir虽然能持久化登录但账号异地登录、长时间不使用、频繁自动化操作都可能触发重新验证。这个问题无法从代码层面完全绕过只能从使用习惯上减少触发频率。我的经验是控制自动化频率单次任务不要连续几十轮不停交互中途随机暂停几秒到十几秒。另外我在 Clawdbot 里加了一个人工介入模式当检测到页面出现登录二维码或验证码输入框时暂停任务并提示操作者扫码扫完自动继续。这个模式比反复重试要稳得多因为自动化脚本无论如何模拟都不可能完全替代真人扫码。限流方面也有个典型表现页面打开正常但发送消息后迟迟没有回复或者直接报错。遇到这种情况第一反应不是改代码而是先停下来让账号休息一段时间再继续。6.3 回复内容被截断或输出不完整模型回复较长时网页版可能出现继续生成或分页的情况。Clawdbot 如果只在发送按钮恢复后抓一次内容很可能只抓到前半段。我的处理方式是抓取内容后检查文本末尾如果出现明显的未完成信号比如结尾逻辑中断、缺少结束标点就滚动页面到回复底部触发继续生成按钮或者给 Claude 发一条请继续。这里要小心发送请继续会消耗一轮上下文频繁触发会很快把上下文占满。所以更推荐用滚动触发的方式。真要说性价比还是建议在任务设计时就把输出结果控制在一个合理长度内让 Claude 分多个批次输出而不是一次生成超长内容。提示词里可以加一句如果内容超过 800 字请分两次输出实测有效。6.4 与 Claude Code 混用的困惑最近不少读者在 Clawdbot 的讨论里提到了 Claude Code我多说两句。Claude Code 是 Anthropic 推出的命令行编程助手和 Clawdbot 的定位不一样前者是在本地终端里帮你写代码后者是把网页版变成自动化执行接口。两者的安装错误经常被混在一起讨论比如前面提到的claude 无法识别这类报错其实是 Claude Code 的 PATH 问题。如果你只玩 Clawdbot、不装 Claude Code这个报错完全不用管。另一个容易踩的坑是模型名不匹配。有朋友把第三方模型配置写进 Claude Code 的配置文件启动时报deepseek-v4-pro is not a model this version of claude code recognizes。这类报错和 Clawdbot 无关是配置文件的模型枚举和程序版本对不上。解决方式是更新 Claude Code 到最新版或者把模型名改成官方支持的枚举值。Clawdbot 走的是网页端不存在模型名枚举问题这反而是它的一个优势。6.5 Credits 与任务预算控制最后说一个和成本相关的话题。网页版虽然是订阅制但部分功能或新增模型可能单独消耗 credits。Clawdbot 长时间跑任务等于在持续消耗你的订阅额度。credits 在 AI 语境里的含义简单说就是额度单位模型处理字符数越多消耗越多。因此我在脚本里加了一个任务预算机制每轮对话记录大概的消耗情况累计到设定值就自动停止。具体实现是在任务循环里维护一个计数器每处理完一条任务就累加一次估算值达到阈值后停止发送新任务并输出已达预算上限的日志。这样做能避免一次失控的循环把额度耗光尤其是当脚本因为页面异常而陷入死循环时预算机制就是最后一道保险。7. 使用边界与个人建议讲到这里核心内容基本都覆盖了。最后我想认真聊一下使用边界这部分不是技术但比技术更重要。Clawdbot 本质上是在模拟真人操作网页这意味着它绕过了 API 的规范化通道。在使用时至少要注意三件事。第一遵守网站的条款与合理使用政策不要用它做批量注册、刷量、恶意抓取之类的动作这类行为既消耗公共资源也可能给你的账号带来风险。第二注意数据安全不要把个人隐私、商业机密等敏感信息发给网页版处理。网页版的对话数据会进入模型服务商的系统敏感数据一旦提交就无法收回。第三控制自动化强度给自己留出合理的使用节奏不要极端化地高频调用。我个人的态度是Clawdbot 是一个学习工具和效率工具适合做原型验证、个人自动化、小批量处理。它不该被用来做任何灰色操作。把这些边界想清楚你才能在这个工具上走得更远。说实话Clawdbot 这类方案并不适合所有场景。如果你有正式的 API 预算或者你的业务对稳定性要求极高那还是老老实实走官方接口。但如果你和我一样经常需要在本地快速验证一个 AI 自动化想法或者在接口申请下来之前先跑通完整流程Clawdbot 这套浏览器接管的思路真的能帮你省下大量等待成本。我自己的使用习惯是把 Clawdbot 当成一个快速原型加批量小任务执行器凡是超过 30 步、需要严格容错的任务我都不会让它干。它擅长的是一遍遍执行那些把 A 转成 B、再转成 C的确定性流程。这个边界想清楚了用它做事的体验会非常顺。最后再分享一个小技巧无论脚本多简单都记得把每轮任务的输入输出存一份日志文件。出问题时你能在五分钟内定位到是哪一轮、哪条数据出了问题这比任何花哨的架构都实在。