contAIct

使い方

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 スパムの疑いが強い
サンプルコード

フローごとにすぐ使える PHP サンプルを GitHub で公開しています。

dotAster/contaict-examples

サイトへの掲載バナー

contAIct を導入したサイトにバナーを貼ることができます。クリックで HTML をコピーできます。

バナーサンプル(画像 320×120 / 表示 160×60、Retina 対応)

contAIct

まずはお試しください

今すぐ始める