GeeTest CAPTCHA v4
と CapMonster Cloud

CAPTCHA の解決、サイトへの実装、そしてテストについて。

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

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

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

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

GeeTest CAPTCHA v4 とは何か
GeeTest CAPTCHA v4 とは何か
GeeTest CAPTCHA v4(Adaptive CAPTCHA/Behavior Verification) は、v3 と比べてより新しいバージョンで、ウェブサイトを自動化された悪意のある操作から保護するために設計された仕組みです。システムはサイト訪問者の行動やデバイスの特徴を追跡し、それに応じて最適なチャレンジを出題します。正規のユーザーであれば、CAPTCHA ウィジェットを 1 回クリックするだけの非常に簡単な確認で済みますが、自動化が疑われる場合は、通過する必要があるより複雑なチャレンジが表示されます。
Background
GeeTest CAPTCHA v4 の例
No CAPTCHA
No CAPTCHA
ユーザーの判定は、主にサイト上での行動やインタラクションに基づいて行われ、明示的なタスクを解かなくてもよい場合があります。
Icon CAPTCHA
Icon CAPTCHA
指定された順番で画像を選択するチャレンジ。
IconCrush CAPTCHA
IconCrush CAPTCHA
要素を入れ替えて、同じアイコンを3つ一列に並べる(いわゆる「マッチ3」系パズルのような動作)。
Slide CAPTCHA
Slide CAPTCHA
スライダーを操作してパズルを完成させたり、画像の要素を一致させたりするチャレンジ。
Gobang CAPTCHA
Gobang CAPTCHA
スライダーを操作してパズルを完成させたり、画像の要素を一致させたりするチャレンジ。

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

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

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

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

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

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

タスクの作成タスクの作成
arrow
API リクエストの送信API リクエストの送信
arrow
結果の受信結果の受信
arrow
トークンをページへ適用トークンをページへ適用
arrow
既製ライブラリを使った GeeTest CAPTCHA v4 の認識
CapMonster Cloud では、PythonJavaScript(Node.js)、C# 向けの便利なクライアントライブラリが用意されています。
Python
JavaScript
C#
解決、トークンの挿入、フォーム送信までの一連の流れ
あなたのウェブページ上で CAPTCHA をフルサイクルで解決するための Node.js のサンプルです。代表的なアプローチは 2 つあります。1つ目は HTTP リクエストで HTML と CAPTCHA パラメータを取得し、回答を送信して結果を処理する方法。2つ目は、Playwright のような自動化ツールを使い、ページを開いて CAPTCHA の読み込みを待ち、パラメータを送信します(テスト用に正しいデータ・誤ったデータの両方を送ることも可能)。その後、CapMonster Cloud クライアントで解決結果を取得し、トークンをフォームに挿入して結果を確認します。
python
// npm install playwright @zennolab_com/capmonstercloud-client

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

const CAPMONSTER_API_KEY = "YOUR_CAPMONSTER_API_KEY";

