
Ethan Collins
Pattern Recognition Specialist

TL;DR: 本指南展示了如何使用AI驱动的解决方案在Playwright浏览器自动化中绕过CAPTCHA。学习如何使用工作代码示例自动处理reCAPTCHA和Cloudflare Turnstile挑战。查看CapSolver的Playwright集成
在使用Playwright构建浏览器自动化时,遇到CAPTCHA挑战是一个常见的障碍,这可能会中断你的工作流程。无论你是进行数据抓取、运行自动化测试还是收集市场情报,这些挑战都会中断自动化过程并需要手动干预——这违背了编写脚本的初衷。
本指南介绍了如何将AI驱动的CAPTCHA绕过集成到你的Playwright自动化中,使你能够无缝处理reCAPTCHA和Cloudflare Turnstile挑战,而不会中断你的工作流程。
当网站检测到与典型人类浏览模式不同的行为时,就会出现CAPTCHA。常见的触发因素包括:
对于使用Playwright进行合法自动化任务的开发人员来说,了解CAPTCHA出现的原因有助于在它们出现时既能预防也能优雅处理。
像**CapSolver**这样的AI驱动CAPTCHA解决服务使用机器学习和计算机视觉来自动识别和解决挑战。该工作流程无缝集成到Playwright自动化中:
这种自动化方法消除了手动干预,使你的自动化持续运行。
行业数据显示,AI驱动的解决方案对常见挑战类型的准确率高达95-99%,使其成为生产自动化工作流的可靠选择。
首先,安装所需的依赖项:
npm install playwright capsolver
使用你的API密钥初始化CapSolver客户端:
const CapSolver = require('capsolver');
const capSolver = new CapSolver({ apiKey: 'YOUR_API_KEY' });
reCAPTCHA v2通常会显示复选框挑战或图像选择测试。这里是一个完整的集成示例:
const { chromium } = require('playwright');
async function solveRecaptchaV2Example() {
// 初始化CapSolver
const CapSolver = require('capsolver');
const solver = new CapSolver({ apiKey: 'YOUR_API_KEY' });
// 启动浏览器
const browser = await chromium.launch({ headless: false });
const page = await browser.newPage();
try {
// 导航到目标页面
await page.goto('https://example.com/login');
// 检测reCAPTCHA v2
const siteKey = await page.evaluate(() => {
const element = document.querySelector('[data-sitekey]');
return element ? element.getAttribute('data-sitekey') : null;
});
if (siteKey) {
console.log('检测到reCAPTCHA v2,正在解决...');
// 通过CapSolver解决
const solution = await solver.recaptcha({
websiteURL: page.url(),
websiteKey: siteKey,
isEnterprise: false
});
// 设置解决方案令牌
await page.evaluate((token) => {
const textarea = document.getElementById('g-recaptcha-response');
if (textarea) textarea.value = token;
}, solution.gRecaptchaResponse);
// 触发回调(如果存在)
const callback = await page.evaluate(() => {
const el = document.querySelector('[data-callback]');
return el ? el.getAttribute('data-callback') : null;
});
if (callback) {
await page.evaluate((cb) => {
eval(cb + '()');
}, callback);
}
console.log('reCAPTCHA v2 成功绕过');
}
// 继续你的自动化
await page.fill('#username', 'user@example.com');
await page.fill('#password', 'password123');
await page.click('#login-btn');
} catch (error) {
console.error('错误:', error.message);
} finally {
await browser.close();
}
}
solveRecaptchaV2Example();
reCAPTCHA v3在后台静默运行并返回一个分数,而不是显示视觉挑战。以下是处理它的方法:
const { chromium } = require('playwright');
async function solveRecaptchaV3Example() {
// 初始化CapSolver
const CapSolver = require('capsolver');
const solver = new CapSolver({ apiKey: 'YOUR_API_KEY' });
// 启动浏览器
const browser = await chromium.launch({ headless: false });
const page = await browser.newPage();
try {
await page.goto('https://example.com/dashboard');
// 提取reCAPTCHA v3网站密钥
const siteKey = await page.evaluate(() => {
const scripts = document.querySelectorAll('script[src*="recaptcha"]');
for (const script of scripts) {
const src = script.src;
const keyMatch = src.match(/k=([^&]+)/);
if (keyMatch) return keyMatch[1];
}
return null;
});
if (siteKey) {
console.log('检测到reCAPTCHA v3');
// 使用分数要求解决
const solution = await solver.recaptcha({
websiteURL: page.url(),
websiteKey: siteKey,
isEnterprise: false,
pageAction: 'homepage'
});
console.log('收到令牌,分数:', solution.score);
// 存储令牌用于API请求
await page.evaluate((token) => {
window.__captchaToken = token;
}, solution.gRecaptchaResponse);
// 在后续请求中使用令牌
const response = await page.evaluate(async (token) => {
const res = await fetch('/api/user-profile', {
headers: { 'X-Recaptcha-Token': token }
});
return await res.json();
}, solution.gRecaptchaResponse);
console.log('获取数据:', response);
}
} catch (error) {
console.error('错误:', error.message);
} finally {
await browser.close();
}
}
solveRecaptchaV3Example();
Cloudflare Turnstile以不可见的挑战或基于小部件的验证形式出现。这里是一个完整的解决方案:
const { chromium } = require('playwright');
async function solveCloudflareTurnstileExample() {
// 初始化CapSolver
const CapSolver = require('capsolver');
const solver = new CapSolver({ apiKey: 'YOUR_API_KEY' });
// 使用隐身设置启动浏览器
const browser = await chromium.launch({ headless: false });
const context = await browser.newContext({
viewport: { width: 1920, height: 1080 },
userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
});
const page = await context.newPage();
try {
await page.goto('https://example-protected.com/', {
waitUntil: 'domcontentloaded',
timeout: 30000
});
// 检查Cloudflare挑战
const isCFChallenge = await page.evaluate(() => {
return document.title.includes('Just a moment') ||
document.querySelector('#cf-challenge') !== null;
});
if (isCFChallenge) {
console.log('检测到Cloudflare挑战');
// 等待挑战渲染
await page.waitForTimeout(2000);
// 检测Turnstile小部件
const siteKey = await page.evaluate(() => {
const turnstile = document.querySelector('.cf-turnstile');
return turnstile ? turnstile.getAttribute('data-sitekey') : null;
});
if (siteKey) {
console.log('检测到Turnstile,正在解决...');
// 解决Turnstile
const solution = await solver.turnstile({
websiteURL: page.url(),
websiteKey: siteKey
});
console.log('收到令牌');
// 将令牌注入页面
await page.evaluate((token) => {
// 创建或更新令牌字段
let tokenField = document.querySelector('[name="cf-turnstile-response"]');
if (!tokenField) {
tokenField = document.createElement('input');
tokenField.type = 'hidden';
tokenField.name = 'cf-turnstile-response';
document.body.appendChild(tokenField);
}
tokenField.value = token;
// 触发任何回调
const turnstile = document.querySelector('.cf-turnstile');
if (turnstile && turnstile.dataset.callback) {
window[turnstile.dataset.callback](token);
}
}, solution.token);
// 等待挑战清除
await page.waitForTimeout(3000);
console.log('Cloudflare Turnstile 绕过成功');
}
}
// 验证页面加载
const title = await page.title();
console.log('页面标题:', title);
} catch (error) {
console.error('错误:', error.message);
} finally {
await browser.close();
}
}
solveCloudflareTurnstileExample();
这是一个结合检测、解决和重试逻辑的完整示例,适用于生产环境:
const { chromium } = require('playwright');
const CapSolver = require('capsolver');
class PlaywrightAutomation {
constructor(apiKey) {
this.solver = new CapSolver({ apiKey });
}
async detectAndSolve(page) {
// 检测reCAPTCHA v2
const reCaptchaV2Key = await page.evaluate(() => {
const el = document.querySelector('[data-sitekey]');
return el?.getAttribute('data-sitekey');
});
// 检测Cloudflare Turnstile
const turnstileKey = await page.evaluate(() => {
const el = document.querySelector('.cf-turnstile');
return el?.getAttribute('data-sitekey');
});
if (reCaptchaV2Key) {
console.log('正在解决reCAPTCHA v2...');
return await this.solveRecaptchaV2(page, reCaptchaV2Key);
}
if (turnstileKey) {
console.log('正在解决Cloudflare Turnstile...');
return await this.solveTurnstile(page, turnstileKey);
}
return null;
}
async solveRecaptchaV2(page, siteKey) {
const solution = await this.solver.recaptcha({
websiteURL: page.url(),
websiteKey: siteKey
});
await page.evaluate((token) => {
const textarea = document.getElementById('g-recaptcha-response');
if (textarea) textarea.value = token;
}, solution.gRecaptchaResponse);
return solution;
}
async solveTurnstile(page, siteKey) {
const solution = await this.solver.turnstile({
websiteURL: page.url(),
websiteKey: siteKey
});
await page.evaluate((token) => {
let tokenField = document.querySelector('[name="cf-turnstile-response"]');
if (!tokenField) {
tokenField = document.createElement('input');
tokenField.type = 'hidden';
tokenField.name = 'cf-turnstile-response';
document.body.appendChild(tokenField);
}
tokenField.value = token;
}, solution.token);
return solution;
}
async run(url, steps) {
const browser = await chromium.launch({ headless: false });
const page = await browser.newPage();
try {
await page.goto(url);
// 检查并解决CAPTCHA(如果需要)
await this.detectAndSolve(page);
// 执行你的自动化步骤
for (const step of steps) {
await step(page);
}
} finally {
await browser.close();
}
}
}
// 使用示例
const automation = new PlaywrightAutomation('YOUR_API_KEY');
automation.run('https://example.com/form', [
(page) => page.fill('#name', 'John Doe'),
(page) => page.fill('#email', 'john@example.com'),
(page) => page.click('#submit')
]).then(() => console.log('自动化完成'))
.catch(err => console.error('错误:', err));
网络数据抓取市场正在经历显著增长,因为组织越来越重视数据驱动的决策,这使得自动化解决方案在现代开发工作流中变得越来越重要。
如需更多详细示例,请参阅完整的Playwright集成文档并学习如何将CapSolver与Playwright集成。
是的,通过与AI驱动的CAPTCHA解决服务(如CapSolver)集成,Playwright可以自动检测和解决挑战。解决方案令牌会以编程方式提交,使自动化能够继续运行而无需人工干预。
AI驱动的求解通常在3-10秒内完成,这比人工替代方案快得多,人工方案可能需要10-45秒,包括排队时间。
是的,CapSolver支持reCAPTCHA v3,并且可以配置最低分数要求。您可以根据需要设置分数阈值(0.1-0.9),以适应不同严格程度的挑战。
虽然无法完全消除CAPTCHAs,但可以通过使用隐身浏览器设置、随机化操作间的时间间隔、轮换用户代理和使用住宅代理来减少其出现频率。然而,某些网站无论采取何种预防措施都会始终显示挑战。
对于失败的尝试,应实现带有指数退避的重试逻辑。CapSolver通常能成功处理大多数挑战,但复杂的变体可能偶尔需要多次尝试。适当的错误处理可确保您的自动化流程具有弹性。
是的,CapSolver 提供了Playwright、Puppeteer、Selenium和直接浏览器扩展的SDK和API支持。不同工具的集成方式类似,仅语法略有差异。
是的,当用于合法自动化目的时是安全的。CapSolver致力于道德技术实践,并提供帮助开发者更高效地自动化其授权工作流的服务。请确保您的自动化活动符合目标网站的服务条款和适用法律。查看CapSolver的合规指南以了解最佳实践。
网页抓取验证码指南:学习验证码类型、API处理、代理一致性、重试和合规使用。
