☰
BrowserSkill:复用已登录浏览器,让AI安全操作网页
2026/10/31 12:05:44 网站建设 项目流程

1. 这个项目到底在解决什么问题

浏览器自动化这件事,做过的人都懂,最烦的从来不是写脚本,而是登录态。你写一个脚本帮自己抓个数据、填个表单、跑个流程,结果第一步就卡在登录页——要么手动扫码,要么把账号密码硬编码进脚本里,要么去折腾 Cookie 的导入导出。更别提很多站点还有二次验证、设备指纹、异地登录风控,脚本跑三次封两次。

腾讯开源的 BrowserSkill 瞄准的就是这个痛点。它的核心思路一句话就能说清:不去碰你的账号密码,而是直接复用你本机浏览器里已经登录好的会话。你平时用 Chrome 登录过的那些站点,BrowserSkill 让 AI 直接接管这个已经登录的浏览器实例来干活,密码、Cookie、Token 全程不经过 AI 的手。

这件事的价值在哪?我举个实际场景你就明白了。假设你每天要登录公司后台导一份报表,手动操作大概五分钟。你想让 AI 帮你自动做,传统方案是你得把后台账号密码告诉 AI 工具,或者写死在配置里。这意味着你的凭据暴露给了一个第三方程序,而且一旦这个程序被入侵或者日志泄露,账号就没了。BrowserSkill 换了个思路:浏览器还是你自己在用的那个浏览器,登录态是你自己登的,AI 只是"借用"这个已经打开的窗口去点按钮、读页面、填内容。凭据始终留在浏览器的安全边界内,AI 拿到的是"操作能力"而不是"身份凭据"。

这个区别听起来小,实际上是安全模型上的根本差异。前者是"把钥匙交给别人",后者是"让别人在你家里帮你干活,钥匙还在你兜里"。对于任何涉及企业内部系统、个人账号、支付类操作的自动化需求,这个差异是决定性的。

适合谁来用?三类人最直接受益。第一类是做 AI Agent 的开发者,尤其是需要让 Agent 操作真实网页的,BrowserSkill 提供了一个现成的、带登录态复用能力的浏览器操作层。第二类是效率工具的重度用户,比如你想让 AI 帮你处理一些需要登录才能访问的日常事务。第三类是对安全敏感的技术人员,你一直想自动化某些流程,但始终过不了"凭据不能外泄"这道坎,BrowserSkill 正好绕开了这个矛盾。

需要说明的是,BrowserSkill 本身不是一个完整的 AI 产品,它更像是一层"能力接口"——把"操作一个已登录浏览器"这件事标准化、工具化,让上层的 AI 或脚本能够调用。理解这一点很重要,否则你会误以为装完就能用自然语言指挥电脑干活,实际上中间还需要 AI 侧的对接。

2. 核心设计思路拆解

2.1 为什么是"复用已登录浏览器"而不是"模拟登录"

传统浏览器自动化的登录方案无非几种:硬编码账号密码、导入导出 Cookie、使用持久化用户目录。这三种我都用过,各有各的坑。

硬编码账号密码的问题最直接——凭据泄露风险,而且遇到验证码、短信验证、扫码登录就彻底歇菜。导入导出 Cookie 稍微好一点,但 Cookie 有有效期,过期了要重新导,而且很多站点的 Cookie 和浏览器指纹绑定,换个环境导入就失效。持久化用户目录(比如 Playwright 的userDataDir)能保留登录态,但它是独立于你日常浏览器的另一个实例,你还是得在里面重新登录一次,而且这个目录本身就是一个凭据容器,管理不当照样泄露。

BrowserSkill 选择的是第四条路:连接到你正在使用的、已经登录好的浏览器实例。技术上通常是通过 Chrome DevTools Protocol(CDP)来实现的。Chrome 从很早的版本开始就支持以调试模式启动,暴露一个本地端口,外部程序通过这个端口就能控制浏览器——打开标签页、点击元素、读取 DOM、执行 JS,全都能做。关键在于,这个被控制的浏览器就是你平时用的那个,你的登录态、你的书签、你的扩展,全都在。

这个选择背后的逻辑是:登录这件事,交给人来做;操作这件事,交给 AI 来做。人负责在浏览器里正常登录,AI 负责登录之后的重复劳动。职责边界清晰,安全边界也就清晰了。

2.2 CDP 这条技术路线为什么靠谱

Chrome DevTools Protocol 是 Chrome 官方提供的调试协议,你平时按 F12 打开开发者工具,那个面板和浏览器内核之间的通信走的就是 CDP。它是一等公民级别的接口,稳定性和能力覆盖都没得说。

