在 Playwright 中使用 CAPTCHA 求解服务

作者:solvethree阅读需 1 分钟

先完成 reCAPTCHA Enterprise 任务,再通过 Playwright 将 solution.token 提交到应用表单。该浏览器请求应使用相同的代理和返回的浏览器身份信息。

以下示例针对您拥有的 HTTPS 表单,其令牌字段和提交按钮均已知。这是从 SDK 到表单的显式交接,不是浏览器插件。

本页内容

准备依赖和自有页面

  1. 1.

    安装 Node.js 22+、Playwright 和 Chromium

    安装 playwright 包及其 Chromium 浏览器二进制文件。使用可下载的 solvethree-sdk-0.1.0.tgz 包安装官方 solvethree JavaScript SDK;Node.js 集成说明提供了通过直接下载进行安装的命令。

  2. 2.

    在 solvethree 中配置主机名

    您拥有的 HTTPS 页面的主机名必须具有当前工作区可用且已启用的 reCAPTCHA 配置。运行示例前,请先在控制台中完成设置。在任务中发送主机名和操作不会创建该配置。

  3. 3.

    设置三个环境变量

    将 TARGET_URL 设置为您拥有的 HTTPS 页面的完整 URL,将 SOLVETHREE_PROXY 设置为代理 URL,将 SOLVETHREE_API_KEY 设置为工作区 API 密钥。在服务端运行脚本;不要将 API 密钥放入页面 JavaScript 中。示例使用操作 login,如果您的应用使用其他操作,必须相应修改。

  4. 4.

    提供示例表单

    页面必须包含名为 g-recaptcha-response 的文本区域,以及无障碍名称恰好为 Submit 的按钮。如果您的表单不同,请在运行前调整下文所述的交接方式。

任务代理和 Playwright 浏览器代理需要分别配置。浏览器上下文代理不会自动代理 SDK 的服务端 API 请求。此示例为任务提供一个代理,并将其复用于浏览器的目标流量。

先求解,再通过 Playwright 提交

Playwright + Node.js · 为自有 HTTPS 表单求解
// Install playwright and the official solvethree SDK first.
import { chromium } from 'playwright';
import { Solvethree } from '@solvethree/sdk';

const target = new URL(process.env.TARGET_URL); // Your configured HTTPS page.
const proxy = new URL(process.env.SOLVETHREE_PROXY);
const client = new Solvethree({ apiKey: process.env.SOLVETHREE_API_KEY });
const result = await client.solve({
  site: target.hostname, action: 'login', proxy: process.env.SOLVETHREE_PROXY,
});
const browser = await chromium.launch();
try {
  const context = await browser.newContext({
    proxy: {
      server: `${proxy.protocol}//${proxy.host}`,
      username: decodeURIComponent(proxy.username),
      password: decodeURIComponent(proxy.password),
    },
    userAgent: result.solution.userAgent,
    extraHTTPHeaders: { 'sec-ch-ua': result.solution.secChUa },
  });
  const page = await context.newPage();
  await page.goto(target.href);
  // This example form has this field and a button named Submit.
  // Adapt the selectors/callback to your own application's form contract.
  await page.locator('[name="g-recaptcha-response"]').waitFor({ state: 'attached' });
  await page.locator('[name="g-recaptcha-response"]').evaluate((field, token) => {
    field.value = token;
    field.dispatchEvent(new Event('input', { bubbles: true }));
  }, result.solution.token);
  await Promise.all([
    page.waitForResponse(response =>
      response.request().method() === 'POST' &&
      new URL(response.url()).origin === target.origin),
    page.getByRole('button', { name: 'Submit', exact: true }).click(),
  ]);
  // Check your application's success response here.
} finally {
  await browser.close();
}

solve 只创建一次任务,并持续轮询,直到任务就绪或抛出异常。仅在该调用成功后才启动浏览器。浏览器上下文使用原始代理(包括任何经过 URL 编码的凭据),以及返回的 solution.userAgent 和 solution.secChUa。

表单接收的是 solution.token,而不是任务 ID。由于令牌文本区域不一定可见,示例会等待该字段挂载到页面。随后为其赋予令牌值,派发输入事件,再点击提交按钮。

  • TARGET_URL 属于您的应用。求解任务将其主机名作为 site 接收;Playwright 则导航到完整 URL。
  • login 是示例使用的操作。请将其替换为您的应用使用的操作。
  • [name="g-recaptcha-response"] 是示例的令牌字段选择器。如果您的应用通过其他字段或请求参数接收令牌,请替换此选择器。
  • Submit 是示例按钮的无障碍名称。请替换该定位器,或使用应用实际的提交路径。
  • 输入事件是此演示交接流程的一部分。实际应用还可能需要回调、应用状态更新、CSRF 值或现有会话。不存在通用的令牌填充回调。

如果表单不接受令牌

在付费进行下一次求解之前,请使用 Playwright 的请求和响应观察功能检查应用发出的请求。任务就绪表示已有可用解答;应用的响应才会告诉您提交是否被接受。

提交的令牌缺失或未更新。

检查实际请求参数,而不只是文本区域的值。

试试这样做: 通过应用实际的提交路径传递 solution.token。如果应用根据独立状态构建请求,仅更新演示字段不会有帮助。

请求包含令牌,但被拒绝。

将提交时的代理、用户代理、客户端提示、目标主机名和操作与求解时的值进行比较。检查应用的会话和 CSRF 要求。

试试这样做: 求解和提交时使用相同的代理,应用返回的浏览器身份信息,并在提交前满足应用的表单要求。

脚本在打开浏览器之前失败。

区分 HTTP 请求错误与已进入失败终态的任务。对于失败任务,请检查 errorCode 和 error。

试试这样做: 修正报告的输入、配置或连接问题,不要反复提交未经修改的输入。SDK 会在失败时抛出异常;不要继续执行令牌填充步骤。

运行您的第一个任务。

使用 $5 工作区额度开始体验。

创建工作区
在 Playwright 中使用 CAPTCHA 求解服务 · solvethree