Flaskバックエンドからsolvethreeを呼び出す

著者:solvethree読了時間:1分

solvethree タスクの作成と取得には、別々の Flask ルートを使用してください。以下の POST は解答生成全体の完了を待たずに返ります。呼び出し元はタスク ID を保持し、タスクが ready または failed になるまで GET ルートで確認を続けます。

このページの内容

依存関係をインストールして対象を設定する

  1. 1.

    Python 3.10 以降を使用する

    python -m pip install flask で Flask をインストールしてください。python -m pip install https://solvethree.com/downloads/solvethree_sdk-0.1.0-py3-none-any.whl で公式 Python SDK をインストールしてください。

  2. 2.

    サーバーの環境変数を設定する

    SOLVETHREE_API_KEY にワークスペース API キーを、INTEGRATION_KEY に認可された呼び出し元が X-Integration-Key で送信するシークレットを設定してください。CAPTCHA_SITE には完全な URL ではなく対象のホスト名を、SOLVETHREE_PROXY にはこのタスクで使用する HTTP または HTTPS プロキシの URL を設定してください。これらの値はサーバーで保持してください。

  3. 3.

    サイトプロファイルの有効化

    solvethree コンソールで、そのホスト名に対する、ワークスペースで利用可能な有効なプロファイルを設定してください。CAPTCHA_SITE を設定してもプロファイルは作成されません。対象がまだ設定されていない場合は、サイトプロファイルの設定を参照してください。

この例ではアクションを login に固定し、デフォルトの reCAPTCHA Enterprise v3 タスクを使用します。実行前に、対象の操作に合わせてアクションを変更してください。呼び出し元はリクエスト本文からサイト、アクション、プロキシを上書きできません。

作成・取得ルートを追加する

Flask · 同じタスクを作成して取得
# pip install flask and the official solvethree SDK wheel.
import hmac
import os
from flask import Flask, abort, jsonify, request
from solvethree import Solvethree, SolvethreeError

app = Flask(__name__)

def client():
    return Solvethree(os.environ["SOLVETHREE_API_KEY"])

@app.before_request
def authorize():
    if not hmac.compare_digest(request.headers.get("x-integration-key", ""), os.environ["INTEGRATION_KEY"]):
        abort(401)

@app.errorhandler(SolvethreeError)
def task_error(error):
    return jsonify(requestId=error.request_id, taskId=error.task_id), 502

@app.errorhandler(ValueError)
def invalid_input(error):
    return jsonify(error="Invalid task input or ID"), 400

@app.post("/captcha/tasks")
def create():
    task = {"site": os.environ["CAPTCHA_SITE"], "action": "login", "proxy": os.environ["SOLVETHREE_PROXY"]}
    if request.headers.get("x-request-id"):
        task["requestId"] = request.headers["x-request-id"]
    return jsonify(client().create_task(task, wait_ms=0, timeout=20))

@app.get("/captcha/tasks/<task_id>")
def retrieve(task_id):
    return jsonify(client().get_task(task_id, wait_ms=15000, timeout=25))

この例を app.py として保存してください。環境変数を設定した状態で、python -m flask --app app run を使ってローカルで起動します。ルートは POST /captcha/tasks と GET /captcha/tasks/<task_id> です。Flask ではデコレーターが両方のルートを登録するため、別の URLconf は必要ありません。ローカルでの起動の詳細は Flask クイックスタートを参照してください。本番環境の既存の WSGI 設定はそのまま使用してください。

作成では wait_ms=0 と20秒のネットワークタイムアウトを使用します。省略されるのは解答生成の待機であり、HTTP リクエスト自体の待機ではありません。取得では、タスクの更新を最大15秒待機し、ネットワークタイムアウトを25秒に設定します。どちらのビューも同期 SDK を使用するため、SDK 呼び出しの実行中はそれぞれリクエストワーカーを占有します。

POSTを送信する前にリクエストIDを保持する

  1. 1.

    論理タスクごとにリクエストIDを1つ作成する

    POST /captcha/tasksを呼び出す前に保存し、X-Integration-KeyとともにX-Request-IDとして送信してください。1–64文字のASCII英字、数字、アンダースコア、ハイフンを使用します。サーバーが固定設定からタスクを構築するため、このPOSTにタスクのリクエストボディは不要です。

  2. 2.

    返されたタスクIDを保持

    HTTP応答が成功したら、結果のidを保存してください。X-Integration-Keyを再度送信し、GET /captcha/tasks/<task_id>でタスクを取得します。

  3. 3.

    別のタスクを作成せず、作成結果が不明なタスクを復旧する

    POSTの接続がタイムアウトしても、作成は成功している可能性があります。タスクIDがあれば、そのタスクを取得してください。なければ、同じX-Request-IDと変更していないタスク入力でPOSTを再送し、既存のタスクを復旧してください。サイト、アクション、プロキシを変更した後にIDを再利用すると競合します。

このサンプルではヘッダーは任意ですが、省略すると、作成が成功して応答が失われた場合にこの復旧方法を使えなくなります。最初のリクエストがタイムアウトしたという理由だけで、新しいIDを生成しないでください。

タスクのステータスより先にHTTPエラーを処理する

まずFlask応答のHTTPステータスを確認してください。この例では、連携キーがないか正しくない場合に401、ValueErrorを捕捉した場合に400、SolvethreeErrorを捕捉した場合に502を返します。この502のボディには復旧用のrequestIdとtaskIdが含まれます。これはタスクステータスのペイロードではなく、それだけでタスクの失敗を意味するものではありません。

HTTP応答が成功したら、タスクのステータスを確認してください。
HTTP応答が成功したら、タスクのステータスを確認してください。
タスクのステータス呼び出し元の処理
待機中同じタスクIDを保持し、再度取得してください。
解決中同じタスクIDを保持し、再度取得してください。
readyポーリングを停止し、解決結果を読み取ってください。
failedポーリングを停止し、errorCodeとerrorを確認してください。解決に失敗した場合は返金されます。

元のプロキシと返された識別情報を使ってトークンを送信する

使用可能な解決結果が含まれるのは、readyの結果だけです。対象の送信先にはタスクIDではなくsolution.tokenを送信し、返されたsolution.userAgentとsolution.secChUaのブラウザー識別情報を使用してください。

タスクの作成時と同じプロキシを使って送信してください。この例では固定のSOLVETHREE_PROXYを1つ使用するため、後で環境変数の値が同じままだと想定せず、元のプロキシ設定をタスクとともに保持してください。FlaskのルートはSDKの結果を返すだけで、対象への送信や呼び出し元のプロキシ設定は行いません。

トークン、プロキシ、ブラウザー識別情報、対象の送信先をひとまとめに保持してください。タスクが準備完了であることは、solvethreeが解決結果を生成したことを意味します。受け入れられたかどうかは、その後のアプリケーションリクエストに対する対象の応答で決まります。

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

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

ワークスペースを作成
Flaskバックエンドからsolvethreeを呼び出す · solvethree