Python HTTPXでreCAPTCHAトークンを送信する

著者:solvethree読了時間:1分

対象に POST する際は、solution.token、解決に成功したプロキシ、返されたブラウザー識別情報を使用してください。アプリケーションの Cookie は 1 つの HTTPX クライアントで保持してください。有効なトークンがあっても、セッションや CSRF の要件は満たす必要があります。

このページの内容

成功したプロキシ経由で準備完了のトークンを送信する

pip install httpx で HTTPX をインストールしてください。この例では公式 Python SDK も使用します。未インストールの場合は、Python SDK の設定を参照してください。

この例には、結果の取得元を示すために解決呼び出しを含めています。すでに ready の SDK 結果がある場合は、元の request とともに result として再利用してください。トークンを送信するためだけに別のタスクを作成しないでください。

  • SOLVETHREE_API_KEY にワークスペースの API キーを、SOLVETHREE_PROXY にプロキシ URL を設定してください。API キーはサーバー上で保持してください。
  • accounts.example.com、login アクション、送信先 URL を、対象の値に置き換えてください。そのホスト名には、ワークスペース内の有効なサイトプロファイルが必要です。サイトプロファイルの設定を参照してください。
  • フォームフィールドをアプリケーションの実際のリクエストに合わせて変更してください。この例は CAPTCHA フィールドのみを送信するもので、完全なログインフォームではありません。
HTTPX · プロキシと返されたブラウザー識別情報を再利用
# pip install httpx and the official solvethree SDK wheel.
import os
import httpx
from solvethree import Solvethree, successful_proxy

request = {"site": "accounts.example.com", "action": "login", "proxy": os.environ["SOLVETHREE_PROXY"]}
result = Solvethree(os.environ["SOLVETHREE_API_KEY"]).solve(request, timeout=180)
solution = result["solution"]
proxy = successful_proxy(request, result)
if proxy is None:
    raise RuntimeError("No valid successful proxy")
with httpx.Client(proxy=proxy, timeout=30, follow_redirects=False, trust_env=False) as target:
    # Use this client's cookie jar for any required application session first.
    response = target.post("https://accounts.example.com/login",
        data={"g-recaptcha-response": solution["token"]},
        headers={"User-Agent": solution["userAgent"], "sec-ch-ua": solution["secChUa"]})
    print("Application HTTP status:", response.status_code)
    # Check the application's actual response and required CSRF/session fields.

successful_proxy(request, result) は、送信時に再利用するプロキシを選択します。有効なプロキシが返されない場合に送信を停止するチェックは残してください。HTTPX では、proxies= ではなく、現在の単数形の proxy= パラメーターを使用してください。trust_env=False を設定すると、環境変数のプロキシ設定によって、明示的に選択した経路が変更されるのを防げます。

Cookie、ブラウザー識別情報、フォームフィールドを一緒に管理する

セッションの確立や CSRF 値の取得のために最初のページリクエストが必要な場合は、POST の前に同じ HTTPX クライアント内でそのリクエストを実行してください。クライアントの Cookie jar は、リクエスト間で Cookie を保持します。別のクライアントにそのセッションが自動的に引き継がれることはありません。

これらの事前リクエストでも、無関係なブラウザー識別情報ではなく、返された userAgent と secChUa を使用してください。この例では、POST 時にそれぞれを User-Agent と sec-ch-ua として指定しています。本来の対象に解決結果を送信する際は、これらのヘッダーと成功したプロキシを一貫して使用してください。

data= はフォームデータを送信します。ここでは、g-recaptcha-response に solution.token を指定します。タスク ID や解決結果の辞書全体を指定してはいけません。フィールド名は対象の実際のリクエストに合わせ、必要な認証情報、隠しフィールド、CSRF 値も同じ送信に含めてください。

送信成功と判断する前にリダイレクトを確認する

follow_redirects=False にすると、アプリケーションの最初のレスポンスを確認できます。リダイレクトする場合は、ステータスと転送先を確認してから、同じクライアントでアプリケーションが想定する次のステップに明示的に進んでください。別の URL にトークンを自動的に再送信しないでください。

表示される HTTP ステータスは、確認の出発点にすぎません。対象がリクエストを受け入れたかどうかは、レスポンス本文、リダイレクト先、またはその後のアプリケーションの状態を確認して判断してください。200 レスポンスやリダイレクトは、成功フローとエラーフローのどちらでも返される可能性があります。solvethree の ready ステータスは解決結果が生成されたことを意味し、対象がそれを受け入れたことを意味するものではありません。

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

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

ワークスペースを作成
Python HTTPXでreCAPTCHAトークンを送信する · solvethree