资讯动态

Tencent BrowserSkill:让编码Agent借用真实浏览器登录态

发布时间:2026/10/17 5:24:16 来源:尧图企业网站定制
1. 这个桥到底在解决什么问题第一次看到 Tencent BrowserSkill 这个名字我脑子里冒出来的第一个念头是终于有人把这件事做成正经工具了。做过 AI Agent 落地的人应该都有过类似的憋屈——你让 Agent 去帮你查个后台数据、点个审批、填个表单它要么卡在登录页要么被验证码拦在门外要么干脆因为拿不到你浏览器里那份已经登录好的会话只能干瞪眼。你明明在 Chrome 里已经登录得好好的Agent 却像个刚进城的陌生人什么都得从头来一遍。Tencent BrowserSkill 干的事情说白了就是在你已经登录的真实浏览器和编码 Agent之间搭一座本地桥。注意这几个关键词真实浏览器、已登录、本地桥、编码 Agent。这四个词组合在一起基本就把它的定位说清楚了——它不是又一个无头浏览器方案不是让你去写一堆 Playwright 脚本模拟登录而是让 Agent 直接借用你手头那个已经处于登录态的浏览器实例把人已经完成的登录状态这个最有价值的资产复用起来。为什么这件事值得单独做一个工具因为浏览器登录态是 AI Agent 落地里最脏、最烦、最容易被低估的一块。你去看那些 Agent 的 demo演示的时候都是干干净净的 API 调用一旦进入真实业务系统90% 的操作都得先过登录这一关。而登录这件事涉及账号密码、短信验证码、扫码、二次验证、设备指纹、风控策略你让 Agent 去自动化这些成本高得离谱而且很多系统本身就明确禁止自动化登录。与其硬刚不如换个思路人登录Agent 借用。这就是 BrowserSkill 的核心逻辑。它适合谁我梳理了一下主要是三类人。第一类是做 AI Agent 应用开发的工程师尤其是那些需要让 Agent 操作内部系统、后台管理页面的场景比如自动填报表、批量处理工单、跨系统数据搬运。第二类是用编码 Agent 做日常提效的开发者比如你让 Claude Code、Cursor 这类工具帮你调试前端、抓取页面数据、做端到端测试它需要一个能真实操作浏览器的通道。第三类是研究 Agent 与真实环境交互的爱好者想搞清楚 Agent 怎么和浏览器这种有状态、有 UI、有风控的环境打交道。SSP 这个词在标题里出现我理解它指的是这类桥接方案里的一种协议或服务模式核心还是围绕本地服务 浏览器扩展 Agent 调用这套组合拳。下面我会把这套东西拆开从设计思路到实操细节再到踩坑经验尽量讲透。2. 整体设计思路为什么是借用而不是模拟2.1 无头浏览器方案的天花板在哪在 BrowserSkill 这类方案出现之前让 Agent 操作浏览器的主流做法是无头浏览器Playwright、Puppeteer、Selenium 这一套。它们的逻辑是启动一个全新的浏览器实例Agent 通过 CDPChrome DevTools Protocol或者 WebDriver 协议去控制它。听起来很美好但实际用起来登录态这一关就卡死一大片。我拿一个真实场景举例。假设你要让 Agent 去某个内部运营后台批量导出数据。这个后台的登录流程是账号密码 短信验证码 图形验证码。你用无头浏览器第一步账号密码能填第二步短信验证码你得去接短信第三步图形验证码你得接打码平台。就算你全接上了这套流程每次跑都要走一遍而且风控系统看到的是一个全新的、没有任何历史行为的浏览器指纹很容易触发二次验证甚至封号。更麻烦的是设备指纹。现在稍微正规一点的系统都会采集浏览器指纹——Canvas 指纹、WebGL 指纹、字体列表、时区、屏幕分辨率、插件列表等等。无头浏览器和真实浏览器在这些维度上差异巨大很多系统一眼就能识别出来。你辛辛苦苦搭的自动化流程可能第一次跑就被判定为异常。还有一个隐性成本状态维护。无头浏览器每次启动都是干净的你要维持登录态就得把 Cookie、LocalStorage、SessionStorage 持久化下来下次启动再注入回去。这套东西写起来不难但维护起来很烦尤其是遇到 Token 过期、Cookie 加密、多设备登录互踢这些情况。2.2 借用真实浏览器的核心优势BrowserSkill 的思路完全绕开了上面这些坑。它不启动新浏览器而是连接到你正在用的那个浏览器。你已经登录好了它直接用你的浏览器指纹是真实的风控看到的就是一个正常用户你的 Cookie、Token 都是活的不需要持久化和注入。这个思路的关键在于连接方式。浏览器本身提供了远程调试的能力通过 CDP 协议外部程序可以连接到浏览器实例并控制它。Chrome 启动时加一个--remote-debugging-port参数就会在本地开一个调试端口任何能访问这个端口的程序都可以接管浏览器。BrowserSkill 这类工具本质上就是把这个能力封装成了 Agent 友好的接口。但这里有个细节要注意默认情况下你日常使用的 Chrome 是不开调试端口的。你不能直接连上去。所以通常的做法是用一个独立的用户数据目录启动一个带调试端口的 Chrome 实例这个实例和你日常用的浏览器共享同一套登录态如果你把用户数据目录指过去的话或者你在这个实例里单独登录一次之后就一直复用。我实测下来比较稳的做法是专门开一个Agent 专用的浏览器实例用独立的用户数据目录第一次手动登录好所有需要的系统之后这个实例就常驻着Agent 随时连上来用。这样既不影响你日常浏览器的使用又能保证登录态稳定。2.3 本地桥的角色分工把整个架构拆开看BrowserSkill 这套东西大概分三层层级角色职责浏览器层真实浏览器实例承载登录态、执行真实操作、提供 CDP 接口桥接层BrowserSkill 本地服务连接浏览器、暴露 Agent 可调用的接口、处理协议转换Agent 层编码 Agent发起操作指令、解析返回结果、编排任务流程桥接层是核心。它要做的事情包括连接浏览器的调试端口、把 CDP 的底层协议封装成更友好的操作语义比如点击某个按钮、读取某个元素、等待页面加载、处理 Agent 发来的请求、把结果结构化返回。有些实现还会加上页面快照能力把当前页面的 DOM 结构、可交互元素、文本内容整理成 Agent 容易理解的格式。为什么要有桥接层不让 Agent 直接连 CDP因为 CDP 协议本身很底层Agent 直接调会很痛苦。CDP 有几百个方法参数复杂返回结构也复杂。桥接层的作用就是做一层翻译把 Agent 的意图翻译成 CDP 调用再把 CDP 的返回翻译成 Agent 能理解的结果。这层翻译做得好不好直接决定了 Agent 操作浏览器的成功率。2.4 为什么强调编码 Agent标题里特意点了编码 Agent这个限定词有讲究。编码 Agent 指的是 Claude Code、Cursor、GitHub Copilot 这类能写代码、能执行命令、能读写文件的 Agent。它们和普通对话式 AI 的区别在于它们有执行能力。这个区别很关键。一个纯对话的 AI你告诉它帮我登录后台导出数据它只能给你一段代码让你自己去跑。但编码 Agent 可以直接调用 BrowserSkill 提供的接口自己把这件事做完。它可以在本地起服务、可以发 HTTP 请求、可以读返回结果、可以根据结果决定下一步。这就是借用浏览器能真正落地的前提——Agent 得有能力去借。所以 BrowserSkill 的定位本质上是给编码 Agent 补上一块能力拼图操作真实浏览器的能力。编码 Agent 本来就能读写文件、执行命令、调用 API现在再加上操作浏览器它能做的事情范围就大了一圈。3. 核心细节解析桥是怎么搭起来的3.1 浏览器端的准备调试端口怎么开一切的前提是浏览器得开着调试端口。Chrome 和 Edge 都支持这个能力启动参数是--remote-debugging-port。但这里有几个坑我一个个说。第一个坑不能对已经运行的浏览器实例开调试端口。调试端口必须在启动时指定运行中没法加。所以你日常用的那个 Chrome如果已经开着是连不上的。你得关掉它用带参数的命令重新启动或者干脆用独立的用户数据目录开一个新实例。第二个坑用户数据目录的锁定。Chrome 同一时间只允许一个实例使用同一个用户数据目录。如果你日常浏览器开着再用同一个目录启动带调试端口的实例会失败。所以要么关掉日常浏览器要么用独立目录。第三个坑调试端口的暴露范围。默认情况下调试端口只监听本地回环地址这是安全的。但如果你不小心把它暴露到公网那就是灾难——任何人都能接管你的浏览器包括你所有已登录的账号。这一点必须注意调试端口绝对不能对外网开放。我常用的启动命令大概是这样# macOS 示例 /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \ --remote-debugging-port9222 \ --user-data-dir/Users/yourname/.agent-browser-profile \ --no-first-run \ --no-default-browser-check# Windows 示例 C:\Program Files\Google\Chrome\Application\chrome.exe ^ --remote-debugging-port9222 ^ --user-data-dirC:\agent-browser-profile ^ --no-first-run ^ --no-default-browser-check参数说明一下。--remote-debugging-port9222指定调试端口9222 是常用值你也可以换别的。--user-data-dir指定独立的用户数据目录这样不会和你日常浏览器冲突。--no-first-run和--no-default-browser-check是跳过首次运行的引导让启动更干净。启动之后你可以访问http://localhost:9222/json/version验证一下如果返回一段 JSON里面有webSocketDebuggerUrl字段说明调试端口开成功了。注意这个带调试端口的浏览器实例登录态是独立的。你需要在里面手动登录一次你要操作的系统。之后只要不删用户数据目录登录态就会一直保留。3.2 桥接服务的启动与连接浏览器端准备好之后接下来是桥接服务。BrowserSkill 这类工具通常会提供一个本地服务你启动它它去连接浏览器的调试端口然后对外暴露 Agent 能调用的接口。连接的过程大概是桥接服务读取http://localhost:9222/json/version拿到 WebSocket 调试地址然后建立 WebSocket 连接之后所有的操作指令都通过这个连接发给浏览器。这里有个细节值得说一个浏览器实例可以被多个客户端连接。CDP 协议支持多客户端但多个客户端同时操作同一个页面可能会互相干扰。所以实践中通常是一个桥接服务对应一个浏览器实例Agent 通过桥接服务间接操作避免直接竞争。桥接服务暴露的接口形式不同实现不太一样。有的是 HTTP 接口Agent 发 HTTP 请求就能操作有的是 MCPModel Context Protocol接口专门给支持 MCP 的 Agent 用有的两者都支持。MCP 这个方向最近很热因为越来越多的编码 Agent 开始支持 MCP通过 MCP 接入浏览器能力配置起来更顺。如果你用的是支持 MCP 的 Agent配置大概是这样{ mcpServers: { browser: { command: npx, args: [-y, tencent-browserskill-mcp], env: { CDP_ENDPOINT: http://localhost:9222 } } } }这段配置的意思是Agent 启动时会拉起一个 BrowserSkill 的 MCP 服务这个服务连接到本地的 9222 调试端口。之后 Agent 就能通过 MCP 协议调用浏览器操作了。提示具体的包名和参数以你实际使用的版本为准我这里给的是示意结构。核心是让 Agent 知道去哪里找桥接服务以及桥接服务去哪里找浏览器。3.3 Agent 能做的操作有哪些桥接服务搭好之后Agent 能做的事情范围取决于桥接层封装了哪些能力。我梳理了一下核心能力大概分这么几类页面导航类打开指定 URL、前进、后退、刷新、等待页面加载完成。这类操作是基础Agent 要操作一个系统第一步就是打开它。元素交互类点击元素、输入文本、选择下拉框、勾选复选框、上传文件、滚动页面。这类操作是核心Agent 的大部分任务都是通过元素交互完成的。信息读取类读取页面文本、读取元素属性、读取表单值、获取页面截图、获取页面 DOM 结构。这类操作让 Agent 能看到页面状态从而决定下一步做什么。等待与同步类等待元素出现、等待元素消失、等待网络请求完成、等待页面跳转。这类操作是稳定性的关键页面是异步加载的Agent 如果不等就操作很容易失败。标签页管理类新建标签页、切换标签页、关闭标签页、列出所有标签页。多标签页场景下这类操作必不可少。Cookie 与存储类读取 Cookie、设置 Cookie、读取 LocalStorage。有些场景下Agent 需要直接操作存储来完成任务。这些能力封装得好不好直接决定了 Agent 操作的成功率。我见过一些实现只封装了点击和输入结果 Agent 遇到需要等待的场景就抓瞎。好的实现会把等待、重试、错误处理都考虑进去。3.4 页面快照让 Agent 看懂页面这是我觉得最值得单独讲的一块。Agent 操作浏览器最大的难点不是怎么点而是点哪里。页面上的元素成百上千Agent 怎么知道哪个是它要找的按钮传统做法是让 Agent 根据选择器去找元素比如#submit-btn、.login-form input[typepassword]。但问题是Agent 事先不知道页面的选择器是什么它得先看页面。所以桥接层通常会提供一个页面快照能力把当前页面的可交互元素整理成结构化数据返回给 Agent。快照的内容大概包括每个可交互元素的类型按钮、输入框、链接、文本内容、位置、可用的选择器、是否可见、是否可点击。Agent 拿到这份快照就能理解页面结构决定操作哪个元素。我实测下来快照的质量对 Agent 成功率影响巨大。好的快照会做几件事过滤掉不可见元素、给每个元素生成稳定的选择器、标注元素的语义角色比如这是一个提交按钮、保留元素的层级关系。差的快照就是一堆原始 DOMAgent 看了也白看。这里有个经验快照不要太大。一个复杂页面可能有几千个元素全塞给 Agent既浪费 token 又干扰判断。好的实现会做裁剪只保留可交互的、可见的、有语义的元素把快照控制在合理大小。4. 实操过程从零搭起一个可用的桥4.1 环境准备与依赖安装先把环境理清楚。你需要的东西不多一个 Chrome 或 Edge 浏览器、Node.js 环境大部分桥接工具是 Node 写的、一个支持 MCP 或能发 HTTP 请求的编码 Agent。Node.js 版本建议 18 以上因为很多工具用了较新的语法和 API。安装方式不展开了官网下载或者用 nvm 管理都行。浏览器方面Chrome 和 Edge 都支持 CDP选你顺手的。我一般用 Chrome因为生态最成熟遇到问题好查资料。如果你用的是 Edge启动参数类似把可执行文件路径换一下就行。Agent 方面Claude Code、Cursor、Cline 这些都可以。关键是它得支持 MCP或者至少能执行 shell 命令、发 HTTP 请求。如果 Agent 只能对话不能执行那这套东西用不起来。4.2 启动带调试端口的浏览器这一步前面讲过命令这里补充几个实操细节。用户数据目录的选择。我建议单独建一个目录比如~/.agent-browser-profile不要用默认目录。这样做的原因是默认目录里可能有你日常浏览的各种数据Agent 操作时可能会误触而且默认目录经常被日常浏览器占用容易冲突。首次登录。启动带调试端口的浏览器后你需要在这个实例里手动登录你要操作的系统。登录一次之后就一直复用。注意如果你登录的系统有记住登录状态的选项勾上这样即使浏览器重启登录态也能保留。保持浏览器常驻。这个实例最好一直开着不要频繁重启。因为每次重启虽然登录态可能保留但页面状态会丢失Agent 得重新导航。常驻着Agent 随时连上来就能用。验证连接。启动后访问http://localhost:9222/json应该能看到当前打开的标签页列表。如果能看到说明调试端口工作正常。4.3 配置 Agent 接入桥接服务以 MCP 方式接入为例配置文件的写法前面给过示意。这里补充几个实操要点。包名和版本。不同实现的包名不一样你得查你用的那个工具的文档。我建议锁定版本不要用 latest因为 Agent 工具链更新快latest 可能引入不兼容的变更。环境变量。桥接服务通常需要知道浏览器调试端口的地址通过环境变量传进去。除了CDP_ENDPOINT可能还有超时时间、日志级别等配置项按需设置。权限范围。有些桥接服务支持配置允许操作的域名白名单这是个好习惯。限制 Agent 只能操作你指定的几个系统避免它误操作其他页面。重启 Agent。改完配置后重启你的编码 Agent让它重新加载 MCP 配置。重启后你可以让 Agent 列一下可用的工具确认浏览器相关的工具已经加载进来。4.4 第一个任务让 Agent 打开页面并读取内容配置好之后先做个最简单的验证让 Agent 打开一个页面读取页面标题。你可以对 Agent 说用浏览器工具打开 example.com告诉我页面标题是什么。Agent 应该会做这几件事调用导航工具打开 URL、等待页面加载、调用快照或读取工具获取页面信息、返回标题。如果这一步成功了说明整条链路是通的。如果失败排查顺序是先确认浏览器调试端口是否可访问curl http://localhost:9222/json/version再确认桥接服务是否启动看 Agent 的工具列表里有没有浏览器相关工具最后确认 Agent 是否能正常调用工具看日志。这一步看起来简单但它是后面所有复杂任务的基础。这一步通了后面就是组合各种操作的问题。4.5 进阶任务登录态复用下的表单填写这是最能体现 BrowserSkill 价值的场景。假设你要让 Agent 在一个已登录的后台系统里填一张表单。任务描述打开后台系统的工单页面填写标题为测试工单内容为这是一条测试然后提交。Agent 的执行流程大概是导航到工单页面 URL等待页面加载获取页面快照在快照里找到标题输入框输入测试工单找到内容输入框输入这是一条测试找到提交按钮点击等待提交结果确认成功整个过程Agent 不需要处理登录因为浏览器里已经有登录态了。这就是借用的威力。这里的关键是快照的准确性。如果快照里没有正确标注输入框和按钮Agent 就找不到目标。我实测下来大部分现代前端框架React、Vue的页面快照质量都还不错因为元素有比较清晰的语义。但一些老系统用 table 布局、没有语义标签的快照质量就差一些可能需要 Agent 多试几次或者你手动给一些提示。4.6 参数选择与超时设置实操中有几个参数需要调调好了稳定性提升明显。页面加载超时。默认可能是 30 秒但有些系统加载慢或者有长轮询30 秒不够。我一般设 60 秒。但也不能太长太长的话 Agent 会卡住。元素等待超时。等待某个元素出现的时间默认可能 5 秒。对于异步加载的页面5 秒可能不够。我一般设 10 到 15 秒。操作间隔。连续操作之间加一点延迟模拟真人操作节奏。有些系统对操作频率敏感加延迟能降低被风控的概率。我一般设 200 到 500 毫秒。重试次数。操作失败时重试几次。网络抖动、页面渲染延迟都可能导致单次失败重试能提升成功率。我一般设 2 到 3 次。这些参数不是固定的得根据你操作的系统特点调。我的建议是先用默认值跑遇到问题再针对性调整不要一上来就改一堆参数那样出了问题不好定位。5. 常见问题与排查技巧实录5.1 连接类问题问题Agent 报错说连不上浏览器。排查顺序先确认浏览器是否带调试端口启动访问http://localhost:9222/json/version再确认端口号是否和配置一致再确认是否有防火墙拦截本地端口。最常见的原因是浏览器没带调试端口启动或者端口号写错了。问题连接上了但操作没反应。可能是连到了错误的标签页。一个浏览器可能有多个标签页桥接服务默认连的可能不是你期望的那个。解决办法是让 Agent 先列出所有标签页切换到目标标签页再操作。问题操作一段时间后连接断开。可能是浏览器崩溃了或者调试端口被占用。检查浏览器是否还在运行调试端口是否还能访问。如果浏览器还在但端口不通重启浏览器。5.2 元素定位类问题问题Agent 找不到目标元素。先看快照里有没有这个元素。如果没有可能是元素在 iframe 里或者元素还没加载出来。iframe 的情况需要先切换到 iframe 上下文没加载出来的情况需要加等待。问题找到了元素但点击没反应。可能是元素被遮挡了或者元素不可点击。检查元素是否在视口内是否需要先滚动到元素位置。有些元素需要先 hover 才显示这种情况要先触发 hover。问题输入框输入了内容但提交时是空的。可能是输入事件没触发。有些前端框架依赖 input 事件来更新状态直接设置 value 不会触发。解决办法是模拟真实的输入过程逐字符输入或者手动触发 input 事件。5.3 登录态类问题问题明明登录了Agent 操作时却跳转到登录页。可能是登录态过期了或者 Agent 连到了错误的浏览器实例。检查浏览器里是否还是登录状态检查桥接服务连的是哪个实例。如果登录态确实过期了手动重新登录一次。问题登录态在但某些操作被拒绝。可能是权限问题或者系统检测到了异常操作。检查账号权限检查操作频率是否过高。降低操作频率加一些随机延迟模拟真人节奏。5.4 稳定性类问题问题同样的任务有时成功有时失败。这是最烦的问题。可能的原因很多页面加载时间不稳定、网络抖动、元素渲染顺序变化。解决办法是增加等待和重试让 Agent 在失败时能自己恢复。另外把任务拆小每一步都确认成功再走下一步比一次性做完整个流程要稳。问题Agent 操作太快被系统风控。加延迟降低操作频率。另外避免在短时间内重复执行相同任务。如果任务本身就需要高频操作考虑分批执行中间加间隔。5.5 常见问题速查表现象可能原因排查方向连不上浏览器调试端口未开/端口错误访问 /json/version 验证操作无反应连错标签页列出标签页并切换找不到元素iframe/未加载/选择器错检查快照、加等待点击无效元素被遮挡/不可点击滚动到元素、检查可见性输入为空输入事件未触发模拟逐字符输入跳转登录页登录态过期手动重新登录操作被拒绝权限/风控检查权限、降频时好时坏加载不稳定加等待重试、拆小任务5.6 几条踩坑经验经验一不要用日常浏览器做 Agent 操作。我一开始图省事直接在日常浏览器上开调试端口结果 Agent 操作时把我正在看的页面给切走了还误点了一些东西。后来改成独立实例世界清净了。经验二登录态要定期检查。有些系统的登录态有效期很短比如几小时。Agent 跑长任务时可能中途登录态就过期了。我的做法是在任务开始前先检查一下登录态过期了就提醒手动登录。经验三快照质量决定成功率。如果某个系统的快照质量很差Agent 老是找不到元素可以考虑给 Agent 一些提示比如告诉它目标元素的大致位置或文本内容。或者干脆针对这个系统写一些辅助的选择器提示。经验四日志要开足。排查问题时日志是最重要的线索。桥接服务的日志、Agent 的日志、浏览器的控制台日志都要能看到。我一般会把日志级别调到 debug虽然输出多但排查时省事。经验五任务要幂等。Agent 操作可能失败重试如果任务不是幂等的重试可能导致重复提交。设计任务时尽量让它可重复执行或者加上去重逻辑。6. 这套方案能扩展到哪里BrowserSkill 这类桥接方案基础能力是让 Agent 操作浏览器但它的想象空间不止于此。端到端测试。编码 Agent 本来就能写测试代码现在加上浏览器操作能力它可以直接跑端到端测试发现失败时自己分析原因、修改代码、重新跑。这个闭环一旦形成测试效率提升很明显。跨系统数据搬运。很多企业内部有多个系统数据不互通。Agent 可以登录系统 A 导出数据登录系统 B 导入数据中间做格式转换。这种活儿以前得写脚本现在 Agent 直接操作浏览器就能干。页面监控与告警。让 Agent 定期打开某些页面检查关键指标异常时告警。比传统的爬虫方案更灵活因为 Agent 能理解页面语义不只是抓文本。辅助人工操作。有些操作需要人工判断但步骤繁琐。Agent 可以先把能自动化的部分做完把需要判断的部分留给人工。比如填表单Agent 填好大部分字段人工确认后提交。与 RPA 的融合。传统 RPA 是基于坐标或选择器的自动化脆弱且难维护。Agent 加浏览器桥接可以理解页面语义适应性更强。这可能是 RPA 的一个演进方向。我个人觉得这套方案最大的价值在于降低了 Agent 操作真实系统的门槛。以前要让 Agent 操作一个系统得写一堆适配代码现在只要浏览器能打开、人能操作Agent 基本就能操作。这个门槛的降低会让很多以前不划算的自动化场景变得划算。最后分享一个小技巧如果你要操作的系统比较多可以给每个系统建一个独立的浏览器实例用不同的调试端口。这样 Agent 操作系统 A 时不会影响系统 B 的登录态。虽然占点内存但稳定性提升明显。我目前就是这么干的四个实例常驻各管一摊互不干扰。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