云端浏览器

在云上运行 Chrome,用 Playwright 或 Puppeteer 操控,在 Console 实时观看与接管。

云端浏览器是一个在云上运行的 Chrome,可以用 Playwright 或 Puppeteer 直接连接操控,也可以在 Console 实时观看与接管。

三种用法

以下示例在 Node.js 中运行。先设置 PRAXIS_API_KEY,将代码保存为 .mjs 文件,再用 node 执行。只需安装客户端包,无需下载本地 Chrome。

export PRAXIS_API_KEY="你的 API Key"
npm install playwright @browserbasehq/sdk

一步连接

连接 wss://api-develop.deepraxis.ai/browser/v1/connect 即可新开一个浏览器。?session=<id> 连接已有会话;?name=<名称> 有就连接,没有就创建。名称可用 1–128 个字母、数字或 . _ : -,不能同时传 session 和 name。

import { chromium } from "playwright";

const headers = { Authorization: `Bearer ${process.env.PRAXIS_API_KEY}` };
const browser = await chromium.connectOverCDP(
  "wss://api-develop.deepraxis.ai/browser/v1/connect",
  { headers },
);
const cdp = await browser.newBrowserCDPSession();
const session = await cdp.send("Praxis.getSession");
console.log(session.sessionId, session.liveViewUrl, session.consoleUrl);
try {
  const page = await browser.contexts()[0].newPage();
  await page.goto("https://api-develop.deepraxis.ai/meta/v1/health");
  console.log(await page.textContent("body"));
} finally {
  await browser.close();
  // 用完立即释放,停止计费。
  const closed = await fetch(
    `https://api-develop.deepraxis.ai/browser/v1/sessions/${session.sessionId}`,
    { method: "POST", headers: { ...headers, "Content-Type": "application/json" },
      body: JSON.stringify({ status: "REQUEST_RELEASE" }) },
  );
  if (!closed.ok) throw new Error(await closed.text());
}

新建时还可带 context、persist、timeout(秒)、idle(毫秒)、labels 和 viewport。后两项用 JSON.stringify 配合 URLSearchParams 编码;连接已有会话时,这些新建参数不生效。创建会话返回的 connectUrl 自带凭证,连接时无需再带 API Key;不要公开此地址。

Browserbase 官方 SDK

使用自己的 API Key,把官方 SDK 的 baseURL 设为 https://api-develop.deepraxis.ai/browserbase。SDK 自动发送 X-BB-API-Key。无需 Browserbase 项目,projectId 可省略。

import Browserbase from "@browserbasehq/sdk";
import { chromium } from "playwright";

const bb = new Browserbase({
  apiKey: process.env.PRAXIS_API_KEY,
  baseURL: "https://api-develop.deepraxis.ai/browserbase",
});
const session = await bb.sessions.create({ timeout: 300, keepAlive: true });
try {
  const browser = await chromium.connectOverCDP(session.connectUrl);
  try {
    const page = await browser.contexts()[0].newPage();
    await page.goto("https://api-develop.deepraxis.ai/meta/v1/health");
    console.log(await page.textContent("body"));
  } finally {
    await browser.close();
  }
} finally {
  await bb.sessions.update(session.id, { status: "REQUEST_RELEASE" });
}

可调用的端点见 Browserbase 兼容 API。代理、反检测、扩展和 Selenium 不可用;region、solveCaptchas 当前接受但忽略,不会选区域或代解验证码。

REST 先创建再连接

POST /browser/v1/sessions 返回的 connectUrl 包含连接凭证,有效期覆盖会话寿命。直接交给 Playwright 或 Puppeteer,无需再传 API Key。

import { chromium } from "playwright";

const base = "https://api-develop.deepraxis.ai/browser/v1";
const headers = {
  Authorization: `Bearer ${process.env.PRAXIS_API_KEY}`,
  "Content-Type": "application/json",
};
const response = await fetch(`${base}/sessions`, {
  method: "POST", headers, body: JSON.stringify({ timeout: 300, keepAlive: true }),
});
if (!response.ok) throw new Error(await response.text());
console.log("X-Request-Id:", response.headers.get("X-Request-Id"));
const session = await response.json();
try {
  const browser = await chromium.connectOverCDP(session.connectUrl);
  try {
    const page = await browser.contexts()[0].newPage();
    await page.goto("https://api-develop.deepraxis.ai/meta/v1/health");
    console.log(await page.textContent("body"));
  } finally {
    await browser.close();
  }
} finally {
  const closed = await fetch(`${base}/sessions/${session.id}`, {
    method: "POST", headers, body: JSON.stringify({ status: "REQUEST_RELEASE" }),
  });
  if (!closed.ok) throw new Error(await closed.text());
}

完整请求参数见云端浏览器 API。Puppeteer 使用 puppeteer.connect({ browserWSEndpoint: session.connectUrl }) 连接同一地址。

实时观看与接管

打开 Console 的 浏览器 › 会话,选择会话即可观看并接管。程序也可通过 CDP 命令 Praxis.getSession 取得 sessionId、liveViewUrl 和 consoleUrl。需要用户完成登录或确认操作时,调用请求人工接管,完成后调用完成人工接管。

会话状态为 PENDING、RUNNING、ERROR、TIMED_OUT 或 COMPLETED。API 创建且 keepAlive=false 的会话在客户端断开且无人观看后结束;一步连接和 Console 打开的会话默认在无人连接或观看 5 分钟后释放。单次最长 6 小时。没有暂停或休眠;下次继续使用登录态,需要 Context。

登录态

先创建 Context,再在创建会话时传 browserSettings.context。persist: true 会在会话关闭时保存 cookie 与 localStorage;不保存 IndexedDB。同一登录态正在被写入时,另一会话可能收到 409 CONTEXT_LOCKED。

// 接上面的 REST 初始化代码;contextId 为创建 Context 返回的 id。
const response = await fetch(`${base}/sessions`, {
  method: "POST", headers,
  body: JSON.stringify({
    timeout: 300,
    browserSettings: { context: { id: contextId, persist: true } },
  }),
});

计费与限制

  • $0.12 / 浏览器小时,按秒计费,单会话 1 分钟起。平台原因导致的失败只按实际秒数计费;释放后不再计费。
  • 每个账户默认最多同时 10 个会话,每个会话最长 6 小时。
  • 不支持代理、验证码代解、反检测、选区域或扩展。代理、反检测和扩展等不支持的配置返回 501;region、solveCaptchas 当前接受但忽略。
  • 部分网站(如 Google、百度)会把云端浏览器识别为机器人。
  • 排查请求时保留响应头 X-Request-Id。
导出

本页内容