用 CDP 做自动化有几个实打实的好处。第一是能力全,你能在 DevTools 里做的事,通过 CDP 基本都能做,包括网络拦截、DOM 操作、截图、性能数据采集。第二是不挑页面,不管页面用的是 React、Vue 还是上古 jQuery,CDP 操作的是渲染后的真实 DOM,不依赖页面框架。第三是和真实浏览器行为一致,因为它就是真实浏览器,不存在"自动化特征"被识别的问题——当然,这不意味着可以乱来,频率过高照样触发风控,但至少不会因为"用了某个自动化框架"而被一眼识破。

BrowserSkill 把 CDP 这层封装成了对 AI 友好的工具接口。AI 不需要懂 CDP 的细节,它只需要知道"打开某个页面""点击某个按钮""读取某段文字"这些高层动作,BrowserSkill 负责翻译成 CDP 调用。这个抽象层的价值在于,它把浏览器自动化的门槛从"懂协议"降到了"会描述任务"。

2.3 安全边界是怎么划的

这是整个项目最值得说道的地方。BrowserSkill 的安全模型建立在几个假设之上。

第一个假设:浏览器进程本身是可信的。你的登录态存在浏览器的 Cookie 存储、LocalStorage、SessionStorage 里,这些数据受浏览器的同源策略保护,外部程序不能随意读取。BrowserSkill 通过 CDP 操作浏览器,但它拿到的是"操作指令的执行结果",而不是"凭据本身"。比如它可以让浏览器导航到某个页面,但它读不到你存在 Cookie 里的 session token——除非它主动去读 document.cookie,而这在 HttpOnly 的 Cookie 上是读不到的。

第二个假设:AI 侧不需要知道凭据。AI 要完成"帮我在后台导出报表"这个任务,它需要的是"知道报表页面的导出按钮在哪、点它、等下载完成",而不是"知道我的账号密码"。BrowserSkill 的设计让 AI 只接触前者,凭据始终在浏览器内部流转。

第三个假设:用户对浏览器有完全控制权。因为是复用你自己的浏览器,你随时可以关掉它、退出登录、清理数据。AI 的操作能力随着浏览器的关闭而终止,不存在"AI 在后台偷偷用你的账号"这种情况——至少从设计意图上是这样。

注意:安全模型是设计意图,实际部署时还要看具体实现。比如 CDP 端口如果暴露在公网就是灾难,必须绑定在本地回环地址。再比如,如果 AI 被诱导去访问恶意页面,理论上存在被钓鱼的风险。这些是使用时要自己把关的地方。

3. 核心能力与实操要点

3.1 环境准备:让浏览器进入可被控制的状态

BrowserSkill 要工作,前提是你的 Chrome 以调试模式启动。这一步是整个流程的入口,也是最容易出问题的地方。

Chrome 的调试模式启动参数是--remote-debugging-port。你需要在启动 Chrome 时加上这个参数,指定一个本地端口,比如 9222。完整的启动命令大概长这样:

# macOS 示例 /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \ --remote-debugging-port=9222 \ --user-data-dir=/tmp/chrome-debug-profile
# Windows 示例(在命令行中执行) "C:\Program Files\Google\Chrome\Application\chrome.exe" ^ --remote-debugging-port=9222 ^ --user-data-dir="C:\chrome-debug-profile"

这里有个关键点必须说清楚:--user-data-dir参数决定了你用哪个用户配置目录。如果你不指定,Chrome 会用默认目录,但问题是如果 Chrome 已经在运行,新启动的实例会直接复用已有进程,调试参数不生效。所以实操中通常的做法是:要么先完全退出 Chrome 再用调试参数启动,要么指定一个独立的用户目录。

但这里有个矛盾:如果你指定了独立的用户目录,那这个目录里是空的,没有你的登录态,BrowserSkill 复用的就不是你日常的登录状态了。所以正确的姿势是——用你日常的用户目录,但确保启动时带上调试参数。具体做法是先彻底退出 Chrome(包括后台进程),然后用带调试参数的命令启动,并且--user-data-dir指向你日常使用的目录。

macOS 上日常目录通常在~/Library/Application Support/Google/Chrome,Windows 上在%LOCALAPPDATA%\Google\Chrome\User Data。Linux 上在~/.config/google-chrome。

提示:直接指定日常目录有个风险——如果操作不当可能损坏配置。稳妥的做法是先备份一份,或者用一个专门用于自动化的用户目录,在里面手动登录一次需要的站点。这样既保留了登录态,又和日常浏览隔离,互不干扰。

启动之后,你可以访问http://localhost:9222/json/version来验证调试端口是否正常工作。如果返回一段 JSON,里面有Browser、webSocketDebuggerUrl这些字段,说明浏览器已经进入可被控制的状态。

3.2 连接与操作:BrowserSkill 怎么接管浏览器

浏览器进入调试模式后,BrowserSkill 通过 CDP 的 WebSocket 接口连接上去。连接建立之后,它能做的事情包括但不限于:

  • 列出当前所有标签页,获取每个页面的标题和 URL
  • 打开新标签页、关闭标签页、切换活动标签页
  • 在页面中执行 JavaScript,读取或修改 DOM
  • 模拟点击、输入、滚动等用户操作
  • 拦截网络请求,获取响应内容
  • 对页面截图,获取渲染结果

