Llama a la API de CAPTCHA desde Laravel
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.
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.
Añade la configuración del servidor
Añade la entrada
solvethreedel ejemplo al array existente enconfig/services.php. DefineSOLVETHREE_API_KEY,CAPTCHA_SITEySOLVETHREE_PROXYen el entorno del servidor. Mantén estos valores fuera del código del navegador;CAPTCHA_SITEes el nombre de host, no una URL completa. - 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 únicoproxy; no envíes tambiénproxyCandidates.
Crea un servicio con métodos separados para crear y recuperar
<?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.
Crea una sola tarea por cada resolución lógica
Desde tu controlador o trabajo autenticado, conserva un
requestIdgenerado por quien realiza la solicitud antes de llamar acreate. 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 aceptaretrieve. - 2.
Recuperar la tarea existente
Llama a
retrievecon el ID de tarea guardado. Si el estado espendingosolving, 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.
Gestiona el resultado terminal
Para
failed, deja de recuperar la tarea y revisaerrorCodeyerror; las resoluciones fallidas se reembolsan. Paraready, usa el token de solución devuelto. Envíalo con la identidad devuelta enuserAgentysecChUay 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.
Fuentes y referencia de la API
Ejecuta tu primera tarea.
Empieza con $5 de crédito en tu espacio de trabajo.