当您的 Playwright 自动化流程需要稳定的验证码解决路径和实用的 API 集成指导时,请使用此页面。
Death By Captcha (DBC) 让 Playwright 脚本通过 API 解决验证码挑战,而无需手动交互:脚本从页面提取挑战参数、向 DBC 请求解答、将结果注入页面,然后继续流程。本页是快速入门:安装、可运行的代码示例以及受支持任务的说明。
const { chromium } = require('playwright');
const { HttpClient } = require('deathbycaptcha-lib');
const client = new HttpClient(process.env.DBC_USERNAME, process.env.DBC_PASSWORD);
const DEMO_URL = 'https://www.google.com/recaptcha/api2/demo';
async function solveRecaptchaV2(pageUrl, sitekey) {
const balance = await new Promise((resolve, reject) =>
client.get_balance((b) => (b ? resolve(b) : reject(new Error('Could not read balance')))));
if (balance <= 0) throw new Error('No balance - top up before solving.');
return new Promise((resolve, reject) =>
client.decode(
{ extra: { type: 4, token_params: JSON.stringify({ googlekey: sitekey, pageurl: pageUrl }) } },
(solution) => (solution && solution.text ? resolve(solution.text) : reject(new Error('No solution yet - retry')))
));
}
(async () => {
const browser = await chromium.launch();
const page = await browser.newPage();
await page.goto(DEMO_URL, { timeout: 60000 });
// 1. extract the challenge parameters
const sitekey = await page.getAttribute('#recaptcha-demo', 'data-sitekey');
// 2. request the solution token from DBC (type 4 = reCAPTCHA v2 token)
const token = await solveRecaptchaV2(DEMO_URL, sitekey);
// 3. inject the token and trigger the page callback
await page.evaluate((t) => {
const el = document.getElementById('g-recaptcha-response');
if (!el) return;
el.style.display = 'block';
el.value = t;
el.dispatchEvent(new Event('input', { bubbles: true }));
el.dispatchEvent(new Event('change', { bubbles: true }));
const cfg = window.___grecaptcha_cfg;
if (!cfg || !cfg.clients) return;
for (const k of Object.keys(cfg.clients)) {
const c = cfg.clients[k];
for (const key of Object.keys(c)) {
const item = c[key];
if (item && typeof item.callback === 'function') return item.callback(t);
if (item && item.W && typeof item.W.callback === 'function') return item.W.callback(t);
}
}
}, token);
// 4. submit and wait for success
await page.click('#recaptcha-demo-submit');
await page.waitForSelector('.recaptcha-success', { timeout: 15000 });
console.log('solved');
await browser.close();
})();
| 主题 | 说明 |
|---|---|
| 验证码类型(API) | reCAPTCHA v2 和 v3、Cloudflare Turnstile、GeeTest、DataDome,以及图片/文字验证码。 |
| 余额 | 解答从账户余额中扣费;解码前请检查余额。 |
| 重试 | 未返回解答表示临时情况:请像官方示例那样以退避方式重试。 |
| API 与扩展 | 此流程在脚本内使用 API;浏览器扩展是用于手动浏览的免代码路径。 |
| 支持的浏览器 | 通过 Playwright 支持 Chromium、Firefox 和 WebKit(示例已在 Chromium 上验证)。 |
| 面积 | 为什么这很重要 | 推荐做法 |
|---|---|---|
| 代理一致性 | 降低代币流中的验证不匹配风险。 | 在自动化环境中保持解决和提交路径一致。 |
| 暂停纪律 | 防止队列停滞和不稳定的 CI 运行。 | 使用具有确定性回退处理的有界重试。 |
| 特定类型的处理 | 不同的挑战类别需要不同的有效负载字段。 | 从 API 类型页面开始,一次验证一种类型。 |
对于 Playwright 验证码解算器的推出,首先验证一种验证码类型,然后通过可靠性和生产规模的定价检查来扩大覆盖范围。