ドキュメント
連携ガイド
使い慣れた CAPTCHA フロー向けのウィジェット設定、サーバー側検証、移行メモ。
クイックスタート
BotFlush は、ウィジェットの読み込み、表示、サーバー側トークン検証の 3 手順で連携できます。
1. ウィジェットを読み込む
ページにウィジェットスクリプトを追加します。非同期で読み込まれ、描画をブロックしません。
<script src="https://challenge.botflush.com/widget.js" async defer></script>2. コンテナを追加
CAPTCHA を表示したい場所にコンテナ要素を置きます。
<div id="bf-captcha" data-sitekey="YOUR_SITE_KEY"></div>3. サーバー側で検証
ユーザーがチャレンジを完了するとトークンが生成されます。サーバーに送信して API で検証します。
POST https://challenge.botflush.com/api/siteverify
Content-Type: application/json
{
"secret": "YOUR_SECRET_KEY",
"token": "TOKEN_FROM_CLIENT"
}JavaScript API
BotFlush.render()
BotFlush.render('bf-captcha', {
siteKey: 'YOUR_SITE_KEY',
callback: function(token) {
console.log('Verified:', token);
}
});BotFlush.reset()
BotFlush.reset();BotFlush.getResponse()
var token = BotFlush.getResponse();移行メモ
BotFlush は一般的な widget と siteverify パターンをサポートします。script URL、キー、検証エンドポイントを変更し、展開前に callback とエラー処理を確認してください。
<!-- Before -->
<script src="https://legacy-captcha.example/api.js"></script>
<div class="captcha-widget" data-sitekey="LEGACY_SITE_KEY"></div>
<!-- After -->
<script src="https://challenge.botflush.com/widget.js"></script>
<div class="captcha-widget" data-sitekey="BOTFLUSH_KEY"></div>プライバシー管理
BotFlush は、データ利用の最小化、アカウント単位の管理、エンタープライズ向けのレビュー運用を前提に設計されています。現在利用できるプライバシー管理とデータ管理の正確な情報は、コンソールで確認してください。
検証モード
BotFlush は複数のチャレンジエンジンを提供します。サイトごとに許可するエンジンをコンソールで設定できます。
| エンジン | 種類 | 説明 |
|---|---|---|
| Invisible Free | バックグラウンド | ユーザー操作なしの Proof-of-Work 検証 |
| Visual Match | 対話型 | 画像パターンの照合チャレンジ |
| Emoji Click | 対話型 | 視覚グリッドから一致する絵文字を選択 |
| Invisible Max | バックグラウンド | GPU 加速の Proof-of-Work 検証 |
サーバー検証
検証エンドポイントは標準的な POST リクエストを受け付けます。使用するサーバー環境を選択して例を確認してください。
const response = await fetch('https://challenge.botflush.com/api/siteverify', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
secret: process.env.BOTFLUSH_SECRET,
token: req.body['bf-token']
})
});
const result = await response.json();
if (!result.success) {
return res.status(403).send('Verification failed');
}
import requests
response = requests.post('https://challenge.botflush.com/api/siteverify', json={
'secret': BOTFLUSH_SECRET,
'token': request.form['bf-token'],
})
if not response.json().get('success'):
abort(403)
$payload = json_encode([
'secret' => getenv('BOTFLUSH_SECRET'),
'token' => $_POST['bf-token'] ?? ''
]);
$context = stream_context_create(['http' => [
'method' => 'POST',
'header' => 'Content-Type: application/json',
'content' => $payload,
]]);
$response = file_get_contents('https://challenge.botflush.com/api/siteverify', false, $context);
$result = json_decode($response, true);
if (empty($result['success'])) { http_response_code(403); exit; }
payload, _ := json.Marshal(map[string]string{
"secret": os.Getenv("BOTFLUSH_SECRET"),
"token": r.FormValue("bf-token"),
})
resp, err := http.Post("https://challenge.botflush.com/api/siteverify",
"application/json", bytes.NewBuffer(payload))
if err != nil { http.Error(w, "verify failed", 502); return }
defer resp.Body.Close()
var result struct{ Success bool }
json.NewDecoder(resp.Body).Decode(&result)
if !result.Success { w.WriteHeader(http.StatusForbidden); return }
HttpClient client = HttpClient.newHttpClient();
String body = """
{
"secret": "%s",
"token": "%s"
}
""".formatted(System.getenv("BOTFLUSH_SECRET"), token);
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://challenge.botflush.com/api/siteverify"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(body))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
Map<String, Object> result = new ObjectMapper().readValue(response.body(), Map.class);
if (!Boolean.TRUE.equals(result.get("success"))) {
throw new SecurityException("Verification failed");
}
using var client = new HttpClient();
var payload = new {
secret = Environment.GetEnvironmentVariable("BOTFLUSH_SECRET"),
token = Request.Form["bf-token"].ToString()
};
var response = await client.PostAsJsonAsync(
"https://challenge.botflush.com/api/siteverify",
payload);
var result = await response.Content.ReadFromJsonAsync<VerifyResult>();
if (result?.Success != true) {
return Forbid();
}
ダウンロード
Node Inspector — Chrome 拡張
インストール: ダウンロードして展開し、Chrome の拡張機能画面でデベロッパー モードを有効にして、展開したフォルダーを読み込みます。
Node Inspector をダウンロード (.zip)