在 Playwright 中使用 CAPTCHA 求解服务
先完成 reCAPTCHA Enterprise 任务,再通过 Playwright 将 solution.token 提交到应用表单。该浏览器请求应使用相同的代理和返回的浏览器身份信息。
以下示例针对您拥有的 HTTPS 表单,其令牌字段和提交按钮均已知。这是从 SDK 到表单的显式交接,不是浏览器插件。
本页内容
准备依赖和自有页面
- 1.
安装 Node.js 22+、Playwright 和 Chromium
安装
playwright包及其 Chromium 浏览器二进制文件。使用可下载的solvethree-sdk-0.1.0.tgz包安装官方 solvethree JavaScript SDK;Node.js 集成说明提供了通过直接下载进行安装的命令。 - 2.
在 solvethree 中配置主机名
您拥有的 HTTPS 页面的主机名必须具有当前工作区可用且已启用的 reCAPTCHA 配置。运行示例前,请先在控制台中完成设置。在任务中发送主机名和操作不会创建该配置。
- 3.
设置三个环境变量
将
TARGET_URL设置为您拥有的 HTTPS 页面的完整 URL,将SOLVETHREE_PROXY设置为代理 URL,将SOLVETHREE_API_KEY设置为工作区 API 密钥。在服务端运行脚本;不要将 API 密钥放入页面 JavaScript 中。示例使用操作login,如果您的应用使用其他操作,必须相应修改。 - 4.
提供示例表单
页面必须包含名为
g-recaptcha-response的文本区域,以及无障碍名称恰好为Submit的按钮。如果您的表单不同,请在运行前调整下文所述的交接方式。
任务代理和 Playwright 浏览器代理需要分别配置。浏览器上下文代理不会自动代理 SDK 的服务端 API 请求。此示例为任务提供一个代理,并将其复用于浏览器的目标流量。
先求解,再通过 Playwright 提交
// 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 会在失败时抛出异常;不要继续执行令牌填充步骤。
来源与 API 参考
运行您的第一个任务。
使用 $5 工作区额度开始体验。