Llama a solvethree desde un backend de Flask
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.
Usa Python 3.10 o posterior
Instala Flask con
python -m pip install flask. Instala el SDK oficial de Python conpython -m pip install https://solvethree.com/downloads/solvethree_sdk-0.1.0-py3-none-any.whl. - 2.
Establece las variables de entorno del servidor
Establece
SOLVETHREE_API_KEYcon la clave de API de tu espacio de trabajo eINTEGRATION_KEYcon el secreto que tu solicitante autorizado enviará enX-Integration-Key. EstableceCAPTCHA_SITEcon el nombre de host de destino, no una URL completa, ySOLVETHREE_PROXYcon la URL del proxy HTTP o HTTPS usado para esta tarea. Mantén estos valores en el servidor. - 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_SITEno 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
# 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.
Crea un ID de solicitud por cada tarea lógica
Guárdalo antes de llamar a
POST /captcha/tasksy envíalo comoX-Request-IDjunto conX-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.
Conserva el identificador de tarea devuelto
Tras una respuesta HTTP correcta, guarda el
iddel resultado. Recupéralo medianteGET /captcha/tasks/<task_id>, enviando de nuevoX-Integration-Key. - 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-IDy 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.
| Estado de la tarea | Acción del solicitante |
|---|---|
| pendiente | Conserva el mismo ID de tarea y vuelve a consultarla. |
| en resolución | Conserva el mismo ID de tarea y vuelve a consultarla. |
| listo | Deja de consultar y lee la solución. |
| failed | Deja 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.
Fuentes y referencia de la API
Ejecuta tu primera tarea.
Empieza con $5 de crédito en tu espacio de trabajo.