尚未开放。浏览器还没有向账户开放。本页按目前正在构建的样子介绍它,开放前可能还会变化。
调用
| 调用 | 作用 |
|---|---|
POST /v1/browsers |
创建一个处于运行状态的会话 (201);或者返回项目中同名的会话 (200),并把它原样唤醒。 |
GET /v1/browsers |
项目的会话,最新的在前,从 cursor 之后取一页,每页 limit 个(默认 100,最多 1,000);可按 status、kind 和 name 筛选。 |
GET /v1/browsers/{id} |
一个会话,按 id 或名称指定。 |
PATCH /v1/browsers/{id} |
修改它的时间设置、元数据或代理。 |
POST /v1/browsers/{id}/sleep |
立即让它休眠。 |
POST /v1/browsers/{id}/rotate-url |
换新地址:旧地址失效。 |
DELETE /v1/browsers/{id} |
结束会话:它的浏览器、页面和机器 (204)。用需要保存的配置文件创建的会话会先保存配置文件,除非带 ?save_profile=false。 |
GET /v1/browsers/{id}/live, POST /v1/browsers/{id}/profile |
实时观看其页面的地址;立即保存它的配置文件(实时视图与配置文件)。 |
GET /v1/browsers/profiles, GET, DELETE /v1/browsers/profiles/{name} |
项目的配置文件。 |
创建、修改、让会话休眠和结束会话需要有 write 权限范围的密钥;读取会话需要 read。会话的地址是凭据,没有 url 权限范围的密钥读到的 cdp_url 和 live_url 为 null。
创建会话
每个字段都可以省略:
| 字段 | 说明 |
|---|---|
kind |
chromium-headless(默认):Chromium 的 headless shell。chromium:完整的 Chromium,运行在一块 1280×800 的屏幕上。lightpanda:Lightpanda,没有布局引擎(它的截图和 PDF 只包含页面的文字):与它一起使用 profile 会被拒绝 (400 kind_unsupported)。其他类型会被拒绝 (400 unknown_kind)。 |
name |
1 到 63 个小写字母、数字和连字符,与沙箱的名称规则相同,同一时间在项目中只属于一个沙箱。用项目中已有会话的名称创建,返回的就是那个会话(见下文)。 |
region |
na、eu 或 ap:在哪里创建。不指定时,为控制平面所在的区域。 |
sleep_after_seconds |
最后一个连接关闭(以及最后一个请求结束)多久之后进入休眠:1 到 3,600 秒,默认 10 秒。 |
connection_idle_seconds |
到浏览器的连接在两个方向上都没有任何数据多久之后被关闭:60 到 86,400 秒,默认 600 秒。 |
delete_after_idle_seconds |
休眠多久之后被删除:60 秒到一年。不设置时,它不会因为休眠而被删除。 |
metadata |
你自己的键和值,都是字符串。不能用键 product,它归平台使用 (400 reserved_metadata)。 |
profile |
{name, save, version}:在返回会话之前加载的配置文件(最新版本,或 version 指定的版本);save 为 true 时,会话被删除时会再次保存它。 |
proxy |
你自己的代理 {"url": "http://user:password@host:port"},仅限付费版:会话的网页流量经由它出站(自己的代理)。免费版上返回 403 proxy_not_on_plan。 |
POST /v1/browsers
{"name": "agent-42", "region": "eu", "sleep_after_seconds": 30}返回的是会话 (201),带 Location: /v1/browsers/<id>。创建请求接受 Idempotency-Key,以同一个键再次发送的请求返回与第一次相同的结果。
创建可能因为超出套餐允许账户同时运行的数量而被拒绝(403 plan_cap_reached,param 为 instances、vcpus 或 memory_bytes),也可能因为此刻没有机器能容纳它而被拒绝(503 no_capacity,retryable)。没有为该类型提供镜像的控制平面不会创建这种会话(503 not_served_here,param 为 kind)。浏览器无法启动的会话(拿不到镜像,或浏览器没有起来)不算会话:创建会被拒绝(503 session_failed,retryable),message 中带有机器给出的信息和错误码,会话不会留下任何东西。
会话包含什么
| 字段 | 说明 |
|---|---|
id |
它的沙箱的 id (sbx-…):/v1/sandboxes/{id}/… 的每个调用对它也有效。 |
name, kind, region |
与创建时相同。region 是持有它的机器所在的区域。 |
status |
运行时为 awake,休眠时(或被保持在休眠状态时)为 asleep,机器无法访问时为 unavailable,停止且没有恢复时为 failed。会话失败时会发出 browser.failed 事件。 |
error |
失败的原因 {code, message},由它的机器给出;status 不是 failed 时为 null。 |
cdp_url |
CDP 客户端连接的地址:浏览器端口的签名地址 https://9222-<id>-<signature>.<preview domain>。凭据就在主机名中。 |
live_url |
实时观看和操控其页面(chromium 会话则是它的屏幕)的地址:见实时视图。 |
profile |
创建它时所用的或最近一次保存的配置文件:{name, save, version};没有时为 null。 |
connections |
当前打开的、让它保持运行的连接:客户端的连接和观看者的连接。 |
sleep_after_seconds, connection_idle_seconds, delete_after_idle_seconds |
它的时间设置,同上。 |
metadata, created_at |
你设置的元数据;创建时间。 |
proxy |
它自己的代理 {url, username}:代理的地址 (http://host:port) 和访问代理时使用的用户名,从不包含密码。没有时为 null。 |
usage.awake_seconds |
它已运行的时长,按账单的计法,精确到毫秒。 |
usage.proxy_bytes |
自创建以来经过其代理的流量,两个方向合计,精确到字节;usage.proxy_sent_bytes 和 usage.proxy_received_bytes 分别是每个方向的流量。 |
同一个名称,同一个会话
用项目中已有会话的名称创建,返回的就是那个会话 (200),它会被原样唤醒,页面也保持原样:智能体每一轮都请求 agent-42,拿回的都是同一个浏览器。和任何唤醒一样,这次唤醒受套餐允许账户同时运行的数量限制。同时用同一个名称发起两次创建,只会创建一个会话,两次请求都返回它。
项目中普通沙箱已经在用的名称会被拒绝 (409 name_taken):沙箱不会变成会话。另一种类型的会话的名称也会被拒绝;profiles 同样会被拒绝 (400 invalid_name),因为它是配置文件的地址。
运行与休眠
只要有客户端连接着它的浏览器(或 chromium 会话的屏幕),会话就保持运行,无论页面在做什么;页面自己的定时器和网络活动不会让它保持运行。最后一个连接关闭(以及最后一个请求结束)sleep_after_seconds 秒后,它连同内存和磁盘一起进入休眠:醒来时,标签页和页面都还在。在 connection_idle_seconds 秒内两个方向都没有任何数据的连接会被关闭,所以没有关闭连接就离开的客户端不会让会话一直运行。
POST /v1/browsers/{id}/sleep立即让它休眠。已打开的连接保持打开,连接上的下一条消息会唤醒会话。- 连接它的地址就会唤醒它。
PATCH /v1/browsers/{id}可以修改sleep_after_seconds、connection_idle_seconds、delete_after_idle_seconds、metadata(整体替换)和proxy;null把时间恢复为默认值,delete_after_idle_seconds: null让它永久保留,proxy: null去掉代理。
新地址
POST /v1/browsers/{id}/rotate-url 为会话的地址换一个新的机密。之前给出的所有地址从此都会被拒绝 (401 invalid_link),经由它们建立的连接(包括 CDP 客户端的连接)会在调用返回之前断开。返回的是带有新 cdp_url 的会话。地址被不该看到的人看到时,就这样做。
自己的代理
在付费版上,会话可以把网页流量经由你自己的 HTTP 代理发出:创建会话时给它 proxy,或者之后再修改。
POST /v1/browsers
{"name": "agent-42", "proxy": {"url": "http://user:password@proxy.example.com:3128"}}- 哪些流量经过它:会话到 80 和 443 端口的 TCP 连接,也就是浏览器加载页面所用的连接。在运行浏览器的机器上,浏览器旁边有一个中继,它读取每个连接的去向(TLS 握手中的服务器名称,HTTP 请求的
Host),然后请你的代理建立一条通往那里的隧道(CONNECT name:port,你的凭据放在Proxy-Authorization: Basic请求头中)。网站看到的是你的代理的地址,域名在代理处解析。隧道里的内容不会被读取或修改:TLS 仍然在浏览器和网站之间进行。 - QUIC 会被拒绝:到 443 端口的 UDP 流量(任何 HTTP 代理都不承载它)不会离开会话,所以浏览器会经由代理、通过 TCP 使用 HTTP。到其他任何端口的连接照常出站,就像没有代理一样。
- 浏览器并不知情:浏览器的设置里没有任何代理,也不会为此重启任何东西,会话内部也没有任何东西持有凭据(没有文件、环境变量或进程)。凭据由运行会话的机器保管,API 的任何返回中都没有它们:
proxy只显示地址和用户名。 - 代理必须是接受到 80 和 443 端口的
CONNECT的 HTTP 代理(Squid 只放行到 443 端口的CONNECT,除非你也允许 80 端口),位于互联网上的某个主机名或地址:只支持http://,用户名和密码中含有 URL 不接受的字符(@、:、/)时,要写成%XX。通过 TLS 访问的代理 (https://)、SOCKS,以及沙箱无法访问的地址(私有地址段、链路本地地址、环回地址)都会被拒绝,返回 400invalid_proxy(param为proxy.url);错误信息从不复述这个 URL。 - 修改代理:用
PATCH /v1/browsers/{id}设置另一个proxy,或设为null不用代理,从下一个连接起生效:浏览器和页面照常继续,之前经过代理的连接会被断开,浏览器会打开新的连接,按会话现在的设置出站。 - 代理不建立隧道时(连不上代理,或代理对
CONNECT的响应不是 2xx,比如凭据不被接受时的 407):通过 HTTP 加载的页面会得到 502proxy_failed,错误信息会说明代理的地址和它的响应,但从不包含凭据;通过 HTTPS 加载的页面会在 TLS 握手时失败。会话所在的机器会把这件事记入日志,不含凭据。 - 费用:经过代理的流量按两个方向计数 (
usage.proxy_bytes),和其他流量一样算作会话的流量:发往你的代理的流量属于出站流量,按沙箱的价格计费。 - 不能与请求规则同时使用:如果会话的网络规则会读取它的请求(
inject、http),它就不能使用代理,返回 400invalid_proxy;按地址、按端口和按名称的规则,对经过代理的流量和其他流量同样有效。 - 代理只属于会话:普通沙箱不接受代理 (400
unknown_field)。
会话的网络
会话和沙箱一样访问互联网,但从不访问 25、465 和 587 端口(邮件)以及矿池监听的端口(3333、4444、5555、7777、14444、45700):它的机器会在一切规则之前拒绝这些连接。会话的网络规则用 PATCH /v1/sandboxes/{id} 的 egress 修改,无论规则怎么写,这些端口都保持关闭。