这些能力组合起来,就能覆盖绝大多数网页操作场景。比如"帮我在某个后台系统里导出上个月的订单数据"这个任务,拆解开来就是:找到订单管理页面(导航)、设置日期筛选条件(填表单)、点击导出按钮(点击)、等待下载完成(监听网络或文件系统)。每一步都能用 CDP 的能力实现。

BrowserSkill 的价值在于,它把这些底层能力封装成了 AI 容易理解和调用的工具。AI 不需要知道 CDP 的Page.navigate、Runtime.evaluate这些方法名,它只需要表达"打开这个网址""点击这个按钮",BrowserSkill 负责翻译。

从实操角度看,你需要关注的是元素定位的稳定性。网页上的按钮、输入框,定位方式有很多种:CSS 选择器、XPath、文本内容、坐标。最稳的是基于稳定属性的 CSS 选择器,比如#export-btn这种带 ID 的。最不稳的是基于坐标的点击,页面布局一变就失效。BrowserSkill 如果提供了多种定位方式,优先用语义化的选择器,实在不行再用文本匹配,坐标点击作为最后手段。

3.3 登录态复用的实际效果与边界

登录态复用这件事,实际效果取决于站点的登录机制。

对于传统的 Session Cookie 登录,复用效果最好。你在浏览器里登录了,Cookie 存在浏览器里,BrowserSkill 操作这个浏览器访问站点,Cookie 自动带上,服务端认为你就是已登录用户,一切正常。

对于 Token 存在 LocalStorage 的站点(很多前后端分离的应用是这样),效果同样好。因为 LocalStorage 也是浏览器存储的一部分,BrowserSkill 操作的是同一个浏览器上下文,Token 自然可用。

对于有严格设备指纹校验的站点,情况复杂一些。如果指纹是基于浏览器特征的(User-Agent、Canvas 指纹、WebGL 指纹等),因为复用的是同一个浏览器,指纹一致,通常没问题。但如果指纹还绑定了 IP、绑定了特定时间窗口,那就可能触发风控。这种情况下,BrowserSkill 能解决"凭据复用"问题,但解决不了"环境一致性"问题——后者需要你自己保证操作环境和登录环境一致。

还有一个边界是多账号场景。BrowserSkill 复用的是一个浏览器实例的登录态,如果你需要同时操作多个账号,要么开多个浏览器实例(每个用不同的用户目录),要么在操作前切换登录。前者资源消耗大,后者操作繁琐。这是设计上的取舍,不是缺陷,但使用前要心里有数。

4. 完整实操流程与关键环节

4.1 从零到跑通的最小闭环

我按自己的实操顺序,把整个流程拆一遍。假设你的目标是让 AI 帮你操作一个已登录的网页后台。

第一步,准备一个专用的浏览器用户目录。不要直接用日常目录,避免自动化操作污染你的日常浏览数据。新建一个目录,比如~/chrome-auto-profile,然后用调试参数启动 Chrome 并指向这个目录。

/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \ --remote-debugging-port=9222 \ --user-data-dir=$HOME/chrome-auto-profile

第二步,在这个浏览器里手动登录目标站点。这一步必须人工完成,因为 BrowserSkill 的设计就是不碰登录过程。登录一次之后,登录态会保存在这个用户目录里,后续启动都能复用。

第三步,验证调试端口。浏览器起来后,访问http://localhost:9222/json,应该能看到当前打开的标签页列表。如果这个接口能访问,说明 CDP 通道是通的。

第四步,配置 BrowserSkill 连接。具体配置方式取决于 BrowserSkill 的接入形态。如果是作为库使用,通常需要指定 CDP 的 WebSocket 地址,这个地址可以从http://localhost:9222/json/version的返回里拿到,形如ws://localhost:9222/devtools/browser/xxxxx。

第五步,跑一个最小任务验证。比如让 AI 读取当前页面的标题,或者导航到一个已知页面并截图。这一步的目的是确认"连接-操作-返回结果"这条链路是通的,再去做复杂任务。

第六步,逐步增加任务复杂度。从读取信息开始,到填表单,到点击提交,每一步都单独验证,确认稳定后再串联。

这个顺序看起来啰嗦,但能帮你快速定位问题出在哪一环。我见过太多人一上来就写一个复杂流程,跑不通之后完全不知道是连接问题、定位问题还是逻辑问题,排查成本极高。

4.2 元素定位的实战技巧

元素定位是浏览器自动化里最容易翻车的地方。页面稍微改个版,选择器就失效了。分享几个我踩坑总结出来的经验。

优先用带语义的稳定属性。id是最稳的,其次是name、>

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询