Llama a la API de CAPTCHA desde Laravel

Por solvethree4 min de lectura

Usa el cliente HTTP de Laravel para crear una tarea de solvethree y luego recuperarla por su ID. Mantén la clave de API y las credenciales del proxy en el servidor. Una respuesta HTTP satisfactoria no basta: comprueba el estado de la tarea antes de usar su solución.

En esta página

Configura el sitio y las credenciales del servidor

  1. 1.

    Activa el perfil del sitio

    Configura el nombre de host de destino en la consola para que tu espacio de trabajo tenga un perfil de reCAPTCHA activo. Enviar un nombre de host en una tarea no crea un perfil. Consulta la configuración del perfil del sitio.

  2. 2.

    Añade la configuración del servidor

    Añade la entrada solvethree del ejemplo al array existente en config/services.php. Define SOLVETHREE_API_KEY, CAPTCHA_SITE y SOLVETHREE_PROXY en el entorno del servidor. Mantén estos valores fuera del código del navegador; CAPTCHA_SITE es el nombre de host, no una URL completa.

  3. 3.

    Usa la acción del destino

    El ejemplo envía login. Cámbialo por la acción que usa la solicitud de destino prevista. Proporciona un único proxy; no envíes también proxyCandidates.

Crea un servicio con métodos separados para crear y recuperar

Servicio de Laravel · creación y recuperación autenticadas por HTTP
<?php
// app/Services/CaptchaApi.php — configure services.solvethree in config/services.php.
namespace App\Services;

use Illuminate\Support\Facades\Http;
use InvalidArgumentException;

final class CaptchaApi
{
    private function client()
    {
        return Http::baseUrl('https://api.solvethree.com/v1')
            ->withToken(config('services.solvethree.key'))
            ->acceptJson()->asJson()->connectTimeout(10)->timeout(25);
    }

    public function create(string $requestId): array
    {
        if (!preg_match('/^[A-Za-z0-9_-]{1,64}$/', $requestId)) {
            throw new InvalidArgumentException('Invalid logical request ID');
        }
        // The caller keeps this requestId; do not generate another on a timeout.
        return $this->client()->post('/tasks?waitMs=0', [
            'site' => config('services.solvethree.site'),
            'action' => 'login',
            'proxy' => config('services.solvethree.proxy'),
            'requestId' => $requestId,
        ])->throw()->json();
    }

    public function retrieve(string $taskId): array
    {
        if (!preg_match('/^[A-Za-z0-9_-]{1,128}$/', $taskId)) {
            throw new InvalidArgumentException('Invalid task ID');
        }
        return $this->client()->get('/tasks/'.rawurlencode($taskId), ['waitMs' => 15000])
            ->throw()->json();
    }
}
// config/services.php entry:
// 'solvethree' => ['key' => env('SOLVETHREE_API_KEY'),
//   'site' => env('CAPTCHA_SITE'), 'proxy' => env('SOLVETHREE_PROXY')],
// Invoke from your authenticated controller/job. Poll retrieve only while pending
// or solving; ready contains the solution, failed is terminal. Never use retry()
// on create without preserving both this ID and the exact original inputs.

withToken envía la clave del espacio de trabajo como autenticación Bearer. El cuerpo de POST es plano: site, action, proxy y requestId son campos de nivel superior. No añadas un campo type ni url para reCAPTCHA. Omitir recaptchaType selecciona el valor predeterminado documentado enterprise-v3.

Ambos métodos llaman a throw() antes de json(). El cliente HTTP de Laravel no lanza excepciones de forma predeterminada ante respuestas HTTP no satisfactorias, por lo que esto evita que el código que llama al servicio trate el contenido de un error HTTP como una respuesta de tarea satisfactoria. El servicio establece tiempos de espera de conexión y de solicitud y, de forma deliberada, no reintenta POST automáticamente.

Conserva el ID de la tarea y comprueba su estado

  1. 1.

    Crea una sola tarea por cada resolución lógica

    Desde tu controlador o trabajo autenticado, conserva un requestId generado por quien realiza la solicitud antes de llamar a create. Debe contener entre 1 y 64 letras ASCII, números, guiones bajos o guiones. Guarda por separado el ID de tarea devuelto: el ID de solicitud lógico sirve para recuperar la creación; el ID de tarea es el que acepta retrieve.

  2. 2.

    Recuperar la tarea existente

    Llama a retrieve con el ID de tarea guardado. Si el estado es pending o solving, programa una recuperación posterior en lugar de ejecutar un bucle continuo en el controlador. Establece un plazo global de espera para quien realiza la solicitud; el tiempo de espera HTTP del servicio limita cada solicitud, no la duración de la resolución. Alcanzar ese plazo no es motivo para crear otra tarea.

  3. 3.

    Gestiona el resultado terminal

    Para failed, deja de recuperar la tarea y revisa errorCode y error; las resoluciones fallidas se reembolsan. Para ready, usa el token de solución devuelto. Envíalo con la identidad devuelta en userAgent y secChUa y con el mismo proxy usado para la resolución. El destino aún debe aceptar una solución lista.

Distingue los errores HTTP de los fallos de las tareas. throw() gestiona una respuesta HTTP no satisfactoria; una respuesta satisfactoria que contenga failed requiere gestión a nivel de tarea. No reintentes entradas no válidas sin modificarlas ni supongas que todos los fallos se deben a un saldo insuficiente. Consulta la gestión de errores de la API.

Recupera una creación cuyo tiempo de espera se haya agotado sin pagar otra resolución

Que se agote el tiempo de conexión no indica si solvethree creó la tarea. Si ya tienes su ID de tarea, recupérala. De lo contrario, repite la creación con el mismo requestId y exactamente las mismas entradas de la tarea para recuperar la tarea existente.

Ejecuta tu primera tarea.

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

Crear un espacio de trabajo
Llama a la API de CAPTCHA desde Laravel · solvethree