PythonでreCAPTCHA Enterpriseを解決
公式Python SDKでreCAPTCHA v3 Enterpriseトークンをリクエストし、返されたブラウザー識別情報と同じプロキシを使ってsolution.tokenを送信します。Python 3.10以降、ワークスペースのAPIキー、対象サイトの有効なプロファイルが必要です。
このページの内容
SDKのインストールとサイトの設定
公式Python SDKをインストールします。
python -m pip install https://solvethree.com/downloads/solvethree_sdk-0.1.0-py3-none-any.whl- 1.
サイトプロファイルの作成
solvethreeコンソールで対象のホスト名を設定し、そのプロファイルが有効で、ワークスペースから利用できることを確認してください。解決リクエストでホスト名を送信しても、プロファイルは作成されません。まだ設定していない場合は、サイトプロファイルの設定を参照してください。
- 2.
SOLVETHREE_API_KEYの設定
スクリプトを実行するシェルまたはデプロイ環境で、
SOLVETHREE_API_KEYにワークスペースのAPIキーを設定してください。キーはサーバー側で保持し、ブラウザーコードやコミットするソースファイルには含めないでください。 - 3.
SOLVETHREE_PROXYの設定
SOLVETHREE_PROXYに、解決処理とその後のアプリケーションリクエストで使用するプロキシURLを設定してください。この例ではプロキシを1つ使用するため、proxyCandidatesは追加しないでください。
Enterpriseトークンのリクエスト
この例をsolve.pyとして保存してください。accounts.example.comを設定済みのホスト名に置き換え、スキームやパスは含めないでください。また、loginを対象ページで使用されるアクションに置き換えてください。
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を含む、アプリケーションの実際のリクエストに置き換えてください。
# 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に従います。待機と復旧をより細かく制御する方法については、タスクのポーリングとタイムアウトを参照してください。
参照元とAPIリファレンス
最初のタスクを実行しましょう。
$5のワークスペースクレジットで始められます。