GeeTest CAPTCHA v3
と CapMonster Cloud

CAPTCHA の自動解決、サイトへの実装、そしてテストまで。

GeeTest CAPTCHA v3ソリューションの価格

キャプチャ
価格 (USD)
$ 1.20
1000トークン
キャプチャや防御機構が導入済みのサイトを引き継いだのに、ソースコードへアクセスできない? その場合、どの仕組みが入っているのか、設定は正しいのか、どう検証するのかが気になります。

この記事では、よくある疑問にできるだけお答えしました。まず最初のステップは、どのような保護システムが使われているかを特定することです。そのために、代表的なキャプチャやボット対策システムの一覧を参照できます。ここには、どの仕組みが使われているかを素早く見分けるための画面イメージや主な特徴がまとめられています。

もしサイトで GeeTest CAPTCHA v3 が使われていることが分かったら、次のステップはその特徴と動作をより詳しく確認することです。同じこの記事の中で、GeeTest CAPTCHA v3 をサイトに導入するための手順書も確認できるので、あなたのサイト上でどのように機能しているのかをしっかり理解できます。これにより、現在の保護を正しく把握できるだけでなく、今後の運用や保守も計画的に行えるようになります。

GeeTest CAPTCHA v3 とは
GeeTest CAPTCHA v3 とは

GeeTest CAPTCHA v3 は、サイトに悪影響を与える可能性のある自動化された操作から Web サイトを保護するシステムです。実際のユーザーとボットを見分けることで、サイトの安全性と安定した動作を実現します。

Background
GeeTest CAPTCHA v3 の例
Intelligent mode
Intelligent mode
ユーザーの確認は、追加の課題を解かせるのではなく、主にサイト上での行動やインタラクションに基づいて行われます。
Slide CAPTCHA
Slide CAPTCHA
パズルを完成させたり、画像要素を合わせたりするために動かすスライダー。
Icon CAPTCHA
Icon CAPTCHA
指定された順番で画像を選択するタイプ。
Space CAPTCHA
Space CAPTCHA
画像上の図形を正しい位置にドラッグして配置するタイプ。

CapMonster Cloud で GeeTest CAPTCHA v3 を解決する方法

GeeTest CAPTCHA v3 を含むフォームをテストする際は、キャプチャが正しく組み込まれ機能しているか確認する必要があります。

サイトに埋め込まれたキャプチャを手動で確認する方法

  • フォームのページを開き、キャプチャが表示されることを確かめます。
  • 解決せずにフォーム送信を試みると、サーバーはエラーを返すはずです。
  • 正しく解決した後は、問題なく送信できる必要があります。

自動解決には CapMonster Cloud のようなツールを使うと便利です。キャプチャのパラメータを送信すると、サーバー側で処理して利用可能なトークンを返してくれます。そのトークンをフォームに挿入すれば、ユーザー操作なしでチェックを通過できます。

CapMonster Cloud API を使った一般的な手順:

タスクの作成タスクの作成
arrow
API リクエストの送信API リクエストの送信
arrow
結果の受信結果の受信
arrow
トークンをページへ適用トークンをページへ適用
arrow
既成ライブラリを使った GeeTest CAPTCHA v3 の認識
CapMonster Cloud サービスは、PythonJavaScript(Node.js)、C# で簡単に扱える公式ライブラリを提供しています。
Python
JavaScript
C#
解決、トークンの埋め込み、フォーム送信までの一連の流れ
あなたの Web ページ上で CAPTCHA を認識する、Node.js によるフルサイクルの例です。アプローチとしては、HTTP リクエストを使って HTML と CAPTCHA パラメーターを取得し、回答を送信して結果を処理する方法、または Playwright などの自動化ツールを使い、ページを開いて CAPTCHA の表示を待ち、パラメーターを送信(テストのために正しい値・誤った値どちらも送ることが可能)、CapMonster Cloud クライアント経由で解決結果を取得し、トークンをフォームに埋め込み、結果を確認する方法などがあります。
python
// npm install playwright @zennolab_com/capmonstercloud-client
// npx playwright install chromium

