1. 先搞清楚 Openclaw 用 CDP 问豆包到底在做什么
Openclaw 通过 CDP 对接 Chrome 实现浏览器自动化,本质是让一个外部程序直接跟浏览器内核对话,而不是靠插件在中间传话。你给小龙虾发一句“问下豆包,我是AI还是人类”,它要完成的事情拆开看是四步:连上浏览器、打开豆包页面、把问题填进输入框并发送、把豆包的回答读回来。这四步里,第一步最容易卡住,因为 CDP 的连接方式在 2026.3.23+ 版本换成了 WebSocket 直连内核,端口发现和会话建立的细节跟旧扩展模式完全不同。
我先把这条链路讲清楚,再给你能直接复制的配置。CDP 全称 Chrome DevTools Protocol,Chrome 自己调试页面用的就是它。你打开开发者工具时,工具和浏览器之间走的就是这套协议。Openclaw 现在直接复用这套协议,等于拿到了浏览器的“原生控制权”。旧模式像你拿对讲机指挥一个坐在浏览器旁边的助手,助手再去点按钮;新模式是你直接接上了浏览器的控制电路,点哪个按钮、读哪块内容都是你自己来。稳定性差别就在这里,插件崩了旧模式就断,CDP 只要浏览器进程在,连接就在。
这个场景适合谁?如果你只是想让 Agent 自动打开网页截个图,旧模式够用。但你要做的是“接管已登录会话去问豆包”这种操作,就必须用 CDP,因为豆包页面可能需要登录态,新开的干净窗口没有你的 Cookie,问出来的结果和你在日常浏览器里看到的不是一回事。2026.3.23+ 版本把 existing-session 接管模式做稳了,Mac 上反复弹授权窗的 bug 也修了,所以现在跑这条链路时机正好。
版本门槛要记牢:Chrome 或 Brave 必须 >= 144。低于这个版本,CDP 的某些域不开放,Openclaw 启动时会直接报协议不匹配。你可以先用google-chrome --version确认,Brave 用户用brave-browser --version。我实测下来,144 以下的版本连transport: cdp这个状态都出不来,会一直停在扩展中继模式。
还有一个概念要分清:Openclaw 自带的 openclaw profile 和你日常用的 user profile 是两套隔离环境。前者是干净的,不带你日常的 Cookie 和缓存,适合做爬虫和一次性任务;后者是接管模式,读的是你日常浏览器的登录态,适合操作已登录的网页。问豆包这个场景,如果你日常浏览器里已经登录过豆包,用 user profile 最省事,不用重新扫码。下面第二节先把 TaoToken 的接入前置讲清楚,因为 Agent 的模型调用要走它。
2. TaoToken 前置:给 Openclaw 的 Agent 接上模型能力
Openclaw 本身是个自动化框架,它决定“点哪里、读什么”,但“理解豆包回答了什么、下一步该干嘛”这部分要靠模型。所以你得先给 Openclaw 配一个能用的模型入口。TaoToken 在这里的角色是提供统一的 API 接入,你拿到 Key 和 Base URL 之后,Openclaw 的 Agent 就能通过它调用模型来完成页面理解和决策。
先说清楚要准备什么。你需要三样东西:API Key、Base URL、Model ID。这三件套在 Openclaw 的配置里是绑在一起的,缺一个都跑不起来。API Key 去控制台生成,Base URL 用https://taotoken.net/api,Model ID 根据你选的模型填。这三个值后面在配置文件里会同时出现,我先把获取路径给你。
打开控制台页面生成 Key:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=openclaw_cdp_doubao 。生成之后先复制存好,页面刷新后 Key 不会再完整显示。如果你还没决定用哪个模型,可以先去模型对话页面试一下效果:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=openclaw_cdp_doubao 。在对话页面里选一个模型发几句话,确认响应正常,再把这个 Model ID 记下来填进 Openclaw。
接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=openclaw_cdp_doubao ,里面有各语言的调用示例和参数说明。如果你后面要长期跑编码类或 Agent 类任务,可以看 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=openclaw_cdp_doubao 。API Keys 管理页在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=openclaw_cdp_doubao ,可以随时回来查已生成的 Key。
这里有个容易踩的坑:Openclaw 的模型配置和浏览器配置是分开的两块。很多人配好了 CDP 端口,结果 Agent 一调用就报模型鉴权失败,就是因为只配了 browser 段没配 model 段。我下面给的完整配置里两块都会写全,你照着填就行。另外 Base URL 结尾不要多加斜杠,https://taotoken.net/api就是完整地址,加了斜杠有些客户端会拼出双斜杠导致 404。
Key 的权限建议单独建一个,不要和你其他项目共用。Openclaw 跑自动化时会频繁发请求,如果 Key 被限流,排查起来会以为是 CDP 断了,其实是模型侧的问题。分开建 Key 之后,出问题看日志就能快速定位是哪一侧。准备好这三件套,下一节直接上可复制的配置。
3. 可复制配置:openclaw.json 完整片段与 CDP 端口设置
这一节给你能直接粘贴的配置。Openclaw 的主配置文件在~/.openclaw/openclaw.json,如果目录不存在先手动建一下。下面这份是完整片段,包含 browser 段和 model 段,你按自己的 Key 和 Model ID 替换占位符。
{ "browser": { "enabled": true, "defaultProfile": "openclaw", "profiles": { "openclaw": { "cdpPort": 18800, "color": "#FF4500" }, "user": { "driver": "existing-session", "attachOnly": true, "color": "#00AA00" } } }, "model": { "provider": "openai-compatible", "baseUrl": "https://taotoken.net/api", "apiKey": "你的_API_Key", "modelId": "你的_Model_ID" } }cdpPort是本地 CDP 通信的端口,默认区间是 18800-18899。如果你机器上这个端口被占了,Openclaw 启动会失败,换一个区间内的端口即可。driver: existing-session是接管模式的关键,attachOnly: true表示只附着到已存在的浏览器会话,不新开窗口。这两个字段必须成对出现,只写一个会报配置校验错误。
模型段里provider填openai-compatible,因为 TaoToken 的接口是兼容 OpenAI 格式的。baseUrl就是https://taotoken.net/api,apiKey填你刚才生成的 Key,modelId填你在对话页面确认过的模型 ID。这三件套缺一不可,我前面强调过。
如果你用 TOML 格式管理配置(有些部署脚本会转成 TOML),对应片段是这样:
[browser] enabled = true defaultProfile = "openclaw" [browser.profiles.openclaw] cdpPort = 18800 color = "#FF4500" [browser.profiles.user] driver = "existing-session" attachOnly = true color = "#00AA00" [model] provider = "openai-compatible" baseUrl = "https://taotoken.net/api" apiKey = "你的_API_Key" modelId = "你的_Model_ID"配置写完后先做一次语法校验,Openclaw 有内置的检查命令:
openclaw config validate看到config ok再往下走。如果报unknown field,多半是你把字段名拼错了,对照上面的片段逐个核对。JSON 里不能有注释,我上面为了讲解加的说明不要带进去,否则解析会失败。
端口占用检查用这条:
lsof -i :18800如果输出里有其他进程,换端口或者先停掉那个进程。接管模式不需要指定端口,它附着到你日常浏览器的调试端口上,那个端口是浏览器启动时自己开的。下一节讲怎么把日常浏览器变成可附着的状态,以及怎么验证整条链路通了。
4. 分步验证:从 WebSocket 握手到让小龙虾问出豆包的回答
配置就绪后,按顺序验证。第一步先确认浏览器版本和调试开关。Chrome 用户在地址栏打开chrome://inspect/#remote-debugging,Brave 用户打开brave://inspect,勾选 “Enable remote debugging”。这一步是接管模式的前提,没开的话attachOnly会连不上。
第二步启动 Openclaw 的独立浏览器 profile,验证 CDP 直连是否工作:
openclaw browser --browser-profile openclaw start openclaw browser --browser-profile openclaw statusstatus 输出里看到transport: cdp就说明 WebSocket 直连内核成功了。如果显示transport: extension,说明配置没生效,回去检查cdpPort和enabled字段。
第三步验证接管模式。先确认你日常浏览器已经开着,然后:
openclaw browser --browser-profile user tabs这条命令会列出你日常浏览器里所有打开的标签页。能看到列表就说明接管成功。第一次连接时浏览器会弹窗问是否允许调试,点允许,之后不再问。Mac 用户如果反复弹窗,确认 Openclaw 版本在 2026.3.23 之后。
第四步做一次 WebSocket 握手的手动验证,确认 CDP 端点可达。先拿到调试端点的 WebSocket 地址:
curl -s http://127.0.0.1:18800/json/version返回的 JSON 里有webSocketDebuggerUrl字段,形如ws://127.0.0.1:18800/devtools/browser/xxxx。用 wscat 连一下:
npx wscat -c ws://127.0.0.1:18800/devtools/browser/xxxx连上后发一条最简单的 CDP 命令:
{"id":1,"method":"Browser.getVersion"}正常会返回浏览器版本信息。这一步通了,说明 WebSocket 链路完全没问题,剩下的就是 Openclaw 帮你封装好的页面操控。
第五步,让小龙虾去问豆包。用 Agent 工具调用,接管模式打开豆包页面:
{ "name": "browser_navigate", "arguments": { "browser_profile": "user", "url": "https://www.doubao.com" } }页面打开后,用browser_type把问题填进输入框,再用browser_click点发送:
{ "name": "browser_type", "arguments": { "selector": "textarea", "text": "我是AI还是人类?" } }{ "name": "browser_click", "arguments": { "selector": "button[type=submit]" } }等几秒让豆包生成回答,然后用browser_evaluate把回答文本读回来:
{ "name": "browser_evaluate", "arguments": { "script": "document.querySelector('.message-content')?.innerText" } }选择器要根据豆包页面实际结构调,browser_screenshot可以先截图看页面长什么样,确认元素位置再写选择器。我实测下来,接管模式下因为带着登录态,豆包的回答和你在日常浏览器里手动问是一致的。整个链路跑通后,你给小龙虾发的那句“问下豆包,我是AI还是人类”就会真的被执行,回答也会回读给你。
5. 常见报错排查:401、local proxy failed 与 reading choices
跑这条链路最容易遇到的几个报错,我按出现频率排一下。
401 Unauthorized基本是模型侧的问题,不是 CDP 的问题。检查openclaw.json里 model 段的apiKey有没有填对,baseUrl是不是https://taotoken.net/api。如果 Key 是对的还报 401,去控制台确认这个 Key 有没有被禁用或过期。还有一种情况是 Key 复制时带了空格,JSON 里字符串前后的空格不会被自动去掉,手动检查一下。
local proxy failed通常出现在接管模式。原因是 Openclaw 尝试附着到你日常浏览器时,调试端口没开或者被防火墙拦了。先确认chrome://inspect/#remote-debugging里的开关是勾选状态,再确认没有其他程序占用调试端口。如果你日常浏览器是用某个启动脚本开的,脚本里可能带了--remote-debugging-port=0,0 表示随机端口,Openclaw 找不到。改成固定端口,比如--remote-debugging-port=9222。
reading choices这个报错来自模型响应解析。Openclaw 期望模型返回 OpenAI 格式的choices数组,如果返回结构不对就会报这个。检查provider是不是openai-compatible,modelId是不是在对话页面验证过的那个。有些模型 ID 拼错一个字符,接口会返回错误结构而不是标准 choices,就会触发这个报错。
OAuth相关报错出现在接管已登录页面时。如果你日常浏览器里的豆包登录态过期了,Openclaw 附着上去后页面会跳登录,Agent 读不到回答。解决办法是先在日常浏览器里手动登录一次豆包,确认登录态有效,再跑自动化。接管模式读的就是你日常浏览器的 Cookie,Cookie 失效它也没办法。
端口冲突报错形如address already in use。用lsof -i :18800找到占用进程,要么停掉它,要么把cdpPort换成 18801 到 18899 之间的其他值。换端口后记得重启 Openclaw 的 browser 服务。
配置校验报错unknown field或invalid type。JSON 里不能有注释,字段名大小写要完全一致,cdpPort不能写成cdp_port。布尔值true不能加引号,加了引号会变成字符串导致类型校验失败。
如果报错信息里出现attachOnly相关提示,检查driver和attachOnly是不是成对出现。只写attachOnly: true不写driver: existing-session,Openclaw 不知道你要附着到哪种会话,会直接拒绝启动。
排查顺序建议从模型侧往浏览器侧走:先确认 401 这类鉴权问题,再确认 CDP 连接,最后确认页面选择器。因为模型侧报错和浏览器侧报错在日志里可能混在一起,按这个顺序能快速缩小范围。
6. 把这条链路用起来:从问豆包到更多自动化场景
跑通“让小龙虾问豆包”之后,这套 CDP 接管模式能做的事还有很多。核心价值在于接管已登录会话,所以任何需要登录态的网页操作都能自动化:查收 QQ 邮箱、看微博通知、在已登录的后台系统里导数据。你不需要在每个场景里重新扫码登录,Openclaw 附着到你日常浏览器上,登录态直接复用。
如果你要做的是批量任务,比如定时去某个页面抓数据,用 openclaw profile 更合适,它是干净隔离的,不会污染你日常浏览器的缓存。需要登录态的场景用 user profile,不需要的用 openclaw profile,两个 profile 在配置里已经分好了,调用时通过browser_profile参数切换。
模型侧的三件套要记牢:Base URL 用https://taotoken.net/api,Key 在控制台生成,Model ID 在对话页面确认。这三样在 Openclaw 的 model 段里同时出现,缺一个 Agent 就跑不起来。如果你后面要接 Claude Code 或做更复杂的 Agent 编排,接入文档里有对应的配置示例:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=openclaw_cdp_doubao 。长期跑编码类任务的话,Coding Plan 的额度更划算:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=openclaw_cdp_doubao 。
最后提醒一个安全点:CDP 权限极高,接管模式下 Openclaw 能读你浏览器里所有页面的内容。所以调试端口不要暴露到公网,远程对接时用 WSS 加密链接,Token 不要写进会公开的日志里。本地跑的话,127.0.0.1绑定就够安全了。端口区间 18800-18899 是本地通信用的,不要改成0.0.0.0监听所有网卡。
这套配置我反复调过几次,最稳的组合就是 openclaw profile 做独立任务、user profile 做接管任务、模型走 TaoToken 统一入口。你按上面的步骤走一遍,从版本检查到 WebSocket 握手验证,再到实际问豆包,整条链路应该能在半小时内跑通。卡住的话优先看第 5 节的报错对照,大部分问题都在那几类里。