
Sora Fujimoto
AI Solutions Architect

TL;DR: このガイドでは、AIを活用したCAPTCHAの回避方法を紹介します。reCAPTCHAとCloudflare Turnstileのチャレンジを自動的に処理する方法を学びます。CapSolverのPlaywright統合を確認する
Playwrightを用いたブラウザ自動化を行う際、CAPTCHAチャレンジに遭遇することは一般的な障害であり、作業フローを停止させます。データスクリーニング、自動テストの実行、マーケットインテリジェンスの収集など、あらゆるシナリオでこの問題が発生し、自動化プロセスを妨げる手動の介入を必要とします。これはスクリプトの目的を損ないます。
このガイドでは、AIを活用したCAPTCHA回避をPlaywright自動化に統合する方法を説明し、reCAPTCHAとCloudflare Turnstileのチャレンジをシームレスに処理する方法を紹介します。
ウェブサイトが通常のユーザー行動パターンと異なると検出された場合、CAPTCHAが表示されます。一般的なトリガーには以下が含まれます:
Playwrightを正当な自動化タスクに使用する開発者にとって、CAPTCHAが表示される理由を理解することは、回避策を講じるだけでなく、発生した場合の対処法を理解する上で重要です。
AIを活用したCAPTCHA回避サービスである**CapSolver** は、機械学習とコンピュータービジョンを活用して、チャレンジを自動的に認識・解決します。このワークフローは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' });
// ステalth設定でブラウザを起動
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に統合する方法についても学ぶことができます。
はい、CapSolverなどのAIを活用したCAPTCHA解決サービスと統合することで、Playwrightは自動的にチャレンジを検出および解決できます。解決トークンがプログラム的に送信されるため、手動の介入なしに自動化を継続できます。
AIを活用した解決は、ほとんどのチャレンジタイプで3〜10秒で完了します。これは、キュー時間も含めて10〜45秒かかる人間による代替手段よりもはるかに高速です。
はい、CapSolverはreCAPTCHA v3をサポートしており、最小スコア要件を設定可能です。異なるチャレンジの厳格度レベルに応じて、スコアのしきい値(0.1〜0.9)を設定できます。
完全にCAPTCHAを排除することはできませんが、ステルスブラウザ設定を使用し、アクション間のタイミングをランダム化し、ユーザーエージェントをローテーションし、住宅用プロキシを使用することで、頻度を減らすことができます。ただし、一部のウェブサイトでは、どのような対策をとっても常にチャレンジを提示する場合があります。
失敗した場合にリトライロジックと指数関数的バックオフを実装してください。CapSolverはほとんどのチャレンジを成功させますが、複雑なバージョンはたまに複数回の試行が必要になる場合があります。適切なエラー処理により、自動化の耐障害性が確保されます。
はい、CapSolver はPlaywright、Puppeteer、Seleniumおよび直接ブラウザ拡張機能のためのSDKとAPIサポートを提供しています。統合方法はツールによって類似しており、構文の違いのみが生じます。
はい、正当な自動化目的で適切に使用すれば安全です。CapSolverは倫理的な技術実践にコミットしており、開発者が自身の承認済みワークフローを効率的に自動化するのに役立つサービスを提供しています。自動化活動が対象ウェブサイトの利用規約および関連する法律に準拠していることを確認してください。ベストプラクティスについては、CapSolverのコンプライアンスガイドラインを確認してください。
AI駆動と人間駆動のCAPTCHA解決サービスを、現代の自動化ワークフロー向けに速度、正確性、拡張性、信頼性、コスト効率において比較する。

reCAPTCHAソルバーの仕組み、トークンAPIの役割、およびCapSolverを活用した安全なQA、スクリーピング、オートメーションワークフローの計画方法について学びましょう。
