使い方
contAIct には 2 つの組み込み方法があります。用途に合わせて選んでください。
1 API キーを取得する
アカウント登録後、ダッシュボードの「API キー」から新しいキーを発行してください。
キーは作成直後に一度だけ表示されます。必ずメモしてください。
サイトキー フロー A 用
ブラウザ JS に埋め込んで使います。ドメイン制限で保護するため、必ずドメインを設定してください。
サーバーキー フロー B 用
サーバーサイドのみで使います。ブラウザには絶対に埋め込まないでください。
2 組み込み方法を選ぶ
A ブラウザ JS フロー(推奨)
フロントエンドの JS がトークンを取得し、サーバーサイドでスパム判定します。サイトキーを使用します。ブラウザに埋め込まれるため、キー作成時にドメイン制限を必ず設定してください。
⚠️ テスト環境(localhost 等)では、本番用とは別にサイトキーを発行してください。サイトキーのドメイン制限は1キーにつき1ドメインです。本番キーに localhost を追加すると、curl 等で Origin ヘッダーを偽装した不正リクエストが通るリスクがあります。
① フォーム送信時にトークンを取得(JS)
// トークンを変数に保持し、未取得・期限切れ(残り30秒未満)のときだけ再取得する
let contaictToken = null;
let tokenExpiresAt = 0;
async function refreshToken() {
// サイトキーはクエリで渡す(プリフライト時にもキー別ドメイン制限を検証するため)
const res = await fetch('https://api.contaict.app/v1/token?api_key=YOUR_SITE_KEY', {
method: 'POST',
});
if (!res.ok) throw new Error('token_error');
const { token, expires_at } = await res.json();
contaictToken = token;
tokenExpiresAt = Date.parse(expires_at);
}
document.getElementById('contactForm').addEventListener('submit', async (e) => {
e.preventDefault();
if (!contaictToken || Date.now() > tokenExpiresAt - 30000) {
try {
await refreshToken();
} catch {
alert('送信できませんでした。しばらく時間をおいて再度お試しください。');
return;
}
}
// hidden フィールドにセットしてフォームをサーバーへ送信
document.getElementById('contaict_token').value = contaictToken;
e.target.submit();
});
② サーバーサイドでスパム判定(PHP 例)
$token = $_POST['contaict_token'] ?? '';
$text = $_POST['body'] ?? '';
// トークンなし = 正規フローを通っていない(直接送信など)
if (!$token) {
http_response_code(400);
exit('不正なアクセスです。');
}
$ch = curl_init('https://api.contaict.app/v1/analyze');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode(['token' => $token, 'text' => $text]),
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
]);
$res = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$curlErr = curl_errno($ch);
curl_close($ch);
if ($curlErr || $httpCode >= 500) {
// contAIct 障害時はフォールバック(判定なしで受理)
mail('admin@example.com', $subject, $text);
exit;
}
$result = json_decode($res, true);
if (!isset($result['score'])) {
if (($result['error'] ?? '') === 'rescan_limit_exceeded') {
// 再スキャン上限超過 → ページを再ロードして新しいトークンで再送信が必要
http_response_code(400);
exit('お手数ですが、ページを更新してもう一度送信してください。');
}
if (in_array($result['error'] ?? '', ['quota_exceeded', 'rate_limit_exceeded'])) {
// 月次上限超過・レート制限 → 契約者側の問題のためフォールバック受理
mail('admin@example.com', $subject, $text);
exit;
}
// 404/410 = トークン無効・期限切れ(10分超過)
http_response_code(400);
exit('セッションが無効です。もう一度フォームを入力してください。');
}
$score = $result['score']; // 0〜100
// スコアに応じて件名にラベルを付けて全件送信(推奨)
$label = $score >= 70 ? '[要確認] ' : '';
mail('admin@example.com', $label . $subject, $text . "\n\n---\nスパムスコア: {$score}/100");
// ブロックする場合:
// if ($score >= 70) {
// http_response_code(400);
// exit('送信できませんでした。');
// }
// mail('admin@example.com', $subject, $text);
B Bearer フロー(サーバー間)
サーバーから直接 API を呼び出す方法です。フォームデータ受信後にまとめてスパム判定できます。サーバーキーを使用してください。
$text = $_POST['body'] ?? '';
$clientIp = $_SERVER['REMOTE_ADDR'] ?? '';
$ch = curl_init('https://api.contaict.app/v1/analyze');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode(['text' => $text, 'client_ip' => $clientIp]),
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'Authorization: Bearer YOUR_SECRET_KEY',
],
]);
$result = json_decode(curl_exec($ch), true);
curl_close($ch);
// null = APIキー不正・月次上限超過・通信エラー
if (!isset($result['score'])) {
// フォールバック処理
mail('admin@example.com', $subject, $text);
exit;
}
$score = $result['score']; // 0〜100
// スコアに応じて件名にラベルを付けて全件送信(推奨)
$label = $score >= 70 ? '[要確認] ' : '';
mail('admin@example.com', $label . $subject, $text . "\n\n---\nスパムスコア: {$score}/100");
// ブロックする場合:
// if ($score >= 70) {
// http_response_code(400);
// exit('送信できませんでした。');
// }
// mail('admin@example.com', $subject, $text);
⚠️ サーバーキーはサーバーサイドのみで使用してください。ブラウザ JS に埋め込むと漏洩リスクがあります。
スコアの見方
| スコア | 目安 |
|---|---|
| 0〜29 | 通常のお問い合わせ |
| 30〜69 | 判断が難しい(要確認) |
| 70〜100 | スパムの疑いが強い |
サイトへの掲載バナー
contAIct を導入したサイトにバナーを貼ることができます。クリックで HTML をコピーできます。
バナーサンプル(画像 320×120 / 表示 160×60、Retina 対応)
<a href="https://contaict.app" target="_blank" rel="noopener"><img src="https://contaict.app/img/contaict_banner.png" alt="contAIct" width="160" height="60"></a>
まずはお試しください
今すぐ始める