data 属性または JavaScript の render パラメーターで、Turnstile ウィジェットの外観、動作、機能を設定します。
Turnstile ウィジェットは、暗黙的な描画または明示的な描画で実装できます。
暗黙的な描画は、ページ読み込み時に HTML 内の cf-turnstile クラス付き要素を自動で走査し、ウィジェットを描画します。シンプルな実装、静的サイト、ページ読み込み直後にウィジェットを出したい場合に適しています。
仕組み
- ページに Turnstile のスクリプトを追加します。
<div class="cf-turnstile" data-sitekey="your-key"></div>要素を置きます。- ページの読み込み時に、ウィジェットが自動で描画されます。
- HTML 要素の
data-*属性でウィジェットを設定します。
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
<div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>" data-theme="light"></div>明示的な描画は、JavaScript 関数でウィジェットの作成タイミングと方法をプログラムから制御します。動的サイトやシングルページアプリケーション(SPA)、ウィジェット作成のタイミング制御、訪問者の操作に応じた条件付き描画、設定の異なる複数ウィジェットに適しています。
仕組み
?render=explicitパラメーター付きで Turnstile のスクリプトを追加します。- コンテナ要素を作成します(
cf-turnstileクラスは付けません)。 - ウィジェットを作成したいタイミングで
turnstile.render()を呼び出します。 - JavaScript オブジェクトのパラメーターでウィジェットを設定します。
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit" defer></script>
<div id="my-widget"></div>
<script>
window.onload = function() {
turnstile.render('#my-widget', {
sitekey: '<YOUR-SITE-KEY>',
theme: 'light',
callback: function(token) {
console.log('Success:', token);
}
});
};
</script>Managed または Non-Interactive モードでは、Turnstile ウィジェットは 2 種類の固定サイズ、または幅可変サイズにできます。
| サイズ | 幅 | 高さ | 用途 |
|---|---|---|---|
| Normal | 300px | 65px | 標準的な実装 |
| Flexible | 100%(最小: 300px) | 65px | レスポンシブデザイン |
| Compact | 150px | 140px | スペースが限られたレイアウト |
normal: デフォルトサイズです。ほとんどのデスクトップとモバイルのレイアウトに適します。サイトやフォームに十分な横幅がある場合に使います。flexible: 最低限の使いやすさを保ちつつ、コンテナ幅に自動で合わせます。あらゆる画面サイズで動くレスポンシブデザインに使います。compact: モバイル UI、サイドバー、横幅が限られる場所に適します。幅が狭い分、通常より高くなります。
<div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>"></div> <div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>" data-size="flexible"></div> <div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>" data-size="compact"></div> turnstile.render('#widget-container', {
sitekey: '<YOUR-SITE-KEY>'
}); turnstile.render('#widget-container', {
sitekey: '<YOUR-SITE-KEY>',
size: 'flexible'
}); turnstile.render('#widget-container', {
sitekey: '<YOUR-SITE-KEY>',
size: 'compact'
});サイトのデザインに合わせて、ウィジェットの見た目をカスタマイズします。
auto(デフォルト): 訪問者のシステムテーマ設定に自動で合わせます。訪問者の設定を尊重し、アクセシビリティも高いため、ほとんどの実装では auto を推奨します。light: 明るい色と明確なコントラストのライトテーマです。明るい背景で読みやすく、コントラストが高くなります。dark: 暗い UI 向けに最適化したダークテーマです。暗いインターフェイス、ゲームサイト、ダークカラースキームのアプリに適します。
<div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>"></div> <div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>" data-theme="light"></div> <div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>" data-theme="dark"></div> turnstile.render('#widget-container', {
sitekey: '<YOUR-SITE-KEY>'
}); turnstile.render('#widget-container', {
sitekey: '<YOUR-SITE-KEY>',
theme: 'light'
}); turnstile.render('#widget-container', {
sitekey: '<YOUR-SITE-KEY>',
theme: 'dark'
});外観モードで、訪問者にウィジェットが見えるタイミングを制御します。
always(デフォルト): ページ読み込み時点から、ウィジェットは常に表示されます。訪問者にすぐウィジェットを見せたいほとんどの実装に適します。セキュリティ検証があることが、見た目でも分かります。execute: チャレンジ開始後にだけウィジェットが表示されます。訪問者がフォーム入力を始めたときや送信ボタンを選んだときだけ出すなど、表示タイミングを制御したい場合に使えます。interaction-only: 訪問者の操作が必要なときだけウィジェットが表示され、体験は最もすっきりします。ほとんどの訪問者はウィジェットを見ません。ボットと疑われる場合だけ、インタラクティブなチャレンジが出ます。
<div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>"></div> <div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>" data-appearance="execute"></div> <div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>" data-appearance="interaction-only"></div> turnstile.render('#widget-container', {
sitekey: '<YOUR-SITE-KEY>'
}); turnstile.render('#widget-container', {
sitekey: '<YOUR-SITE-KEY>',
appearance: 'execute'
}); turnstile.render('#widget-container', {
sitekey: '<YOUR-SITE-KEY>',
appearance: 'interaction-only'
});チャレンジの実行とトークン生成のタイミングを制御します。
-
render(デフォルト):render()の呼び出し後にチャレンジが自動で走り、ウィジェット読み込み直後から保護が始まります。ページ読み込み中にバックグラウンドでチャレンジが進むため、訪問者がデータを送信するころにはトークンの準備ができています。 -
execute:turnstile.execute()を別途呼び出したあとにチャレンジが走り、検証のタイミングを細かく制御できます。複数ステップのフォーム、条件付き検証、訪問者が実際に送信しようとしたときまでチャレンジを遅らせたい場合に使えます。必要なときだけ検証するため、ページ読み込み性能と訪問者体験を改善できます。よくあるシナリオ
- 複数ステップのフォーム: 最後のステップだけで検証します。
- 条件付き保護: 一定の条件を満たす訪問者だけを検証します。
- 性能最適化: 検証を遅らせ、初回のページ読み込み時間を短くします。
- ユーザー起点の検証: 訪問者が手動で検証を開始できるようにします。
<div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>"></div> <div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>" data-execution="execute"></div> turnstile.render('#widget-container', {
sitekey: '<YOUR-SITE-KEY>'
}); turnstile.render('#widget-container', {
sitekey: '<YOUR-SITE-KEY>',
execution: 'execute'
}); turnstile.execute('#widget-container');ウィジェット UI の言語を設定します。
auto(デフォルト): 訪問者のブラウザー言語設定を使います。- 特定の言語コード:
es、fr、deなどの ISO 639-1 の 2 文字コードです。 - 言語と地域:
en-US、es-MX、pt-BRなど、地域差向けの組み合わせコードです。
<div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>"></div> <div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>" data-language="es"></div> <div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>" data-language="en-US"></div> turnstile.render('#widget-container', {
sitekey: '<YOUR-SITE-KEY>'
}); turnstile.render('#widget-container', {
sitekey: '<YOUR-SITE-KEY>',
language: 'es'
});コールバックでウィジェットのイベントを処理します。
callback: チャレンジが成功したときに呼び出されます。error-callback: チャレンジ中にエラーが起きたときに呼び出されます。expired-callback: トークンが(タイムアウト前に)期限切れになったときに呼び出されます。timeout-callback: インタラクティブなチャレンジがタイムアウトしたときに呼び出されます。
成功コールバックはトークンを受け取ります。このトークンは Siteverify API でサーバー側検証する必要があります。トークンは 1 回限りで、300 秒(5 分)後に期限切れになります。
<div class="cf-turnstile"
data-sitekey="<YOUR-SITE-KEY>"
data-callback="onSuccess"
data-error-callback="onError"
data-expired-callback="onExpired"
data-timeout-callback="onTimeout"></div>
<script>
function onSuccess(token) {
console.log('Challenge Success:', token);
}
function onError(errorCode) {
console.log('Challenge Error:', errorCode);
}
function onExpired() {
console.log('Token expired');
}
function onTimeout() {
console.log('Challenge timed out');
}
</script> turnstile.render('#widget-container', {
sitekey: '<YOUR-SITE-KEY>',
callback: function(token) {
console.log('Challenge Success:', token);
},
'error-callback': function(errorCode) {
console.log('Challenge Error:', errorCode);
},
'expired-callback': function() {
console.log('Token expired');
},
'timeout-callback': function() {
console.log('Challenge timed out');
}
});- 成功コールバックは必ず実装し、トークンを処理してフォーム送信や次の手順へ進みます。
- エラーコールバックで、失敗時の案内と訪問者へのフィードバックを行います。
- 期限切れトークンを監視し、無効になる前にチャレンジを更新します。
- タイムアウトを処理し、チャレンジ解決まで訪問者を案内します。
失敗したチャレンジへの Turnstile の対応を制御します。
auto(デフォルト): 失敗したチャレンジを自動で再試行します。一時的なネットワーク障害や処理エラーから自動復旧するため、訪問者体験がよくなります。never: 自動リトライを無効にします。手動対応が必要になり、独自のリトライロジックが必要なアプリでエラー処理を完全に制御できます。retry-interval: リトライ間隔を制御します(デフォルト: 8000ms)。すばやい復旧とサーバー負荷のバランスを取れます。
<div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>"></div><div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>" data-retry="never"></div><div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>" data-retry-interval="0000"></div>トークン期限切れとインタラクティブなタイムアウトへの Turnstile の対応を制御します。
refresh-expired: トークン期限切れ時の動作を制御します(auto、manual、never)。refresh-timeout: インタラクティブなチャレンジのタイムアウト時の動作を制御します(auto、manual、never)。
auto更新は訪問者体験が滑らかですが、リソース消費は増えます。manual更新は訪問者が制御できますが、操作が必要です。never更新は、すべての更新ロジックをアプリケーション側で扱う必要があります。
訪問者体験の要件に応じて、トークン期限切れとインタラクティブなタイムアウトで、異なる戦略を使えます。
<div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>"></div><div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>" data-refresh-expired="manual"></div><div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>" data-refresh-timeout="auto"></div>チャレンジにカスタム識別子とデータを追加します。
action: 分析と区別向けのカスタム識別子です(最大 32 文字)。cData: 検証時に返されるカスタムペイロードです(最大 255 文字)。
- アクション追跡: ログイン、サインアップ、お問い合わせフォームなどを分析上で区別します。
- 訪問者コンテキスト: 訪問者 ID、セッション情報、その他の文脈データを渡します。
- A/B テスト: 異なるウィジェット設定やページバリエーションを追跡します。
- 不正検知: リスク評価向けに追加の文脈を含めます。
<div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>" data-action="login"></div><div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>" data-cdata="user-cdata"></div>Turnstile と HTML フォームの連携方法を設定します。
有効にすると、Turnstile は検証トークン付きの隠し <input> 要素を自動作成します。ほかのフォームデータと一緒に送信されるため、サーバー側検証が簡単になります。
response-field: トークン付きの隠しフォームフィールドを作成するかどうかを決めます(default: true)response-field-name: 隠しフォームフィールドのカスタム名です(default: cf-turnstile-response)
- 自動フォーム連携では、フォーム送信時にトークンが含まれ、追加の JavaScript は不要です。
- フィールド名をカスタムすると、既存フォームフィールドとの衝突を避けやすくなります。
- レスポンスフィールドを無効にすると、複雑なフォームでもトークン処理を完全に制御できます。
<div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>" data-response-field-name="turnstile-token"></div><div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>" data-response-field="false"></div>| JavaScript の Render パラメーター | Data 属性 | 説明 |
|---|---|---|
sitekey |
data-sitekey |
すべてのウィジェットにサイトキーがあります。このサイトキーは対応するウィジェット設定に結び付き、ウィジェット作成時に作られます。 |
action |
data-action |
同一サイトキーのウィジェットを分析上で区別するための顧客側の値です。検証時に返されます。_ と - を含む英数字で、最大 32 文字です。 |
cData |
data-cdata |
チャレンジの発行から検証まで顧客データを付けられるペイロードです。検証時に返されます。_ と - を含む英数字で、最大 255 文字です。 |
callback |
data-callback |
チャレンジ成功時に呼び出される JavaScript コールバックです。検証可能なトークンが渡されます。 |
error-callback |
data-error-callback |
エラー時(ネットワークエラーやチャレンジ失敗など)に呼び出される JavaScript コールバックです。クライアント側エラー を参照してください。 |
execution |
data-execution |
ウィジェットのトークン取得タイミングを制御します。render(デフォルト)または execute です。詳細は 実行モード を参照してください。 |
expired-callback |
data-expired-callback |
トークンが期限切れになり、ウィジェットをリセットしないときに呼び出される JavaScript コールバックです。 |
before-interactive-callback |
data-before-interactive-callback |
チャレンジがインタラクティブモードに入る前に呼び出される JavaScript コールバックです。 |
after-interactive-callback |
data-after-interactive-callback |
チャレンジがインタラクティブモードを抜けたときに呼び出される JavaScript コールバックです。 |
unsupported-callback |
data-unsupported-callback |
対象のクライアント / ブラウザーを Turnstile がサポートしていないときに呼び出される JavaScript コールバックです。 |
theme |
data-theme |
ウィジェットのテーマです。次の値を取れます: light、dark、auto。デフォルトは auto で、訪問者の設定を尊重します。テーマを指定すると、ライトまたはダークに固定できます。 |
language |
data-language |
表示言語です。次のいずれかである必要があります: 訪問者が選んだ言語を使う auto(デフォルト)、ISO 639-1 の 2 文字言語コード(例: en)、または言語と国コード(例: en-US)。詳細は 対応言語の一覧 を参照してください。 |
tabindex |
data-tabindex |
アクセシビリティ向けの Turnstile iframe の tabindex です。デフォルト値は 0 です。 |
timeout-callback |
data-timeout-callback |
インタラクティブなチャレンジが表示されたが、制限時間内に解けなかったときに呼び出される JavaScript コールバックです。コールバックはウィジェットをリセットし、訪問者が再度チャレンジを解けるようにします。 |
response-field |
data-response-field |
レスポンストークン付きの input 要素を作成するかどうかを制御する真偽値です。デフォルトは true です。 |
response-field-name |
data-response-field-name |
input 要素の名前です。デフォルトは cf-turnstile-response です。 |
size |
data-size |
ウィジェットサイズです。次の値を取れます: normal、flexible、compact。 |
retry |
data-retry |
トークン取得に失敗したとき、ウィジェットが自動で再試行するかを制御します。デフォルトは auto で、自動リトライします。失敗時のリトライを無効にするには never にします。 |
retry-interval |
data-retry-interval |
retry が auto のとき、retry-interval はリトライ間隔(ミリ秒)を制御します。値は 900000 未満の正の整数である必要があり、デフォルトは 8000 です。 |
refresh-expired |
data-refresh-expired |
トークン期限切れ時に自動更新します。auto、manual、never を取れます。デフォルトは auto です。 |
refresh-timeout |
data-refresh-timeout |
インタラクティブなチャレンジに入り、タイムアウトを観測したとき、ウィジェットが自動更新するかを制御します。auto(インタラクティブなタイムアウト時に自動更新)、manual(訪問者に手動更新を促す)、never(タイムアウトを表示)を取れます。デフォルトは auto です。Managed モードのウィジェットにだけ適用されます。 |
appearance |
data-appearance |
ウィジェットの表示タイミングを制御します。always(デフォルト)、execute、interaction-only です。詳細は 外観モード を参照してください。 |
feedback-enabled |
data-feedback-enabled |
ウィジェット失敗時に Cloudflare が訪問者フィードバックを収集することを許可します。true(デフォルト)または false です。 |
offlabel-show-privacy |
data-offlabel-show-privacy |
ブランド非表示の Turnstile ウィジェットでプライバシーリンクを表示します。true(デフォルト)または false です。 |
offlabel-show-help |
data-offlabel-show-help |
ブランド非表示の Turnstile ウィジェットでヘルプリンクを表示します。true(デフォルト)または false です。 |
<div style="max-width: 500px;">
<div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>" data-size="flexible" data-theme="auto"></div>
</div><div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>" data-size="compact" data-theme="light" data-language="en">
</div>