Usa solvethree en una vista de Django

Por solvethree5 min de lectura

Crea la tarea en una vista POST, devuelve su ID y permite que quien la llama consulte su estado. No mantengas abierta la solicitud de creación hasta que termine la resolución.

Las vistas proporcionadas utilizan un destino reCAPTCHA Enterprise configurado y un único proxy. Están pensadas para un proyecto Django existente con autenticación y el middleware CSRF estándar habilitados.

En esta página

Instala el SDK y configura el destino

  1. 1.

    Instala en el entorno de Django

    El SDK oficial requiere Python 3.10+. En el entorno donde se ejecuta Django, usa 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, CAPTCHA_SITE con el nombre de host del destino, no una URL completa, y SOLVETHREE_PROXY con el proxy utilizado para la resolución y el posterior envío al destino. Mantén la clave de API y las credenciales del proxy en el servidor.

  3. 3.

    Activa el perfil del sitio

    Configura en la consola un perfil activo para ese nombre de host, disponible para tu espacio de trabajo. Enviar un nombre de host y una acción no crea un perfil. Consulta la configuración del perfil del sitio.

El ejemplo fija la acción en login y no acepta ajustes del destino de quien lo llama. Cambia esa acción si tu destino configurado requiere otra. La solicitud usa el modo predeterminado enterprise-v3; necesita site, action y exactamente uno de proxy o proxyCandidates, no type ni url.

Añade las vistas autenticadas

Django · vistas autenticadas con protección CSRF normal
# views.py in an existing Django project with authentication/CSRF configured.
import os
from django.contrib.auth.decorators import login_required
from django.http import JsonResponse
from django.views.decorators.http import require_GET, require_POST
from solvethree import Solvethree, SolvethreeError

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

@login_required
@require_POST
def create_captcha(request):
    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"]
    try:
        return JsonResponse(client().create_task(task, wait_ms=0, timeout=20))
    except ValueError:
        return JsonResponse({"error": "Invalid task input"}, status=400)
    except SolvethreeError as error:
        return JsonResponse({"requestId": error.request_id, "taskId": error.task_id}, status=502)

@login_required
@require_GET
def get_captcha(request, task_id):
    try:
        return JsonResponse(client().get_task(task_id, wait_ms=15000, timeout=25))
    except ValueError:
        return JsonResponse({"error": "Invalid task ID"}, status=400)
    except SolvethreeError as error:
        return JsonResponse({"requestId": error.request_id, "taskId": error.task_id}, status=502)

# urls.py: import these views and add to urlpatterns:
# path("captcha/tasks", create_captcha),
# path("captcha/tasks/<str:task_id>", get_captcha),

create_task usa wait_ms=0, por lo que devuelve la tarea sin esperar a que termine toda la resolución. Su llamada HTTP tiene un tiempo de espera de 20 segundos. La vista de recuperación puede esperar hasta 15 segundos a que se actualice una tarea, con un tiempo de espera HTTP de 25 segundos. Son llamadas síncronas al SDK: la solicitud de recuperación sigue ocupando su proceso de trabajo de Django mientras espera.

login_required restringe el acceso a los usuarios que han iniciado sesión; los decoradores de método permiten POST para la creación y GET para la recuperación. Mantén la protección CSRF habitual de Django e incluye su token CSRF al enviar un POST. No añadas csrf_exempt.

Conecta las rutas e inicia Django

  1. 1.

    Actualiza el URLconf existente

    Importa path desde django.urls e importa create_captcha y get_captcha desde el módulo de vistas de tu aplicación. Añade las dos entradas de ruta que se muestran al final del ejemplo a los urlpatterns existentes. Si utilizas un URLconf de aplicación, asegúrate de que el URLconf del proyecto lo incluya.

  2. 2.

    Inicia el servidor de desarrollo

    Con las variables de entorno disponibles para el proceso, ejecuta python manage.py runserver desde el directorio que contiene manage.py. Utiliza el flujo de inicio de sesión existente de tu proyecto antes de llamar a los endpoints.

  3. 3.

    Utiliza las rutas registradas

    Sin un prefijo de URL que las englobe, la creación es POST /captcha/tasks y la recuperación es GET /captcha/tasks/<task_id>. Las rutas proporcionadas no tienen barra final. Incluye cualquier prefijo introducido por el URLconf de tu proyecto.

Crea una sola vez y después recupera la tarea

  1. 1.

    Guarda un ID antes de enviar el POST

    Elige un X-Request-ID nuevo para cada tarea lógica y consérvalo hasta que se resuelva la creación. Usa entre 1 y 64 letras ASCII, números, guiones bajos o guiones. La vista reenvía esta cabecera como el requestId de la tarea.

  2. 2.

    Comprueba el éxito HTTP antes del estado de la tarea

    El ejemplo devuelve HTTP 400 para los errores de validación de entrada capturados y 502 para los errores del SDK capturados. Una respuesta correcta contiene los datos de la tarea; lee su id y su status. El éxito HTTP significa que la solicitud se ha completado correctamente, no que haya un token listo.

  3. 3.

    Consulta la tarea hasta que termine

    Llama al endpoint GET con el ID de tarea devuelto. Continúa si está en pending o solving. Cuando esté en ready, utiliza la solución. Si está en failed, deja de consultar y revisa errorCode y error; las resoluciones fallidas se reembolsan. Corrige los datos de entrada no válidos en lugar de reintentarlo sin cambiarlos.

  4. 4.

    Recupera una creación de resultado incierto

    Si el POST agota el tiempo de espera o devuelve un error del SDK, no crees inmediatamente otra tarea con un ID nuevo. Recupera la tarea existente si conoces su ID. De lo contrario, repite el POST con el X-Request-ID original y sin cambiar los datos de entrada de la tarea para recuperarla. Reutilizar ese ID con datos de entrada diferentes genera un conflicto, incluidos los cambios en el nombre de host, la acción o el proxy configurados.

La respuesta de error del SDK incluye requestId y taskId de la excepción para el diagnóstico. Conserva por separado el X-Request-ID original de quien realiza la llamada para que la recuperación no dependa de recibir esa respuesta. Consulta Errores de la API de CAPTCHA para gestionar los fallos.

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

Solo una tarea ready contiene una solución utilizable. El valor que debes enviar al destino previsto es solution.token, no el ID de tarea. Utiliza la identidad de navegador devuelta en solution.userAgent y solution.secChUa, junto con el proxy original configurado en SOLVETHREE_PROXY.

Estas vistas no envían nada al destino. Tu código de envío debe conservar ese proxy y aplicar la identidad devuelta; devolver el token a una sesión de navegador ajena no lo hace automáticamente. Mantén las credenciales del proxy en el servidor y no mezcles la solución con otra URL de destino ni con otra identidad de navegador.

Ejecuta tu primera tarea.

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

Crear un espacio de trabajo
Usa solvethree en una vista de Django · solvethree