AWSのCaptcha/チャレンジをPHPで解決する方法: 包括的なガイド

Sora Fujimoto
AI Solutions Architect
10-Dec-2025

TLDR (長すぎて読まない)
このガイドでは、PHPとCapSolver APIを使用してAWS WAF CAPTCHAおよびChallengeページをバイパスする包括的なステップバイステップのチュートリアルを提供します。CAPTCHA(HTTP 405)とChallenge(HTTP 202)の応答を検出するロジック、必要なパラメータの抽出、および結果として得られるaws-waf-tokenクッキーを使用して保護されたリソースにアクセスする方法について詳しく説明します。
イントロダクション
AWS CAPTCHAについて掘り下げ、それを実装するPHPソルバーについて説明します。開発者やウェブスクリーパーにとって、CAPTCHAに遭遇することは大きな障害となる可能性がありますが、適切なツールがあれば、これは管理可能なタスクになります。
AWS WAF CAPTCHAとChallengeとは何ですか?
AWS WAF(Web Application Firewall)は、ウェブアプリケーションを一般的なウェブの攻撃から保護するセキュリティサービスです。これは、リクエストが正当な人間ユーザーから発信されていることを確認するために、CAPTCHAとChallengeの2つの主要なアクションを提供します。
AWS WAFアクションの概要
| アクション | 目的 | HTTPステータスコード | 必要な解決方法 |
|---|---|---|---|
| Challenge | クライアントセッションが標準的なブラウザであることを確認する静かなバックグラウンド検証を実行します。 | 202 Accepted |
JavaScriptチャレンジを解決してトークンを取得する必要があります。 |
| CAPTCHA | エンドユーザーが視覚的なパズルを解決して人間であることを証明する必要があります。 | 405 Method Not Allowed |
ページから特定のパラメータを抽出する必要がある視覚的なCAPTCHAを解決する必要があります。 |
CAPTCHAまたはChallengeが成功裏に解決されると、AWS WAFは有効なトークンを発行し、aws-waf-tokenという名前のクッキーとして返されます。このトークンは、WAFの保護を回避するために後続のリクエストに含める必要があります。
🔎 CapSolverとPHPを使用してAWS CAPTCHA/Challengeを解決する方法
CapSolverは、AWS WAFによって提示される静かなChallengeと視覚的なCAPTCHAの両方を処理する強力なAPIソリューションを提供します。このガイドでは、PHPのcURLライブラリを使用して必要なロジックを実装する方法について説明します。
📕 要件
- PHP(cURL拡張機能が有効)
- cURL
- CapSolver APIキー(CapSolverに登録することで取得できます)
🛠️ ステップ1: 環境の設定とヘルパー関数の作成
このソリューションのコアは、CapSolver APIへの2つの主要なAPIコール、createTaskでCAPTCHA/Challengeを送信し、getTaskResultで解決結果を取得するものです。
PHP
<?php
// --- 設定 ---
$PROXY = "http://username:password@host:port"; // オプション: プロキシの詳細を置き換えてください(例: AntiAwsWafTask 用)
$PAGE_URL = "https://norway-meetup.aws.wslab.no/"; // AWS WAFで保護されたターゲットURLに置き換えてください
$CLIENT_KEY = "YourPayPerUsage"; // CAPSOLVER APIキーに置き換えてください
/**
* CapSolver APIにタスクを送信します。
* @param array $payload タスクペイロード、タイプとパラメータを含みます。
* @return array APIの応答、タスクIDを含みます。
*/
function createTask($payload) {
global $CLIENT_KEY;
$ch = curl_init();
echo("タスクを作成しています...\n");
curl_setopt($ch, CURLOPT_URL, 'https://api.capsolver.com/createTask');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(['clientKey' => $CLIENT_KEY, 'task' => $payload]));
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
$response = curl_exec($ch);
curl_close($ch);
return json_decode($response, true);
}
/**
* CapSolver APIからタスク結果をポーリングします。
* @param string $taskId 検証するタスクID
* @return array APIの応答、解決内容を含みます。
*/
function getTaskResult($taskId) {
global $CLIENT_KEY;
do {
echo("解決待ち...\n");
sleep(1);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.capsolver.com/getTaskResult');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(['clientKey' => $CLIENT_KEY, 'taskId' => $taskId]));
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
if (isset($data['status']) && $data['status'] == "ready") {
return $data;
}
// getTaskResultの結果取得エラー処理
if (isset($data['errorId']) && $data['errorId'] != 0) {
echo("タスク結果の取得エラー: " . $data['errorDescription'] . "\n");
return null;
}
} while(true);
}
/**
* 必要なタスクタイプを使用してAWS WAF ChallengeまたはCaptchaを解決します。
* @param string $taskType CapSolverタスクタイプ(AntiAwsWafTaskまたはAwsCaptchaTask)
* @param array $params タスクに必要なパラメータ
* @return string|null aws-waf-tokenクッキーの値または失敗時はnull
*/
function solveAwsWaf($taskType, $params) {
global $PAGE_URL, $PROXY;
$payload = [
'type' => $taskType,
'websiteURL' => $PAGE_URL,
'proxy' => $PROXY,
];
// タスクの特定パラメータをマージ
$payload = array_merge($payload, $params);
// リクエストをよりクリーンにするために空値をクリーンアップ
$payload = array_filter($payload, function($value) {
return $value !== "" && $value !== null;
});
$taskData = createTask($payload);
if (isset($taskData['taskId'])) {
$result = getTaskResult($taskData['taskId']);
if ($result && isset($result['solution']['cookie'])) {
return $result['solution']['cookie'];
}
}
return null;
}
⚡ ステップ2: WAF検出と解決ロジックの実装
主要なロジックは、保護されたページに初期リクエストを送信し、HTTPステータスコードをチェックしてChallenge(202)またはCAPTCHA(405)が必要かを判断することです。その後、正規表現を使用してHTMLレスポンスボディから必要なパラメータを抽出します。
PHP
// --- 主な実行ロジック ---
// 1. 保護されたページへの初期リクエスト
$ch = curl_init($PAGE_URL);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$cookie = null;
echo("初期HTTPコード: " . $httpCode . "\n");
if ($httpCode == 202) {
// --- Challenge (202)処理 ---
echo("Challengeが検出されました (HTTP 202)。パラメータを抽出しています...\n");
// challenge.jsのURLを抽出
preg_match('/<script src="([^"]*token.awswaf.com[^"]*)"/', $response, $matches);
$awsChallengeJS = $matches[1] ?? null;
if ($awsChallengeJS) {
$params = ['awsChallengeJS' => $awsChallengeJS];
$cookie = solveAwsWaf("AntiAwsWafTask", $params);
} else {
echo("エラー: Challenge用のawsChallengeJSが見つかりません。\n");
}
} elseif ($httpCode == 405) {
// --- CAPTCHA (405)処理 ---
echo("CAPTCHAが検出されました (HTTP 405)。パラメータを抽出しています...\n");
// ページコンテンツからパラメータを抽出
preg_match('/<script src="([^"]*token.awswaf.com[^"]*)"/', $response, $matches);
$awsChallengeJS = $matches[1] ?? null;
preg_match('/"key":"(.*?)"/', $response, $matches);
$awsKey = $matches[1] ?? null;
preg_match('/"iv":"(.*?)"/', $response, $matches);
$awsIv = $matches[1] ?? null;
preg_match('/"context":"(.*?)"/', $response, $matches);
$awsContext = $matches[1] ?? null;
if ($awsKey && $awsIv && $awsContext) {
$params = [
'awsKey' => $awsKey,
'awsIv' => $awsIv,
'awsContext' => $awsContext,
'awsChallengeJS' => $awsChallengeJS // オプションですが推奨されます
];
// 注意: 視覚的なCAPTCHAのタスクタイプは通常AntiAwsWafTaskのままですが、CapSolver側で解決タイプは送信されたパラメータによって決定されます。
$cookie = solveAwsWaf("AntiAwsWafTask", $params);
} else {
echo("エラー: CAPTCHA用のKey、IV、またはContextパラメータが見つかりません。\n");
}
}
// 3. トークンを使用して保護されたリソースにアクセス
if ($cookie) {
echo("aws-waf-tokenを成功裏に取得しました。最終リクエストを行います...\n");
$ch = curl_init($PAGE_URL);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
// aws-waf-tokenクッキーを設定
curl_setopt($ch, CURLOPT_COOKIE, "aws-waf-token=" . $cookie);
$finalResponse = curl_exec($ch);
curl_close($ch);
echo "\n--- 最終ページのコンテンツ ---\n";
echo $finalResponse;
echo "\n--------------------------\n";
} else {
echo("AWS WAFチャレンジ/CAPTCHAの解決に失敗しました。\n");
}
?>
コード最適化の注意点
元のコードでは、solveAwsChallengeとsolveAwsCaptchaという別々の関数が使用されており、パラメータ名の不一致(key、iv、context と awsKey、awsIv、awsContext)がありました。最適化されたコードでは、これらを1つのsolveAwsWaf関数に統合し、最新のCapSolver APIドキュメントに従って一貫性を保証しています。このアプローチは、モジュール性が高く、メンテナンスが容易です。
このロジックは、ウェブスクリーピングや自動化タスクに非常に効果的です。他の言語で作業している場合は、"PythonでAWS CAPTCHA/Challengeを解決する方法" [https://www.capsolver.com/blog/how-to-solve-aws-captcha-challenge-with-python] などのガイドも提供しており、同様のAPIパターンを使用しています。
結論
AWS WAFのChallengeとCAPTCHAメカニズムは、ボット対策として効果的ですが、乗り越えることは不可能ではありません。PHPでロバストな検出と解決ロジックを実装し、CapSolver APIの力を活用することで、開発者は保護されたリソースにアクセスするために必要なaws-waf-tokenを信頼性を持って取得できます。安定した大規模な自動化には、専門的なソルバーを統合することが不可欠です。詳しくは、AWS WAF CAPTCHAソルバー: スクレイパー用のトークンと画像解決 などを参照してください。
主なポイント
- AWS WAFアクション: AWS WAFは、ボットをブロックするために静かなChallenge(HTTP 202)または視覚的なCAPTCHA(HTTP 405)を使用します。
- 目標: 最終的な目的は、
aws-waf-tokenクッキーの値を取得することです。 - CapSolver API:
AntiAwsWafTaskタスクタイプは、ChallengeとCAPTCHAの両方を解決し、必要なパラメータがCapSolver側で解決タイプを決定します。 - PHP実装: PHPのcURLはリクエストに使用され、
preg_matchはHTMLソースから動的なパラメータ(awsChallengeJS、awsKey、awsIv、awsContext)を抽出するために不可欠です。 - 信頼性: 安定した大規模な自動化には、CapSolverのような専門的なソルバーの統合が不可欠です。AWS WAF CAPTCHAソルバー: スクレイパー用のトークンと画像解決 などのリソースで詳しく説明されています。
FAQ: よくある質問
Q1: なぜ HTTP ステータスコード (202 または 405) を確認する必要がありますか?
A: HTTPステータスコードは、必要なWAFアクションのタイプを判断する最も信頼性の高い指標です。202 Acceptedステータスコードは、静かなChallengeが有効であり、最小限のパラメータで済むことを示します。405 Method Not Allowedステータスコードは、視覚的なCAPTCHAが有効であり、ページのJavaScript変数からkey、iv、contextなどの特定のパラメータを抽出する必要があることを示します。
Q2: AntiAwsWafTaskとAntiAwsWafTaskProxyLessの違いは何ですか?
A: 両方のタスクタイプはAWS WAFチャレンジを解決するために設計されています。主な違いはプロキシの要件です。AntiAwsWafTaskでは、リクエストペイロードに独自のプロキシを提供する必要があります。AntiAwsWafTaskProxyLessでは、CapSolverがプロキシの使用を内部で処理するため、プロキシは必要ありません。大規模なウェブスクリーピングでは、匿名性を維持し、IPのブロックを避けるためにプロキシを使用することが一般的に推奨されます。
Q3: スクリプトがkey、iv、またはcontextパラメータを検出できていません。どうすればいいですか?
A: これらのパラメータは動的に生成され、通常は<script>タグや隠し入力フィールド内にJavaScript変数として埋め込まれています。preg_matchが失敗した場合、ターゲットサイトのWAF実装が変更されている可能性があります。最新のブロックされたページのHTMLソースを確認し、正規表現を更新する必要があります。
Q4: サードパーティサービスを使わずにAWS WAFを解決できますか?
A: サードパーティサービスを使わずにAWS WAFチャレンジを手動で解決するのは非常に困難で、自動化には現実的ではありません。Challengeアクションでは複雑でオブフスケートされたJavaScriptを実行する必要があります。CAPTCHAアクションでは画像認識パズルを解決する必要があります。CapSolverのようなサードパーティサービスは、リアルタイムでこれらのチャレンジを解決するための高度なAIと大規模なインフラを使用しており、自動化が可能になります。すべてのタイプのCAPTCHA用に自社でソルバーを構築するのは一般的にコスト効果が低く、信頼性がありません。
Q5: aws-waf-tokenの有効期限はどのくらいですか?
A: aws-waf-tokenの有効期限は、保護されたサイトのAWS WAF構成によって異なりますが、通常は10〜30分です。トークンが期限切れになると、新しいトークンを取得するために、初期リクエスト、検出、タスク送信のプロセスを繰り返す必要があります。
コンプライアンス免責事項: このブログで提供される情報は、情報提供のみを目的としています。CapSolverは、すべての適用される法律および規制の遵守に努めています。CapSolverネットワークの不法、詐欺、または悪用の目的での使用は厳格に禁止され、調査されます。私たちのキャプチャ解決ソリューションは、公共データのクローリング中にキャプチャの問題を解決する際に100%のコンプライアンスを確保しながら、ユーザーエクスペリエンスを向上させます。私たちは、サービスの責任ある使用を奨励します。詳細については、サービス利用規約およびプライバシーポリシーをご覧ください。
もっと見る

AWSのCaptcha/チャレンジをPHPで解決する方法: 包括的なガイド
AWS WAF CAPTCHAおよびチャレンジを解決するための詳細なPHPガイド:信頼性のあるスクリーピングと自動化のために

Sora Fujimoto
10-Dec-2025

AWSキャプチャ/チャレンジのPythonでの解決方法
PythonとCapSolverを使用したAWS WAFの課題の処理に関する実用的なガイド、保護されたウェブサイトへのスムーズなアクセスを可能にします

Sora Fujimoto
04-Dec-2025

AWS WAF CAPTCHA トークンの解決方法
このブログでは、CapSolverを使用して、AWS WAF CAPTCHAを高速で、低コストで、簡単に解決する方法を説明しています。

Sora Fujimoto
01-Dec-2025
![AWSのCaptchaをPuppeteer [Javascript]で解く方法](https://assets.capsolver.com/prod/posts/aws-captcha-solver-puppeteer/5e93a8e9739b4c24ab2f6cbba8563a93.png)
AWSキャプチャをPuppeteerで[JavaScript]を使用してCapSolver拡張機能を使って解決する方法
PuppeteerとCapsolverエクステンションを使用してAWSキャプチャをスムーズに解決する方法を学び、キャプチャの解決方法を効果的に設定および自動化するための詳細なガイド

Sora Fujimoto
25-Nov-2025

エンタープライズオートメーションとウェブスクレイピング向けのトップ5 AWS WAF チャレンジソルバー ツール
AWS WAFを回避するシームレスなウェブスクレイピングおよびエンタープライズ自動化のための上位5つのチャレンジソルバーツールを発見。AWS WAFを回避する最適なソリューションを検索。

Sora Fujimoto
13-Nov-2025

AWS WAF CAPTCHAソルバー: トークン & 画像ソリューション for スクレイパー
ウェブスクリーピングや自動化におけるAWS WAF CAPTCHAチャレンジの解決方法を学ぶ。トークンベースおよび画像ベースのソリューション、APIとブラウザの統合、およびベストプラクティスに関する実践的なガイド。

Sora Fujimoto
28-Oct-2025