async function solveGeetestV4(pageUrl) {
  const browser = await chromium.launch({ headless: false });
  const context = await browser.newContext({ viewport: null });
  const page = await context.newPage();

  let detected = null;
  let solutionObj = null;

  // 1. /load のレスポンスをフックし、captcha_id や challenge などを取得
  page.on("response", async (response) => {
    const url = response.url();
    if (!url.startsWith("https://gcaptcha4.geetest.com/load?")) return;

    const params = new URLSearchParams(url.split("?")[1] || "");
    const captchaId = params.get("captcha_id");
    const challenge = params.get("challenge");
    const captchaType = params.get("captcha_type");

    if (captchaId && challenge) {
      detected = { captchaId, challenge, captchaType };
      console.log("Detected GeeTest v4 load:", detected);
    }
  });

  // 2. ページを読み込む
  console.log("Opening page:", pageUrl);
  await page.goto(pageUrl, { waitUntil: "domcontentloaded" });

  // 3. /load をキャプチャできるまで待機
  console.log("Waiting for GeeTest /load...");
  while (!detected) {
    await page.waitForTimeout(500);
  }

  // 4. CapMonster Cloud にタスクを送信
  console.log("Sending task to CapMonster...");
  const cmc = CapMonsterCloudClientFactory.Create(
    new ClientOptions({ clientKey: CAPMONSTER_API_KEY })
  );

  const task = new GeeTestRequest({
    websiteURL: pageUrl,
    gt: detected.captchaId,
    challenge: detected.challenge,
    version: "4",
    initParameters: {
      riskType: detected.captchaType || "slide"
    }
  });

  const solveRes = await cmc.Solve(task);
  const sol = solveRes.solution || solveRes;

  solutionObj = {
    captcha_id: sol.captcha_id || detected.captchaId,
    captcha_output: sol.captcha_output,
    lot_number: sol.lot_number,
    pass_token: sol.pass_token
  };

  console.log("Got solution from CapMonster:", solutionObj);

  // 5. /verify に自分の値を挿入し、成功レスポンスを得る
  await page.route("https://gcaptcha4.geetest.com/verify*", async (route) => {
    console.log("Intercepted /verify, injecting fake success...");
    const body = `geetest_${Date.now()}(${JSON.stringify({
      status: "success",
      data: {
        result: "success",
        seccode: {
          captcha_id: solutionObj.captcha_id,
          captcha_output: solutionObj.captcha_output,
          lot_number: solutionObj.lot_number,
          pass_token: solutionObj.pass_token
        }
      }
    })})`;

    await route.fulfill({
      status: 200,
      contentType: "application/javascript",
      body
    });
  });

  // 6. ユーザー操作をエミュレート(例:CAPTCHA ボタンをクリック)
  console.log("Waiting for captcha interaction...");
  await page.waitForTimeout(3000);

  // 検証呼び出しの例:
  try {
    await page.click('.geetest_btn'); // CAPTCHA ボタン
    console.log("Clicked captcha button");
  } catch {
    console.log("Captcha button not found");
  }

  // 場合によっては verify() を手動で呼び出す必要があります:
  await page.evaluate(() => {
    if (window.initGeetest4 && typeof verify === "function") {
      verify();
    }
  });

  console.log("Waiting for verification request...");
  await page.waitForTimeout(3000);

  await browser.close();

  return { detected, solution: solutionObj };
}
(async () => {
  const url = "https://example.com"; // GeeTest v4 が設置されたページの URL に置き換えてください
  const res = await solveGeetestV4(url);
  console.log("FINISHED:", res);
})();
GeeTest CAPTCHA v4 を自分のサイトに接続する方法
サイト上での CAPTCHA の動作、検証ロジック、再接続や再設定の手順を正しく理解するために、このセクションを読むことをお勧めします。ここでは保護機能の導入プロセスを説明しており、設定の細かい点まで素早く把握するのに役立ちます。

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

2. Captcha Dashboard に移動し、Behavior Verification v4 を選択します。

HowTo Connect image 1

3. ダッシュボードで + Create application をクリックします。