import { chromium } from 'playwright';
import { CapMonsterCloudClientFactory, ClientOptions, GeeTestRequest } from '@zennolab_com/capmonstercloud-client';

const API_KEY = 'your_capmonster_cloud_api_key';
const DEMO_PAGE = 'https://example.com';

(async () => {
  const browser = await chromium.launch({ headless: false });
  const page = await browser.newPage();

  console.log('ページを開いています...');
  await page.goto(DEMO_PAGE, { waitUntil: 'networkidle' });

  console.log('CAPTCHA のパラメーターを取得しています...');
  const init = await page.evaluate(async () => {
    // GeeTest の init-params を取得するため、サーバーへリクエストを送信します。ここは自分のエンドポイントに置き換えてください。
    const r = await fetch(`/api/v1/example/gee-test/init-params?t=${Date.now()}`);  
    return r.json();
  });
  console.log('Init params:', init);

  console.log('CapMonster Cloud にタスクを作成しています...');
  const cmc = CapMonsterCloudClientFactory.Create(new ClientOptions({ clientKey: API_KEY }));
  const solRaw = await cmc.Solve(new GeeTestRequest({ websiteURL: DEMO_PAGE, gt: init.gt, challenge: init.challenge }));
  const sol = solRaw.solution || solRaw;
  console.log('CAPTCHA の解決結果:', sol);

  console.log('解決結果を hidden フィールドにセットしています...');
  await page.evaluate(s => {
    ['challenge','validate','seccode'].forEach(n => {
      const el = document.querySelector(`input[name="geetest_${n}"]`);
      if(el) el.value = s[n];
    });
  }, sol);

  await page.click('button[data-action="test_action"]'); // ここを自分の値に置き換えてください
  console.log('サーバーに verify リクエストを送信しています...');
  const result = await page.evaluate(async () => {
    const payload = {
      geetest_challenge: document.querySelector('input[name="geetest_challenge"]')?.value,
      geetest_validate: document.querySelector('input[name="geetest_validate"]')?.value,
      geetest_seccode: document.querySelector('input[name="geetest_seccode"]')?.value
    };
    // ここを自分の値に置き換えてください
    const r = await fetch('/api/v1/example/gee-test/verify', { 
      method:'POST', 
      headers:{'Content-Type':'application/json'}, 
      body: JSON.stringify(payload) 
    });
    return r.json();
  });

  console.log('CAPTCHA 検証結果:', result);

  await page.waitForTimeout(3000);
  await browser.close();
})();
GeeTest CAPTCHA v3 を自分のサイトに導入する方法
サイト上での CAPTCHA の動作や検証ロジックを正しく理解し、再接続や再設定ができるようにするため、このセクションを読むことをおすすめします。ここでは保護機能の導入プロセスを説明しており、各ポイントを短時間で把握するのに役立ちます。

1. GeeTest アカウントに登録するか、ログインします。

2. Captcha Dashboard に移動し、CAPTCHA v3 を選択します。

HowTo Connect image 1

3. 新しい CAPTCHA を作成するために +New Captcha をクリックします。CAPTCHA 名(プロダクト名やプロジェクト名など)、CAPTCHA を設置するサイトの URL、そして CAPTCHA を使用するコンテキスト(例:ログイン/新規登録/パスワードリセット など)を指定します。

4. 一意の CAPTCHA IDKEY が発行されます。これらはセキュリティパネルから設定できます。

HowTo Connect image 2

5. サーバー側(Server SDK)を設定します:

サーバーは次の 2 つの API を利用します:

  • API1 — 初期化(challenge の生成)
  • API2 — CAPTCHA 通過後の結果検証

php
<?php
header('Content-Type: application/json');

const CAPTCHA_ID = '07df3141a35**********19a473d7c50';
const CAPTCHA_KEY = '543b19036ef********8e07d121b81e9';

