この記事では、よくある疑問にできるだけお答えしました。まず最初のステップは、どのような保護システムが使われているかを特定することです。そのために、代表的なキャプチャやボット対策システムの一覧を参照できます。ここには、どの仕組みが使われているかを素早く見分けるための画面イメージや主な特徴がまとめられています。
もしサイトで Cloudflare Turnstile が使われていることが分かったら、次のステップはその特徴と動作をより詳しく確認することです。同じこの記事の中で、Cloudflare Turnstile をサイトに導入するための手順書も確認できるので、あなたのサイト上でどのように機能しているのかをしっかり理解できます。これにより、現在の保護を正しく把握できるだけでなく、今後の運用や保守も計画的に行えるようになります。
Cloudflare Turnstile を含むフォームをテストする際は、キャプチャが正しく組み込まれ機能しているか確認する必要があります。
サイトに埋め込まれたキャプチャを手動で確認する方法
自動解決には CapMonster Cloud のようなツールを使うと便利です。キャプチャのパラメータを送信すると、サーバー側で処理して利用可能なトークンを返してくれます。そのトークンをフォームに挿入すれば、ユーザー操作なしでチェックを通過できます。
CapMonster Cloud API を使った一般的な手順:
Cloudflare Turnstileを解決するためのリクエストでは、次のパラメータを指定する必要があります:
type - TurnstileTask;
websiteURL - CAPTCHAが解決されているページのアドレス;
websiteKey - Turnstileキー.
https://api.capmonster.cloud/createTask{
"clientKey": "API_KEY",
"task": {
"type": "TurnstileTask",
"websiteURL": "http://tsmanaged.zlsupport.com",
"websiteKey": "0x4AAAAAAABUYP0XeMJF0xoy"
}
}{
"errorId":0,
"taskId":407533072
}https://api.capmonster.cloud/getTaskResult{
"clientKey":"API_KEY",
"taskId": 407533072
}{
"errorId": 0,
"status": "ready",
"solution": {
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36",
"token": "0.iGX3xsyFCkbGePM3jP4P4khLo6TrLukt8ZzBvwuQOvbC...f61f3082"
}
}// npm install playwright @zennolab_com/capmonstercloud-client
import { chromium } from "playwright";
import { CapMonsterCloudClientFactory, ClientOptions, TurnstileRequest } from "@zennolab_com/capmonstercloud-client";
async function main() {
// 1. CapMonster Cloud経由でTurnstileを解決
const cmcClient = CapMonsterCloudClientFactory.Create(
new ClientOptions({ clientKey: 'YOUR_CAPMONSTER_API_KEY' })
);
const turnstileRequest = new TurnstileRequest({
websiteURL: 'http://tsmanaged.zlsupport.com',
websiteKey: '0x4AAAAAAABUYP0XeMJF0xoy',
});
const result = await cmcClient.Solve(turnstileRequest);
const token = result.solution.token;
console.log('Turnstileトークンを受信しました:', token);
// 2. Playwrightの起動
const browser = await chromium.launch({ headless: false });
const context = await browser.newContext();
const page = await context.newPage();
await page.goto('http://tsmanaged.zlsupport.com');
// 3. ログインとパスワードの入力
await page.fill('#username', 'your_username');
await page.fill('#password', 'your_password');
// 4. 非表示のトークンフィールドが表示されるのを待つ
await page.waitForSelector('#token', { state: 'attached', timeout: 60000 });
// 5. トークンを挿入してフィールドを表示する
await page.evaluate((t) => {
const tokenInput = document.querySelector('#token');
if (tokenInput) {
tokenInput.type = 'text'; // フィールドを表示する
tokenInput.value = t; // トークンを挿入
console.log('トークンフィールドにトークンが挿入されました');
} else {
console.error('フィールド #token が見つかりません');
}
}, token);
// 6. トークンが実際に挿入されたことを確認
const checkValue = await page.$eval('#token', el => el.value);
console.log('トークン値の確認:', checkValue);
// 7. フォームの送信
await page.click('button[type="submit"]');
console.log('Turnstileトークンでフォームが送信されました');
// await browser.close();
}
main().catch(err => console.error(err));1. Cloudflare Turnstileページに移動し、今すぐ始めるをクリックします。
2. サービスに登録します。
3. Turnstile Widgetsで、青いAdd Widgetボタンをクリックします。

4. Cloudflare Turnstileを構成し、次を指定します:
5. ウィジェットを作成すると、2つのキー(Site KeyとSecret Key)を受け取ります。

