GeeTest captchaを解説:仕組みと解決方法
GeeTestは、訪問者に視覚的なタスクを求めるウィジェットを提供しているcaptchaベンダーです。パズルのピースを隙間にドラッグする、アイコンを指定の順番でクリックする、短いスライダーの動きをなぞる、などです。多くの地域のEコマースサイト、ログインページ、アプリのバックエンドでよく使われています。また、Scarnoxがまだ解決に対応していないcaptchaの1つでもあります。このガイドでは、GeeTestの仕組み、トークン型のウィジェットより自動化が難しい理由、一般的に使われているアプローチ、そしてScarnoxでの現在の対応状況を説明します。
ページ上でGeeTestが行うこと
GeeTest captchaは通常、3つの段階で読み込まれます。
- ページがGeeTestのスクリプトを読み込み、captcha IDを持つウィジェットを作成します。多くの連携では、そのIDは
gtという名前のパラメーターで渡されます。 - ウィジェットはGeeTestのサーバーに新しいチャレンジを要求します。チャレンジには
challengeの値と、パズルに必要な画像やタイルの位置が含まれます。 - 訪問者がタスクを完了すると、ウィジェットは結果をサイトに返します。サイトのバックエンドは、フォームを受け付ける前に、その結果をcaptchaベンダーに対して検証します。
3番目の段階が重要です。もっともらしく見える値では不十分です。サーバーは、1つのチャレンジに紐づき、期限が切れる結果を検証するからです。そのため、別のセッションからコピーした値は失敗しますし、古い結果を再送しても通りません。
GeeTestがトークン型のウィジェットより難しい理由
PopularCaptchaでは、ページが必要とするのは1つのトークン文字列で、1回のリクエストでその文字列が返ります。GeeTestは次の3点で異なります。
- 出力はタスクの結果であり、1つの文字列ではない。 サイトは互いに関連する複数の値を期待し、それらはすべて同じチャレンジから得られている必要があります。
- チャレンジは視覚的で位置に依存する。 ソルバーは、パズルのピースがどこに入るか、またはどのアイコンが一致するかを見つけ、さらに人間らしく見える動きを生成しなければなりません。
- チェックは回答だけでなく振る舞いも見る。 速度、経路、タイミングを検査できます。正しい位置でも、機械的な動きで届けられると拒否されることがあります。
そのため、GeeTestの解決は複数の手順からなる作業です。チャレンジを取得し、画像中のターゲットを見つけ、動きを生成し、送信して、結果を読み取ります。各手順は失敗しうるうえ、手順の間で待ちすぎるとチャレンジは期限切れになります。
一般的なアプローチ
GeeTestのページを自動化する人は、一般的に次の3つのアプローチのいずれかを使います。どれも近道ではなく、それぞれにコストがあります。
- 実際のブラウザを動かす。 PlaywrightやSeleniumでページを読み込み、スクリプトがスライダーを動かします。自分が管理しているサイトや、使用が許可されているテスト環境で最もうまくいきます。ブラウザは本物ですが、動きは自然に見えなければなりません。
- 画像マッチング。 コードがパズルの背景画像をダウンロードし、テンプレートマッチング(たとえばOpenCVを使う)で隙間を見つけ、ドラッグの距離を計算します。自作の構成で最も信頼できる部分であることが多く、ベンダーが画像のレイアウトを変えると壊れます。
- 人の介在またはソルバーサービス。 人間または管理されたサービスがチャレンジを解き、結果を返します。Scarnoxはこの選択肢をGeeTest向けに提供する予定ですが、まだライブではありません。
どれを選ぶにしても、範囲は正直に保ってください。自分が所有するフローの自動化、使用が許可されているテスト環境、または収集が許可されている公開データに限ってください。
ページ上の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での対応状況
プロジェクトを計画するときは、次の点をはっきりさせてください。
- 現在ライブ: PopularCaptcha(プロキシなし、および自分のプロキシを使う場合)。
- 近日対応予定: GeeTest、reCAPTCHA v2とv3、Cloudflare Turnstile、AWS WAF、Arkose。ライブとして掲載されるまで、GeeTestの解決に依存する本番フローを作らないでください。
今すぐGeeTestが必要なプロジェクトの現実的な道は、自分がテストしてよいページについて、ブラウザ部分と画像部分を自分で作り、APIのサポートが始まったときにすぐ切り替えられるようにコードを準備しておくことです。それまでの間は、アカウントを作成して無料のトライアルクレジットで始めることができます。カード登録は不要です。これで、テストに使える動作するPopularCaptchaのフローと、後でGeeTestを差し込む場所が手に入ります。現在の料金は料金ページを参照してください。
正当な用途
- 自動化された回帰テストがcaptchaに妨げられる場合の、自分のログインや決済フローのテスト。
- 視覚的なパズルを解けない訪問者が、フォームを完了するための別の経路を持っていることを確かめる、アクセシビリティのチェック。
- 監視する許可のあるサイトの監視。たとえば、デプロイの後もウィジェットが読み込まれることを確認するなど。
captchaの自動化を使って、偽のアカウントを作ったり、ログインフォームを攻撃したり、限定在庫を取得したりしてはいけません。そうした用途は、ほとんどのサイトのルールに違反し、Scarnoxがサポートするものでもありません。