$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);

function getJson($url) {
    $res = @file_get_contents($url);
    return $res ? json_decode($res, true) : null;
}

// API1:初期化
if ($path === '/register') {
    $data = getJson("https://api.geetest.com/register.php?gt=" . CAPTCHA_ID . "&json_format=1");
    echo json_encode($data ? [
        'gt' => CAPTCHA_ID,
        'challenge' => $data['challenge'],
        'success' => $data['success'] === 1,
        'new_captcha' => true
    ] : ['success' => 0]);
    exit;
}

// API2:検証
if ($path === '/validate' && $_SERVER['REQUEST_METHOD'] === 'POST') {
    $req = json_decode(file_get_contents('php://input'), true);
    $data = getJson("https://api.geetest.com/validate.php?" . http_build_query([
        'seccode' => $req['geetest_seccode'] ?? '',
        'challenge' => $req['geetest_challenge'] ?? '',
        'gt' => CAPTCHA_ID,
        'json_format' => 1
    ]));
    echo json_encode(['success' => !empty($data['seccode'])]);
    exit;
}

http_response_code(404);
echo json_encode(['error' => 'Not found']);

6. クライアント側(Client SDK)を実装します:

クライアント側では gt.js を読み込み、サーバー(API1)から受け取ったパラメーターを渡して initGeetest を呼び出します。以下は ajax を使った例です:

javascript
ajax({
    url: "https://example.com/register",
    type: "get",
    dataType: "json",
    success: function (data) {
        initGeetest({
            gt: data.gt,
            challenge: data.challenge,
            offline: !data.success,
            new_captcha: true
        }, function (captchaObj) {
            captchaObj.appendTo("#captcha");

            captchaObj.onSuccess(function () {
                const result = captchaObj.getValidate();
                ajax({
                    url: "https://example.com/validate",
                    type: "post",
                    contentType: "application/json",
                    data: JSON.stringify(result),
                    success: function(res) {
                        if (res.success) alert('CAPTCHA passed');
                        else alert('CAPTCHA failed');
                    }
                });
            });
        });
    }
});

動作確認

次の点を確認してください:

  • /registerchallenge を返していること
  • CAPTCHA が正しく表示されること
  • CAPTCHA 通過後、ブラウザーのコンソールに /validate へのリクエストが表示されること
  • サーバーが "success": true を返していること

フェイルバック(予備モード)

GeeTest サーバーが利用できない場合:

  • クライアントは success: false を受け取ります
  • CAPTCHA は ローカルモード に切り替わります(GeeTest Cloud への接続なしで動作します)。これをテストするには、意図的に不正な CAPTCHA_ID(例:123456789)を設定してください。

Background
想定されるエラーとデバッグ
Bug Icon
無効なパラメーター
CAPTCHA が表示されない、または invalid-gt / invalid-challenge エラーが返されます。ページに対して有効な gtchallenge を使用しているか確認してください。
Bug Icon
解決タイムアウト
CAPTCHA の解決結果が制限時間内に取得できませんでした。CapMonster などの自動解決サービスを利用している場合は、待機時間(タイムアウト)を長めに設定してください。
Bug Icon
空のフィールド
challengevalidateseccode のいずれか、あるいは複数がページに渡されていません。フォームの hidden フィールドに正しくセットされているか確認してください。
Bug Icon
レスポンス success=false
トークンの有効期限が切れている、再利用されている、または不正なトークンです。原因を調査するには、リクエストのログ出力を有効にし、サーバーが返すフィールド(CapMonster や自前の検証サーバーの error-codes など)を確認してください。
保護の堅牢性チェック
統合後は、システムが本当に自動化された操作からサイトを守れているか確認しましょう。
セキュリティと最適化のヒント
<span class="font-bold">CAPTCHA のシークレット KEY は必ずサーバー側のみに保存し</span>、クライアント側には渡さないでください。
検証時に発生したエラーコード(<span class="font-bold">error-codes</span> やサーバーレスポンス内の関連フィールド)をログに記録し、失敗した検証の原因を把握できるようにしてください。
ライセンス要件や社内ポリシーによって必要な場合は、フォームの下部に<span class="font-bold">プライバシーポリシー</span>および<span class="font-bold">GeeTest 利用規約</span>へのリンクを追加してください。
まとめ