4. APP/website name(CAPTCHA を使用するサイトまたはアプリ名)、Address(CAPTCHA を設置するサイトのメインドメイン、例:https://example.com)、Industry(サイトのカテゴリ。例:「E-commerce」「Social Media」など)を入力し、Confirm をクリックします。

5. 作成したアプリケーション名の横にある Add events をクリックします。Event には CAPTCHA を使用する具体的なシナリオ(login、register など)を指定し、Device にはプラットフォーム(Web / Wap など)、Business types には CAPTCHA を使う業務シナリオの種類(Sign-up / Sign-in など)を指定して、Add をクリックします。

6. これで、作成した CAPTCHA に対して、クライアントとサーバーの両方で使用する ID と、サーバー側で検証に使用する Key がダッシュボードに表示されます。

HowTo Connect image 2

7. クライアント側の実装

まずスクリプトを読み込みます:

markup
<script src="https://static.geetest.com/v4/gt4.js"></script>

次に CAPTCHA を初期化します:

javascript
initGeetest4(
  { captchaId: "Your CaptchaId" },
  function (captcha) {
    captcha.appendTo("#captcha"); // ページ内の要素に挿入
  }
);

重要:

  • CAPTCHA はページ読み込み時に初期化する必要があります。そうしないと、ユーザー行動を正しく追跡できません。
  • 同一ページに複数の CAPTCHA を配置する場合は、それぞれに対して initGeetest4 を個別に呼び出してください。
  • CAPTCHA を iframe 内で使用する場合は、iframe に sandbox="allow-scripts allow-popups" を付与してください。

コード例コード例
arrow

8. サーバー側の実装。

ユーザーがフロントエンドで CAPTCHA を通過すると、一連のパラメータが生成されます。これらのパラメータをバックエンドに送信し、GeeTest のセカンダリ検証 API でチェックすることで、検証が正しく行われたことを確認します。

セカンダリ検証 API:

javascript
url
http://gcaptcha4.geetest.com/validate

  • メソッド:GET / POST
  • Content-Type:application/x-www-form-urlencoded
  • レスポンス形式:JSON

主なリクエストパラメータ

  • lot_number - 検証のシリアル番号
  • captcha_output - 検証データ
  • pass_token - 検証トークン
  • gen_time - 検証生成時間
  • captcha_id - CAPTCHA ID
  • sign_token - 検証用署名

成功レスポンスの例成功レスポンスの例
arrow

PHP での CAPTCHA 検証例PHP での CAPTCHA 検証例
arrow

Background
想定されるエラーとデバッグ
Bug Icon
無効なパラメータ
CAPTCHA が表示されない、または invalid-captcha-id / invalid-challenge などのエラーが返される場合は、ページに対応した最新の captcha_idchallenge を使用しているか確認してください。これらの値は、各 /load リクエストごとに動的に生成されます。
Bug Icon
解決タイムアウト
CAPTCHA の解決結果が制限時間内に取得できませんでした。自動解決サービス(例:CapMonster Cloud)を使用している場合は待ち時間(タイムアウト)を延長し、API との接続が安定しているか確認してください。
Bug Icon
フィールドが空
captcha_outputpass_tokenlot_number のいずれか、またはすべてがページや検証リクエストに渡されていません。これらの値が、フォームの hidden フィールドやサーバーへのリクエストボディに正しく挿入されているか確認してください。
Bug Icon
レスポンスが success=false
トークンの有効期限が切れている、再利用されている、または偽造されています。検証サーバーへの全てのリクエストとレスポンスをログ出力し、error_codeerror_msg などのフィールドを確認できるようにしてください。
保護の堅牢性チェック
統合後は、システムが本当に自動化された操作からサイトを守れているか確認しましょう。
セキュリティと最適化のヒント
<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 v4の場合も、システムを特定し、その挙動を調べて、保護機能が正しく動いていることを確認すれば十分です。この記事では、GeeTest CAPTCHA v4を見分ける方法と、その導入や再設定に関する手順書の見つけ方を紹介しました。これにより、防御を安心して維持し、その動作をしっかりと管理できます。

Conclusion
参考リンク
DocIconGeeTest v4 ドキュメントDocIconGeeTest v4 開発者コンソールDocIconCapMonster Cloud ドキュメント(GeeTest v4 との連携)DocIconGeeTest アカウントの作成DocIconCapMonster Cloud アカウントの作成

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

CapMonster Cloud はデフォルトで標準の GeeTest エンドポイントを使用します。対象サイトがウィジェット読み込み用にサイト固有の API エンドポイントを使う場合のみ、GeeTestTask リクエスト本文に geetestApiServerSubdomain パラメータを含めてください。検出するにはサイトのネットワークトラフィックを確認し、初期化リクエストが api.geetest.com とは異なる非標準ホストに向かう場合、そのサブドメイン値をパラメータに渡します。

riskType は solver に期待する操作タイプ — slideicongobang など challenge 固有のモード — を伝えます。標準の slider challenge では、createTask リクエストペイロードに "riskType": "slide" を設定します。例:

POST https://api.capmonster.cloud/createTask

json
{
  "clientKey": "YOUR_CAPMONSTER_CLOUD_API_KEY",
  "task": {
    "type": "GeeTestTask",
    "websiteURL": "https://gt4.geetest.com/",
    "gt": "54088bb07d2df3c46b79f80300b0abbe",
    "version": 4,
    "initParameters": {
      "riskType": "slide"
    }
  }
}

これがないと solver が誤った操作タイプを試み、無効なトークンを返す可能性があります。

CapMonster Cloud は Python、Node.js、C# 向けの公式 SDK を提供しています。各 SDK はタスク作成、CAPTCHA 解決のポーリング、リトライロジック、タイムアウト管理を内部で処理します。これらの SDK を使うのが API キーから動作する solver へ移る最速の方法です。

解決後、CapMonster Cloud はサイトの /verify エンドポイントに転送する 4 つの値を返します:

  • captcha_output — エンコードされた解決データ
  • pass_token — 検証トークン
  • lot_number — 検証シリアル番号
  • gen_time — 生成された解決のタイムスタンプ

これらを解決タスク作成時に使った captcha_id と組み合わせ、/verify に渡して成功レスポンスを得ます。

ページ読み込み中のネットワークトラフィックを傍受して GeeTest 初期化パラメータを抽出します。Playwright ではページレスポンスを監視し、gcaptcha4.geetest.com/load エンドポイントをフィルタします。URL のクエリ文字列を解析して captcha_idrisk_type を取り出します。Python の最小 Playwright 例:

python
async def on_request(request):
    url = request.url
    if "https://gcaptcha4.geetest.com/load?" in url:
        query = parse_qs(urlparse(url).query)
        captcha_id = query.get("captcha_id", [None])[0]
        risk_type = query.get("risk_type", [None])[0]

        if captcha_id and not result["version"]:
            result["version"] = "v4"
            result["data"] = {
                "captchaId": captcha_id,
                "riskType": risk_type
            }

            print("GeeTest v4 detected:")
            print(result["data"])

抽出した captcha_idgt パラメータとして、riskTypeversion とともに GeeTestTask ペイロードに直接渡します。完全な API スキーマは ドキュメントを参照してください。