6. クライアント側を接続
1) Turnstileスクリプトを接続
自動レンダリング(ページの読み込み時にウィジェットが自動的に作成されます):
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>プログラム制御(JavaScript経由でウィジェットを自分で作成します):
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit" defer></script>重要:スクリプトは正確なURLから読み込む必要があります。プロキシまたはキャッシュが障害を引き起こす可能性があります。
2) ウィジェット用のコンテナを作成
自動:
<div class="cf-turnstile" data-sitekey="<YOUR_SITEKEY>"></div>プログラムで:
<div id="turnstile-container"></div>3) ウィジェットの構成
data属性経由:
<div class="cf-turnstile"
data-sitekey="<YOUR_SITEKEY>"
data-theme="light"
data-size="normal"
data-callback="onSuccess">
</div>JavaScript経由:
const widgetId = turnstile.render("#turnstile-container", {
sitekey: "<YOUR_SITEKEY>",
theme: "light",
size: "normal",
callback: token => console.log("Token:", token)
});4) トークンの操作
const token = turnstile.getResponse(widgetId); // トークンを取得
const isExpired = turnstile.isExpired(widgetId); // 有効期限を確認
turnstile.reset(widgetId); // リセット
turnstile.remove(widgetId); // 削除
turnstile.execute("#turnstile-container"); // 手動実行
5) フォームとの統合
<form id="my-form" method="POST">
<input type="hidden" name="cf-turnstile-response" id="cf-turnstile-response">
<button type="submit">送信</button>
</form>
<script>
function onSuccess(token) {
document.getElementById("cf-turnstile-response").value = token;
}
</script>
<title>Turnstile Example</title>
<!-- Turnstileスクリプトを接続 -->
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
</head>
<body>
<h1>Turnstileを使用したフォームの例</h1>
<form id="my-form">
<label for="username">名前:</label>
<input type="text" name="username" id="username" required>
<!-- Turnstile用のコンテナ -->
<div class="cf-turnstile" data-sitekey="<YOUR_SITEKEY>" data-callback="onTurnstileSuccess"></div>
<button type="submit">送信</button>
</form>
<script>
// CAPTCHAを通過した後に呼び出されるコールバック
function onTurnstileSuccess(token) {
console.log("Turnstileトークンを受信しました:", token);
// トークンを非表示のフォームフィールドに保存(オプション)
document.getElementById("cf-turnstile-token")?.remove();
const input = document.createElement("input");
input.type = "hidden";
input.name = "cf-turnstile-response";
input.id = "cf-turnstile-token";
input.value = token;
document.getElementById("my-form").appendChild(input);
}
// フォーム送信
document.getElementById("my-form").addEventListener("submit", async (e) => {
e.preventDefault();
const formData = new FormData(e.target);
const response = await fetch("/submit-form", {
method: "POST",
body: formData
});
const result = await response.json();
if(result.success){
alert("フォームが正常に送信され、トークンが検証されました!");
} else {
alert("Turnstileトークン検証エラー。もう一度お試しください。");
// ウィジェットをリセットして、ユーザーがCAPTCHAを再度完了できるようにします
turnstile.reset();
}
});
</script>
</body>
</html>
6) サーバー側を構成
サーバー側検証プロセス:
Siteverify API:
https://challenges.cloudflare.com/turnstile/v0/siteverifyリクエストパラメータ:
トークンのプロパティ:
<?php
function validateTurnstile($token, $secret, $remoteip = null) {
$url = 'https://challenges.cloudflare.com/turnstile/v0/siteverify';
$data = ['secret' => $secret, 'response' => $token];
if ($remoteip) $data['remoteip'] = $remoteip;
$options = [
'http' => [
'header' => "Content-type: application/x-www-form-urlencoded
",
'method' => 'POST',
'content' => http_build_query($data)
]
];
$response = file_get_contents($url, false, stream_context_create($options));
if ($response === FALSE) {
return ['success' => false, 'error-codes' => ['internal-error']];
}
return json_decode($response, true);
}
// 使用法
$secret_key = 'YOUR_SECRET_KEY';
$token = $_POST['cf-turnstile-response'] ?? '';
$remoteip = $_SERVER['REMOTE_ADDR'];
$result = validateTurnstile($token, $secret_key, $remoteip);
if($result['success']){
echo "フォームが正常に送信されました!";
} else {
echo "検証エラー: " . implode(', ', $result['error-codes']);
}
?>
すでにキャプチャや別の保護システムが導入されているサイトを引き継いだものの、コードにはアクセスできない場合でも心配はいりません!どの技術が使われているかを特定するのはそれほど難しくありません。動作が正しいか確認するには、隔離されたテスト環境で認識サービスCapMonster Cloudを利用し、トークン処理の仕組みと検証ロジックが正しく機能しているかをチェックできます。
Cloudflare Turnstileの場合も、システムを特定し、その挙動を調べて、保護機能が正しく動いていることを確認すれば十分です。この記事では、Cloudflare Turnstileを見分ける方法と、その導入や再設定に関する手順書の見つけ方を紹介しました。これにより、防御を安心して維持し、その動作をしっかりと管理できます。