SeleniumでCAPTCHAソルバーを使う

著者:solvethree読了時間:1分

solvethree で reCAPTCHA Enterprise トークンを取得し、Selenium でアプリケーションのフォームに solution.token を設定して送信します。SDK はタスクを解決しますが、ブラウザーのフォームへの入力は行いません。

この例では、トークンフィールドと送信ボタンを持つ HTTPS フォームを使用します。これらのセレクターを、テスト対象のアプリケーションに合わせて調整してください。

このページの内容

フォームと Python 環境を準備する

  1. 1.

    依存関係をインストールする

    Python 3.10 以降と Chrome を使用してください。pip で selenium パッケージをインストールし、次にダウンロード可能な wheel から公式の solvethree Python SDK をインストールします。Python 連携にある直接ダウンロードによるインストール手順を使用してください。パッケージレジストリからインストールできると仮定して、別の手順に置き換えないでください。

  2. 2.

    対象のプロファイルを設定する

    solvethree コンソールで所有するフォームのホスト名を設定し、そのプロファイルがワークスペースで有効になっていることを確認します。タスクでホスト名を送信しても、そのプロファイルは作成されません。このサンプルでは login アクションを要求します。アプリケーションで別のアクションを使用している場合は変更してください。

  3. 3.

    環境変数を設定する

    TARGET_URL に HTTPS フォームの完全な URL、SOLVETHREE_PROXY に HTTP または HTTPS プロキシの URL、SOLVETHREE_API_KEY にワークスペースの API キーを設定します。キーはページの JavaScript ではなく、Python プロセス内に保持してください。

まず解決し、返された識別情報で Chrome を起動する

この Chrome サンプルには、ユーザー名やパスワードを使用せず、IP アドレスの許可リストでアクセスを許可するプロキシが必要です。 認証情報を含むプロキシ URL は拒否され、認証付きプロキシの設定は実装されていません。

タスクでは、TARGET_URL から抽出したホスト名、login アクション、1 つのプロキシを使用します。solve が準備完了の結果を返すと、同じプロキシと返された userAgent を使って Chrome が起動します。ページへの移動前に、サンプルは返された secChUa ヘッダーも設定します。

Selenium + Python · IP許可リスト方式のプロキシを使うChrome
# Install selenium and the official solvethree Python SDK first.
import os
from urllib.parse import urlsplit
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from solvethree import Solvethree

target = os.environ["TARGET_URL"]  # Your configured HTTPS form page.
proxy_url = os.environ["SOLVETHREE_PROXY"]
proxy = urlsplit(proxy_url)
if proxy.username or proxy.password:
    raise ValueError("This Chrome example requires an IP-allowlisted proxy without URL credentials")
client = Solvethree(os.environ["SOLVETHREE_API_KEY"])
result = client.solve({"site": urlsplit(target).hostname, "action": "login", "proxy": proxy_url})
solution = result["solution"]
options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=" + proxy_url)
options.add_argument("--user-agent=" + solution["userAgent"])
driver = webdriver.Chrome(options=options)
try:
    driver.execute_cdp_cmd("Network.enable", {})
    driver.execute_cdp_cmd("Network.setExtraHTTPHeaders", {
        "headers": {"sec-ch-ua": solution["secChUa"]}
    })
    driver.get(target)
    # Adapt the field and button to your application's form contract.
    field = WebDriverWait(driver, 20).until(
        lambda browser: browser.find_element(By.NAME, "g-recaptcha-response")
    )
    driver.execute_script("""
        arguments[0].value = arguments[1];
        arguments[0].dispatchEvent(new Event('input', {bubbles:true}));
    """, field, solution["token"])
    driver.find_element(By.CSS_SELECTOR, 'button[type="submit"]').click()
    # Check your application's success response here.
finally:
    driver.quit()

Solvethree.solve はタスクを一度だけ作成し、準備完了になるか例外が発生するまでポーリングします。その後に初めて、ブラウザーがフォームに移動します。スクリプトはトークンフィールドを待ち、solution.token を設定し、input イベントを発火させて、送信ボタンをクリックします。Chrome は finally ブロックで閉じられます。

デモのフォームに関する前提を置き換える

  • TARGET_URL は、アプリケーションのフォームページです。タスクの site は完全な URL ではなく、そのホスト名です。reCAPTCHA リクエストでは url フィールドや type フィールドは使用しません。
  • login はサンプルのアクションです。アプリケーションと、その設定済みプロファイルで使用するアクションに置き換えてください。
  • By.NAME と g-recaptcha-response でデモの textarea を特定します。アプリケーションが実際に読み取るフィールドまたは送信パラメーターを使用してください。値の設定と input イベントの発火はデモの受け渡し処理であり、汎用的な reCAPTCHA コールバックではありません。
  • button[type="submit"] はデモの送信ボタンを特定します。フォームのボタンを一意に特定できるセレクターに置き換え、アプリケーションに必要なセッション、CSRF、コールバックの動作を維持してください。

サンプルの 20 秒間の明示的な待機では、textarea が存在することだけを確認します。送信ボタンのクリック後に、成功状態や検証エラーなど、アプリケーションの実際の結果を待つ条件付きの待機を追加してください。ソルバーのタイムアウトとは別に、ブラウザーフロー全体の期限を設定します。状態の確認を固定時間のスリープに置き換えたり、暗黙的な待機と明示的な待機を安易に混在させたりしないでください。

再度解決料金を支払う前に、失敗したステップを確認する

Chrome が起動する前に解決タスクが失敗する。

終了したタスクの errorCode と error を確認してください。タスクの失敗と HTTP リクエストエラーを区別してください。

試してみましょう: 再試行する前に、報告された入力、プロファイル、接続の問題を修正してください。失敗したタスクのポーリングは停止してください。無効な入力を変更せずに再度リクエストしても、結果は改善しません。

Selenium が textarea を見つけられずタイムアウトする。

Chrome が意図したフォームに到達し、ページにデモで指定した名前のフィールドが実際に含まれていることを確認してください。

試してみましょう: デモのロケーターをアプリケーションのトークン受け渡し処理に置き換え、その処理が利用可能になる状態を待ってください。タイムアウトを長くしても、誤ったセレクターは修正されません。

トークンの準備はできているが、アプリケーションが送信を拒否する。

まず、アプリケーションから送信されるリクエストを確認してください。タスク ID や古い値ではなく solution.token が含まれていること、またアクション、プロキシ、ブラウザー識別情報、セッションが意図したフローと一致していることを確認してください。

試してみましょう: 別のトークンをリクエストする前に、送信したパラメーターやアプリケーション側の要件を修正してください。ready 状態のタスクは解答を提供しますが、送信が受け入れられたかどうかはアプリケーションの応答で判断します。

最初のタスクを実行しましょう。

$5のワークスペースクレジットで始められます。

ワークスペースを作成
SeleniumでCAPTCHAソルバーを使う · solvethree