Llama a solvethree desde un backend de Flask

Por solvethree5 min de lectura

Usa rutas de Flask independientes para crear y consultar una tarea de solvethree. El POST siguiente devuelve una respuesta sin esperar a que termine toda la resolución; el solicitante conserva el ID de tarea y consulta la ruta GET hasta que la tarea esté lista o haya fallado.

En esta página

Instala las dependencias y configura el destino

  1. 1.

    Usa Python 3.10 o posterior

    Instala Flask con python -m pip install flask. Instala el SDK oficial de Python con python -m pip install https://solvethree.com/downloads/solvethree_sdk-0.1.0-py3-none-any.whl.

  2. 2.

    Establece las variables de entorno del servidor

    Establece SOLVETHREE_API_KEY con la clave de API de tu espacio de trabajo e INTEGRATION_KEY con el secreto que tu solicitante autorizado enviará en X-Integration-Key. Establece CAPTCHA_SITE con el nombre de host de destino, no una URL completa, y SOLVETHREE_PROXY con la URL del proxy HTTP o HTTPS usado para esta tarea. Mantén estos valores en el servidor.

  3. 3.

    Activa el perfil del sitio

    Configura un perfil activo para ese nombre de host en la consola de solvethree, disponible para tu espacio de trabajo. Establecer CAPTCHA_SITE no crea un perfil. Consulta la configuración del perfil del sitio si el destino aún no está configurado.

El ejemplo fija la acción en login y usa la tarea predeterminada de reCAPTCHA Enterprise v3. Cambia esa acción para que coincida con la operación de destino antes de ejecutarlo. El solicitante no puede modificar el sitio, la acción ni el proxy mediante el cuerpo de la solicitud.

Añade las rutas de creación y consulta

Flask · crear y recuperar la misma tarea
# 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))

Guarda el ejemplo como app.py. Con las variables de entorno establecidas, inícialo localmente con python -m flask --app app run. Las rutas son POST /captcha/tasks y GET /captcha/tasks/<task_id>. Flask no necesita un URLconf aparte: los decoradores registran ambas rutas. Consulta la guía de inicio rápido de Flask para obtener detalles sobre el inicio local; mantén tu configuración WSGI de producción actual.

La creación usa wait_ms=0 con un tiempo de espera de red de 20 segundos. Esto omite la espera de la resolución, no la de la propia solicitud HTTP. La consulta permite esperar hasta 15 segundos a una actualización de la tarea, con un tiempo de espera de red de 25 segundos. Ambas vistas usan el SDK síncrono, por lo que cada una ocupa su proceso de atención de solicitudes mientras se ejecuta la llamada al SDK.

Guarda el ID de solicitud antes de enviar el POST

  1. 1.

    Crea un ID de solicitud por cada tarea lógica

    Guárdalo antes de llamar a POST /captcha/tasks y envíalo como X-Request-ID junto con X-Integration-Key. Usa entre 1 y 64 letras ASCII, números, guiones bajos o guiones. Este POST no necesita un cuerpo de tarea porque el servidor construye la tarea a partir de su configuración fija.

  2. 2.

    Conserva el identificador de tarea devuelto

    Tras una respuesta HTTP correcta, guarda el id del resultado. Recupéralo mediante GET /captcha/tasks/<task_id>, enviando de nuevo X-Integration-Key.

  3. 3.

    Recupera una creación de resultado incierto en lugar de crear otra tarea

    Si la conexión del POST agota el tiempo de espera, es posible que la creación se haya completado. Recupera la tarea si tienes su ID. De lo contrario, repite el POST con el mismo X-Request-ID y sin cambiar los datos de entrada de la tarea para recuperar la tarea existente. Reutilizar el ID después de cambiar el sitio, la acción o el proxy genera un conflicto.

La cabecera es opcional en el ejemplo, pero omitirla elimina esta opción de recuperación si la creación se completa y se pierde la respuesta. No generes un ID nuevo solo porque la primera solicitud haya agotado el tiempo de espera.

Gestiona los errores HTTP antes de comprobar el estado de la tarea

Comprueba primero el estado HTTP de la respuesta de Flask. El ejemplo devuelve 401 si falta la clave de integración o es incorrecta, 400 si se captura un ValueError y 502 si se captura un SolvethreeError. El cuerpo de esa respuesta 502 expone requestId y taskId para la recuperación; no contiene el estado de la tarea y, por sí solo, no significa que la tarea haya fallado.

Tras una respuesta HTTP correcta, comprueba el estado de la tarea.
Tras una respuesta HTTP correcta, comprueba el estado de la tarea.
Estado de la tareaAcción del solicitante
pendienteConserva el mismo ID de tarea y vuelve a consultarla.
en resoluciónConserva el mismo ID de tarea y vuelve a consultarla.
listoDeja de consultar y lee la solución.
failedDeja de consultar y revisa errorCode y error. Las resoluciones fallidas se reembolsan.

Envía el token con el proxy original y la identidad devuelta

Solo un resultado ready contiene una solución utilizable. Envía solution.token al destino previsto, no el ID de tarea, y utiliza la identidad de navegador devuelta en solution.userAgent y solution.secChUa.

Realiza el envío a través del mismo proxy utilizado para crear la tarea. Este ejemplo usa un único SOLVETHREE_PROXY fijo, así que conserva la configuración original del proxy junto con la tarea en lugar de asumir que el valor actual del entorno seguirá coincidiendo más adelante. Las rutas de Flask devuelven el resultado del SDK; no realizan el envío al destino ni configuran el proxy de quien las llama.

Mantén juntos el token, el proxy, la identidad del navegador y el destino previsto. Una tarea lista significa que solvethree ha generado una solución; la aceptación la determina la respuesta del destino a la solicitud posterior de la aplicación.

Ejecuta tu primera tarea.

Empieza con $5 de crédito en tu espacio de trabajo.

Crear un espacio de trabajo
Llama a solvethree desde un backend de Flask · solvethree