PythonでreCAPTCHA Enterpriseを解決

著者:solvethree読了時間:1分

公式Python SDKでreCAPTCHA v3 Enterpriseトークンをリクエストし、返されたブラウザー識別情報と同じプロキシを使ってsolution.tokenを送信します。Python 3.10以降、ワークスペースのAPIキー、対象サイトの有効なプロファイルが必要です。

このページの内容

SDKのインストールとサイトの設定

公式Python SDKをインストールします。

Python SDKをインストール
python -m pip install https://solvethree.com/downloads/solvethree_sdk-0.1.0-py3-none-any.whl
  1. 1.

    サイトプロファイルの作成

    solvethreeコンソールで対象のホスト名を設定し、そのプロファイルが有効で、ワークスペースから利用できることを確認してください。解決リクエストでホスト名を送信しても、プロファイルは作成されません。まだ設定していない場合は、サイトプロファイルの設定を参照してください。

  2. 2.

    SOLVETHREE_API_KEYの設定

    スクリプトを実行するシェルまたはデプロイ環境で、SOLVETHREE_API_KEYにワークスペースのAPIキーを設定してください。キーはサーバー側で保持し、ブラウザーコードやコミットするソースファイルには含めないでください。

  3. 3.

    SOLVETHREE_PROXYの設定

    SOLVETHREE_PROXYに、解決処理とその後のアプリケーションリクエストで使用するプロキシURLを設定してください。この例ではプロキシを1つ使用するため、proxyCandidatesは追加しないでください。

Enterpriseトークンのリクエスト

この例をsolve.pyとして保存してください。accounts.example.comを設定済みのホスト名に置き換え、スキームやパスは含めないでください。また、loginを対象ページで使用されるアクションに置き換えてください。

Python · solve.py
import os
from uuid import uuid4
from solvethree import Solvethree, SolvethreeError, TaskFailedError

client = Solvethree(os.environ["SOLVETHREE_API_KEY"])
request = {
    "site": "accounts.example.com",  # Use your configured hostname.
    "action": "login",              # Use the page's actual action.
    "proxy": os.environ["SOLVETHREE_PROXY"],
    "requestId": str(uuid4()),
}
try:
    result = client.solve(request, timeout=180)
except TaskFailedError as error:
    raise SystemExit(f"Task failed: {error.error_code}") from None
except SolvethreeError as error:
    # Keep these IDs so an interrupted request can be recovered.
    raise SystemExit(f"Recover request {error.request_id}, task {error.task_id}") from None

solution = result["solution"]
token = solution["token"]
user_agent = solution["userAgent"]
client_hints = solution["secChUa"]
print("Ready task:", result["id"])  # Do not print the token or proxy password.

リクエストのデフォルトはenterprise-v3なので、recaptchaTypeフィールドは不要です。typeやurlはreCAPTCHAのリクエストフィールドではないため、追加しないでください。

Solvethreeは同期型です。client.solveはタスクを一度作成し、準備完了の結果を返すか例外を送出するまでポーリングします。ここでは、timeout=180でクライアントの待機時間に180秒の上限を設定しています。成功すると、スクリプトは機密性の高い値を出力せずに、トークン、ユーザーエージェント、クライアントヒントを抽出します。

アプリケーションへのトークン送信

解決処理の後、同じスクリプト内で処理を続けます。例の注記に従って、requestsを別途インストールしてください。ログインURLとフォームデータを、必要な認証情報、CSRFトークン、セッションCookieを含む、アプリケーションの実際のリクエストに置き換えてください。

Python requests · 準備完了のソリューションを適用
# Continue after client.solve(). Install requests separately: pip install requests.
import requests

# This example endpoint accepts the standard reCAPTCHA form field.
# Use your application's real URL, form fields, CSRF token and session.
response = requests.post(
    "https://accounts.example.com/login",
    data={"g-recaptcha-response": solution["token"]},
    headers={
        "User-Agent": solution["userAgent"],
        "sec-ch-ua": solution["secChUa"],
    },
    proxies={"http": request["proxy"], "https": request["proxy"]},
    timeout=30,
    allow_redirects=False,
)
# Inspect the application's response to determine whether it accepted the request.
print("Application HTTP status:", response.status_code)

この例では、アプリケーションがg-recaptcha-responseでトークンを受け付けることを前提としています。このフィールド名を決めつけず、実際のリクエストを確認してください。フォームが既存のセッションに依存している場合は、Cookieのない新規リクエストを送るのではなく、そのセッションを通じて送信してください。

返されたuserAgentとsecChUaを保持し、解決時に指定したものと同じプロキシを使用してください。IPを切り替えたり、無関係なブラウザー識別情報に置き換えたりすると、リクエストが失敗する可能性があります。

タスクが準備完了になったことは、解決結果が生成されたことを意味し、アプリケーションが受け入れたことを意味するわけではありません。アプリケーションのレスポンスと、その結果のセッションを確認してください。HTTPステータスだけでは、ログインの成功を確認できません。トークンが拒否された場合は、別の解決処理に料金を支払う前に、送信リクエストを確認してください。タスクIDや古いトークンではなく、solution.tokenが含まれている必要があります。トークン拒否の原因診断を参照してください。

別のタスクを作成せずに中断した解決処理を復旧する

この例では、スクリプトが起動するたびに新しいrequestIdを生成します。プロセスの再起動後に復旧する必要がある場合は、solveを呼び出す前に、そのIDと元のリクエストを保存してください。単にスクリプトを再実行すると、新しい論理リクエストが作成されます。

  • 例外にtask_idが含まれている場合は、get_taskを使ってそのタスクのポーリングを再開してください。接続がタイムアウトしたという理由だけで、代わりのタスクを作成しないでください。
  • 作成が中断し、request_idしかない場合は、同じrequestIdを使って、まったく同じタスクリクエストを再送してください。既存のタスクが返されます。同じIDを再利用しながらタスクの入力を変更すると、競合が発生します。
  • TaskFailedErrorの場合は、そのタスクのポーリングを停止してください。再試行する前にerrorCodeとerrorを確認してください。無効な入力を変更しないまま別の解決処理を行っても、問題は解消しません。失敗した解決処理の料金は返金されます。

SDKはタスク作成を自動的には再試行しません。ただし、解決処理の期限内に発生した一時的なポーリングの失敗では、Retry-Afterに従います。待機と復旧をより細かく制御する方法については、タスクのポーリングとタイムアウトを参照してください。

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

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

ワークスペースを作成
PythonでreCAPTCHA Enterpriseを解決 · solvethree