Skip to content

浏览器

托管的 Chromium(以及 Lightpanda)会话,由 Playwright、Puppeteer 或任何其他 Chrome DevTools Protocol 客户端从外部驱动。有客户端连接时会话保持运行,最后一个客户端离开后,会话连同它的页面一起休眠。尚未向账户开放。

更新于

尚未开放。浏览器还没有向账户开放。这些页面按目前正在构建的样子介绍它,开放前可能还会变化。

浏览器为每个任务提供一个独立的 Chromium,运行在一台独立的机器里,由你的代码通过 Chrome DevTools Protocol (CDP) 从外部驱动:Playwright、Puppeteer 或任何其他 CDP 客户端都可以。每个浏览器就是一个会话。你用一次 API 调用创建它并得到它的地址;你的客户端连接到这个地址,而地址本身就是凭据。

只要有客户端连接着,会话就保持运行,无论它的页面在做什么;最后一个客户端离开几秒后,它进入休眠,标签页、页面和页面的 Cookie 都会保留。下一次连接会把它原样唤醒。

什么时候用浏览器

  • 会浏览网页的智能体:模型读取网页并在网页上操作,用的是你自己的 CDP 客户端,或者一个能驱动指定地址上浏览器的 MCP 服务器。
  • 需要真实浏览器的页面:抓取、测试、填写表单;每个任务或每个用户一个会话,按名称创建,也能按名称找回。
  • 记得上次状态的浏览器:在两轮之间休眠的会话会保留它的页面和登录状态,醒来时一切如前;配置文件能把登录状态带到新会话中。
  • 观看智能体工作:在任意浏览器中实时查看会话的页面,还有一个地址给只可观看的人。

工作方式

  1. 创建。POST /v1/browsers 创建一个处于运行状态的会话,并返回它的 CDP 地址 cdp_url。名字是可选的:用项目中已有会话的名字创建时,返回的就是那个会话,并把它原样唤醒。
  2. 连接。你的客户端连接到 cdp_url:Playwright 用 connectOverCDP,Puppeteer 用带 browserURL 的 connect。
  3. 休眠。最后一个连接关闭 sleep_after_seconds 秒后(默认为 10),会话进入休眠,内存和磁盘都会保留。有连接进来就会唤醒它。
  4. 结束。DELETE /v1/browsers/{id} 结束会话,页面也随之删除。

会话有三种:

  • chromium-headless(默认):Chromium 的 headless shell,没有屏幕的浏览器。
  • chromium:完整的 Chromium,运行在一块 1280×800、可供人观看的屏幕上。
  • lightpanda:Lightpanda,一个为程序打造的浏览器,会运行页面的脚本并保留它的 DOM,但没有布局引擎:它的截图和 PDF 只包含页面的文字。

每个会话都是一台 1 vCPU、2 GiB 的机器。它的 id 就是沙箱的 id:会话是平台为它创建的一个沙箱,/v1/sandboxes/{id}/… 的每个调用对它也有效,所以你可以在里面运行命令或读取它的文件。普通沙箱无论运行什么,都不会变成会话。

连接客户端

CDP 客户端只需要 cdp_url,而它也是一份凭据:谁拿到它,谁就能驱动这个浏览器。Playwright 用 chromium.connectOverCDP(cdp_url) 连接(Python 中是 connect_over_cdp),Puppeteer 用 puppeteer.connect({ browserURL: cdp_url })。Playwright 为此不需要自带浏览器。

CDP=$(glac browsers create --name agent-42)       # prints the session's CDP address, and nothing else
npx @playwright/mcp --cdp-endpoint "$CDP"          # an agent's browser tools, driving the session
from glac import Glac

glac = Glac()
with glac.browsers.create(name="agent-42") as session:   # deleted when the block ends
    browser = session.connect()                          # Playwright, connected over CDP
    page = browser.contexts[0].pages[0]
    page.goto("https://example.com")

POST /v1/browsers/{id}/rotate-url 给会话换上新地址:旧地址从此被拒绝,经由旧地址建立的连接会立即断开(新地址)。

命令行有 glac browsers;Python 和 TypeScript SDK 有 glac.browsers,包含所有调用;Go、Rust 和 Java SDK 可以创建、查找和结束会话;MCP 服务器可以打开、列出和关闭会话(browser_open、browser_list、browser_close)。参见命令行、Python SDK 和 MCP 服务器。

费用

会话和所有实例一样,按它使用的方块资源、以标价计费:计算时的 CPU 时间、运行时的内存(以 128 MiB 为一档,按毫秒计),以及出站流量。它没有自己单独的价格。一个会话是 1 vCPU、2 GiB;网站浏览器页面上的计算器默认假定它的 vCPU 在运行期间有一半时间忙碌,你也可以另行设置。