すでにキャプチャや別の保護システムが導入されているサイトを引き継いだものの、コードにはアクセスできない場合でも心配はいりません!どの技術が使われているかを特定するのはそれほど難しくありません。動作が正しいか確認するには、隔離されたテスト環境で認識サービスCapMonster Cloudを利用し、トークン処理の仕組みと検証ロジックが正しく機能しているかをチェックできます。

GeeTest CAPTCHA v3の場合も、システムを特定し、その挙動を調べて、保護機能が正しく動いていることを確認すれば十分です。この記事では、GeeTest CAPTCHA v3を見分ける方法と、その導入や再設定に関する手順書の見つけ方を紹介しました。これにより、防御を安心して維持し、その動作をしっかりと管理できます。

Conclusion
参考リンク
DocIconGeeTest v3 ドキュメントDocIconCapMonster Cloud ドキュメント(GeeTest v3 連携)DocIconGeeTest アカウントの作成DocIconCapMonster Cloud アカウントの作成

GeeTest CAPTCHA v3 に関するよくある質問

challenge 値の有効期間は短く、通常 2 分未満です。古い challenge を createTask に渡すことが ERROR_TOKEN_EXPIRED の最も一般的な原因です。各 createTask 呼び出しの直前に、サイトの init-params エンドポイントから新しい challenge を取得してください — キャッシュや再利用はしないでください。

注意:ERROR_TOKEN_EXPIRED を返すタスクも課金対象としてカウントされます。

https://api.capmonster.cloud/getTaskResult をポーリングすると、3 つのフィールドを持つ solution オブジェクトが返されます(値は常に異なります):

json
{
  "solution": {
    "challenge": "0f759dd1ea6c4wc76cedc2991039ca4f23",
    "validate": "6275e26419211d1f526e674d97110e15",
    "seccode": "510cd9735583edcb158601067195a5eb|jordan"
  }
}

フォーム送信前に、それぞれ非表示フィールド geetest_challengegeetest_validategeetest_seccode に対応付けます。Playwright、Puppeteer、Selenium、または通常の HTTP クライアントで注入できます。

注:定期的にポーリングし、タスクあたり 120 リクエストを超えないでください(アカウント停止を避けるため)。システム負荷によりますが、応答は通常 10〜30 秒以内に届きます。

自動化ロジックを理解するには、まずこれらのパラメータを手動で見つけるとよいでしょう:

  1. DevTools → Network タブを開く。
  2. init-params でフィルタし、ページを再読み込みする。
  3. JSON レスポンスに gtchallenge の両方が含まれます。自動化はこのエンドポイントを傍受する必要があります。

Playwright や他のヘッドレスブラウザで自動化する場合、ネットワークレベルで init-params レスポンスを傍受してください — DOM パースより高速で信頼性が高いです。その後 JSON ペイロードから gtchallenge を解析します。

既製の抽出スクリプトは CapMonster Cloud ドキュメントにあります。

GeeTest v3 は検証サーバーに到達できなくなるとオフライン/バイパスモードを有効にします。このモードでもウィジェットは表示されユーザーは操作できますが、サイトのクライアント側・サーバー側検証はローカルで処理されます。

自動解決ワークフローには影響しません。

はい。CapMonster Cloud は、手動操作なしでフォーム送信、QA シナリオ、負荷テスト時の挙動を検証する必要がある GeeTest CAPTCHA v3 の自動化ワークフローで使用できます。

各タスクで新しい gtchallenge を使い、challengevalidateseccode を対応フィールドに注入し、対象環境での拒否率を監視してください。最新料金は 料金ページをご確認ください。