Scarnox · Blog

GeeTest captchaを解説:仕組みと解決方法

GeeTestは、訪問者に視覚的なタスクを求めるウィジェットを提供しているcaptchaベンダーです。パズルのピースを隙間にドラッグする、アイコンを指定の順番でクリックする、短いスライダーの動きをなぞる、などです。多くの地域のEコマースサイト、ログインページ、アプリのバックエンドでよく使われています。また、Scarnoxがまだ解決に対応していないcaptchaの1つでもあります。このガイドでは、GeeTestの仕組み、トークン型のウィジェットより自動化が難しい理由、一般的に使われているアプローチ、そしてScarnoxでの現在の対応状況を説明します。

ページ上でGeeTestが行うこと

GeeTest captchaは通常、3つの段階で読み込まれます。

  1. ページがGeeTestのスクリプトを読み込み、captcha IDを持つウィジェットを作成します。多くの連携では、そのIDはgtという名前のパラメーターで渡されます。
  2. ウィジェットはGeeTestのサーバーに新しいチャレンジを要求します。チャレンジにはchallengeの値と、パズルに必要な画像やタイルの位置が含まれます。
  3. 訪問者がタスクを完了すると、ウィジェットは結果をサイトに返します。サイトのバックエンドは、フォームを受け付ける前に、その結果をcaptchaベンダーに対して検証します。

3番目の段階が重要です。もっともらしく見える値では不十分です。サーバーは、1つのチャレンジに紐づき、期限が切れる結果を検証するからです。そのため、別のセッションからコピーした値は失敗しますし、古い結果を再送しても通りません。

GeeTestがトークン型のウィジェットより難しい理由

PopularCaptchaでは、ページが必要とするのは1つのトークン文字列で、1回のリクエストでその文字列が返ります。GeeTestは次の3点で異なります。

そのため、GeeTestの解決は複数の手順からなる作業です。チャレンジを取得し、画像中のターゲットを見つけ、動きを生成し、送信して、結果を読み取ります。各手順は失敗しうるうえ、手順の間で待ちすぎるとチャレンジは期限切れになります。

一般的なアプローチ

GeeTestのページを自動化する人は、一般的に次の3つのアプローチのいずれかを使います。どれも近道ではなく、それぞれにコストがあります。

どれを選ぶにしても、範囲は正直に保ってください。自分が所有するフローの自動化、使用が許可されているテスト環境、または収集が許可されている公開データに限ってください。

ページ上のcaptcha IDの見つけ方

始めるのにコードは必要ありません。DevToolsを開き、ページを再読み込みして、Networkタブでgeetestやgtを検索してください。ウィジェットを読み込む最初のリクエストに、通常はcaptcha IDが表示されます。ページがウィジェットを変えたときに気付けるように、小さなスクリプトで記録しておくと便利です。

import re
import requests

html = requests.get("https://example.com/login", timeout=30).text
match = re.search(r"gt['\"]?\s*[:=]\s*['\"]([a-f0-9]{32})['\"]", html)
print("captcha id:", match.group(1) if match else "not found")

上のパターンは、gtの隣にある32文字の16進数の値を探します。ベンダーはマークアップを変えるので、これは出発点として扱い、出力は対象のページで確認してください。

Scarnoxでの対応状況

プロジェクトを計画するときは、次の点をはっきりさせてください。

今すぐGeeTestが必要なプロジェクトの現実的な道は、自分がテストしてよいページについて、ブラウザ部分と画像部分を自分で作り、APIのサポートが始まったときにすぐ切り替えられるようにコードを準備しておくことです。それまでの間は、アカウントを作成して無料のトライアルクレジットで始めることができます。カード登録は不要です。これで、テストに使える動作するPopularCaptchaのフローと、後でGeeTestを差し込む場所が手に入ります。現在の料金は料金ページを参照してください。

正当な用途

captchaの自動化を使って、偽のアカウントを作ったり、ログインフォームを攻撃したり、限定在庫を取得したりしてはいけません。そうした用途は、ほとんどのサイトのルールに違反し、Scarnoxがサポートするものでもありません。

次のステップ