Chame a API de CAPTCHA a partir do Laravel

Por solvethree4 min de leitura

Use o cliente HTTP do Laravel para criar uma tarefa do solvethree e depois consultá-la pelo ID. Mantenha a chave da API e as credenciais do proxy no servidor. Uma resposta HTTP bem-sucedida não basta: leia o status da tarefa antes de usar sua solução.

Nesta página

Configure o site e as credenciais do servidor

  1. 1.

    Ative o perfil do site

    Configure o hostname de destino no console para que seu workspace tenha um perfil reCAPTCHA ativo. Enviar um hostname em uma tarefa não cria um perfil. Veja a configuração do perfil do site.

  2. 2.

    Adicione a configuração do servidor

    Adicione a entrada solvethree do exemplo ao array existente em config/services.php. Defina SOLVETHREE_API_KEY, CAPTCHA_SITE e SOLVETHREE_PROXY no ambiente do servidor. Mantenha esses valores fora do código do navegador; CAPTCHA_SITE é o hostname, não uma URL completa.

  3. 3.

    Use a ação correspondente à do destino

    O exemplo envia login. Altere esse valor para a ação usada pela requisição de destino pretendida. Ele fornece um proxy; não envie também proxyCandidates.

Crie um serviço com métodos separados de criação e consulta

Serviço Laravel · criação e consulta autenticadas via 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 envia a chave do workspace como autenticação Bearer. O corpo do POST é plano: site, action, proxy e requestId são campos de nível superior. Não adicione um campo type ou url para reCAPTCHA. Omitir recaptchaType seleciona o padrão documentado enterprise-v3.

Ambos os métodos chamam throw() antes de json(). O cliente HTTP do Laravel não lança exceções para respostas HTTP sem sucesso por padrão, então isso impede que o solicitante trate o conteúdo de um erro HTTP como uma resposta de tarefa bem-sucedida. O serviço define timeouts de conexão e de requisição e, intencionalmente, não faz novas tentativas automáticas de POST.

Guarde o ID da tarefa e verifique seu status

  1. 1.

    Crie uma única tarefa para cada resolução lógica

    No seu controller ou job autenticado, guarde um requestId gerado pelo solicitante antes de chamar create. Ele deve conter de 1–64 letras ASCII, números, sublinhados ou hífens. Salve o ID da tarefa retornado separadamente: o ID lógico da requisição serve para recuperar a criação; o ID da tarefa é o que retrieve aceita.

  2. 2.

    Consulte a tarefa existente

    Chame retrieve com o ID da tarefa salvo. Se o status for pending ou solving, programe uma consulta posterior em vez de executar um loop contínuo no controller. Defina um prazo total de espera para o solicitante; o timeout HTTP do serviço limita cada requisição, não o tempo de vida da resolução. Atingir esse prazo não é motivo para criar outra tarefa.

  3. 3.

    Trate o resultado terminal

    Para failed, pare as consultas e examine errorCode e error; resoluções que falham são reembolsadas. Para ready, use o token de solução retornado. Envie-o com a identidade retornada em userAgent e secChUa e o mesmo proxy usado na resolução. Uma solução pronta ainda precisa ser aceita pelo destino.

Mantenha os erros HTTP separados das falhas de tarefa. Uma resposta HTTP sem sucesso é tratada por throw(); uma resposta bem-sucedida contendo failed precisa ser tratada no nível da tarefa. Não repita entradas inválidas sem alterá-las nem presuma que toda falha significa crédito insuficiente. Veja o tratamento de erros da API.

Recupere uma criação que excedeu o tempo limite sem comprar outra resolução

Um timeout de conexão não informa se o solvethree criou a tarefa. Se você já tem o ID da tarefa, consulte-a. Caso contrário, repita a criação com o mesmo requestId e exatamente as mesmas entradas da tarefa para recuperar a tarefa existente.

Execute sua primeira tarefa.

Comece com $5 em créditos no espaço de trabalho.

Criar um espaço de trabalho
Chame a API de CAPTCHA a partir do Laravel · solvethree