计量项 价格 免费版(每天) 付费版每月包含
CPU(计算时计费) 每百万 CPU 毫秒 $0.01 100万 CPU 毫秒 6000万 CPU 毫秒
内存(运行时或暂停在内存中时) 每 GiB·小时 $0.008 6 GiB·小时 250 GiB·小时
休眠实例保存的内容(内存和它自己的磁盘) 每 GB·月 $0.02 共 15 GB 数据,含快照和云盘 20 GB·月数据,含快照和云盘
发往互联网的出站流量(北美) 每 GB $0.004 3 GB,不限流出区域 1 TB,不限流出区域
发往互联网的出站流量(欧洲) 每 GB $0.004
发往互联网的出站流量(亚太) 每 GB $0.01
  • 休眠时,会话和任何休眠的沙箱一样计费:以暂停状态留在机器内存中时,这部分内存按运行时计费;内存保存下来之后,只为它保存的内容(它的内存和它自己那部分磁盘)付费,每 GB·月 $0.02,别无其他。
  • 在免费版上,它的 CPU 和内存与账户运行的其他一切一起,从免费版当天的配额中扣除;在付费版上,先从当月的包含额度中扣除,再从余额中扣除。参见价格与套餐。

Lightpanda

lightpanda 类型的会话运行 Lightpanda 1.0.2,一个为程序打造的浏览器:它获取页面、运行页面的脚本并保留 DOM,但没有布局引擎。在什么都不需要看见的场合,用它读取页面并在页面上操作;需要看见的场合,用 chromium-headless。它的创建、计价和限制都与其他类型相同,它的 cdp_url 和 ws_url 用法也一样。Lightpanda 是开源软件 (AGPL-3.0),在会话中按其开发者发布的原样运行。

按 Lightpanda 开发者给出的方式,用你自己的上下文和页面连接:连接时已经打开的那个页面是 Lightpanda 的起始页,它不会导航。

const browser = await chromium.connectOverCDP(session.cdp_url);   // Playwright
const context = await browser.newContext();
const page = await context.newPage();
await page.goto("https://example.com");
console.log(await page.textContent("h1"));

用 Puppeteer 时,先 puppeteer.connect({ browserURL: session.cdp_url })(或 browserWSEndpoint: session.ws_url),再用 (await browser.pages())[0] 或 browser.newPage()。

经由平台的边缘节点,用 Playwright 1.64 和 Puppeteer 24.43 试过的结果:

可用 不可用
加载页面、链接以及后退和前进(goto、会触发导航的点击、waitForURL 和 waitForNavigation、goBack、reload);读取页面(content、textContent、innerText、evaluate、$$eval、定位器、waitForSelector) 一个连接中的第二个页面(已有页面打开时再 newPage:TargetAlreadyLoaded),以及第二个上下文 (Cannot have more than one browser context at a time)。每个连接都是一个独立的浏览器:要另开页面,就另开一个连接(同时最多 16 个)
输入和点击(fill、type、keyboard.type、click) 录屏 (Page.startScreencast):没有可以推流的画面,会立即被拒绝,错误信息中会提到 chromium-headless
Cookie(context.cookies、addCookies;page.cookies、setCookie)、额外的请求头 (setExtraHTTPHeaders)、由客户端响应的请求(Playwright 的 page.route、Puppeteer 的请求拦截) 实时视图和配置文件 (400 kind_unsupported)
setViewportSize 和 setViewport、先于页面自身脚本运行的脚本(addInitScript、evaluateOnNewDocument)、exposeFunction、控制台消息、Puppeteer 的 accessibility.snapshot() 发给浏览器的超过 16 MiB 的消息
截图和 PDF(page.screenshot()、page.pdf()):只包含页面的文字,见下文

截图或 PDF 只包含页面的文字。Lightpanda 没有布局引擎:page.screenshot() 给出的是页面文字的 PNG,文字按块上下排列;page.pdf() 给出的是这些文字的 PDF。两者都不是人看到的页面样子:没有布局、没有图片,也没有页面自己的颜色。要得到渲染后的页面,用 chromium-headless。

限制

  • 同时运行:一个会话按一个 1 vCPU、2 GiB 的沙箱计,与账户的沙箱和方块实例一起,计入账户套餐允许同时运行的数量(免费版为 5 个:见限制)。
  • 永久关闭的端口:无论网络规则怎么写,会话的流量都不会到达 25、465 和 587 端口(邮件),也不会到达矿池监听的端口(3333、4444、5555、7777、14444、45700)。
  • 代理:在付费版上,会话的网页流量可以经由你自己的 HTTP 代理出站(自己的代理);免费版没有代理 (403 proxy_not_on_plan)。

下一步

  • 会话:调用、会话包含什么、名称、休眠与唤醒、新地址、自己的代理。
  • 实时视图与配置文件:观看会话的页面,以及保存在配置文件中的登录状态。
导航

输入以搜索……

↑↓ 切换↵ 选择Esc 关闭