Resolva reCAPTCHA Enterprise com PHP

Por solvethree2 min de leitura

Você pode chamar o solvethree diretamente do PHP. O exemplo abaixo solicita um token do reCAPTCHA v3 Enterprise, acompanha a tarefa até sua conclusão e interrompe a execução se a resolução falhar.

Nesta página

Antes de executar

Use PHP 8+ com a extensão cURL. Execute no seu servidor, com a extensão cURL habilitada.

  • Crie no console um perfil de site ativo para o hostname de destino. Consulte a configuração do perfil de site.
  • Defina SOLVETHREE_API_KEY com a chave de API do seu espaço de trabalho e SOLVETHREE_PROXY com a URL do seu proxy HTTP(S).
  • Substitua accounts.example.com e login pelo seu hostname e pela ação usada pela página. Use um hostname em site, sem esquema ou caminho.

Crie a tarefa e aguarde o resultado

Salve o código como solve.php e execute php solve.php.

PHP 8 · solve.php
<?php
// Requires PHP 8+ with the cURL extension.
$apiKey = getenv('SOLVETHREE_API_KEY');
$proxy = getenv('SOLVETHREE_PROXY');
if (!$apiKey || !$proxy) throw new RuntimeException('Set the API key and proxy');

function api(string $path, ?array $body = null): array {
    global $apiKey, $deadline;
    $remaining = $deadline - microtime(true);
    if ($remaining <= 0) throw new RuntimeException("Keep the task ID and resume polling");
    $curl = curl_init('https://api.solvethree.com/v1' . $path);
    curl_setopt_array($curl, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT_MS => min(30000, max(1, (int) ceil($remaining * 1000))),
        CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $apiKey, 'Content-Type: application/json'],
    ]);
    if ($body !== null) {
        curl_setopt($curl, CURLOPT_POST, true);
        curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($body, JSON_THROW_ON_ERROR));
    }
    $raw = curl_exec($curl);
    $error = curl_error($curl);
    $status = curl_getinfo($curl, CURLINFO_RESPONSE_CODE);
    curl_close($curl);
    if ($raw === false) throw new RuntimeException('Connection failed: ' . $error);
    if ($status < 200 || $status >= 300) throw new RuntimeException('API HTTP ' . $status);
    return json_decode($raw, true, 512, JSON_THROW_ON_ERROR);
}

$requestId = bin2hex(random_bytes(16)); // Save this with the task inputs for recovery.
$deadline = microtime(true) + 180;
$task = api('/tasks?waitMs=0', [
    'site' => 'accounts.example.com', 'action' => 'login',
    'proxy' => $proxy, 'requestId' => $requestId,
]);
while (in_array($task['status'], ['pending', 'solving'], true)) {
    if (microtime(true) >= $deadline) throw new RuntimeException('Keep the task ID and resume polling');
    $task = api('/tasks/' . rawurlencode($task['id']) . '?waitMs=15000');
    if (in_array($task['status'], ['pending', 'solving'], true)) usleep(1000000);
}
if ($task['status'] !== 'ready') throw new RuntimeException(
    ($task['errorCode'] ?? 'Unexpected task state') . ': ' . ($task['error'] ?? '')
);
$solution = $task['solution'];
// Use $solution['token'], ['userAgent'] and ['secChUa'] with the same proxy.
echo 'Ready task: ' . $task['id'] . PHP_EOL;

O POST usa waitMs=0 para retornar uma tarefa imediatamente. Cada GET aguarda até 15 segundos por uma atualização. O loop continua enquanto o status é pending ou solving e termina em ready ou failed.

A requisição usa Enterprise v3 por padrão. Para v3 padrão, adicione recaptchaType: v3. Não inclua type nem url no corpo de uma tarefa de reCAPTCHA.

Use o token no seu aplicativo

O token está em $solution['token']. O ID da tarefa exibido pelo programa serve para consultar a tarefa; use o valor do token no campo de CAPTCHA do seu aplicativo.

Use $solution['userAgent'] como User-Agent e $solution['secChUa'] como sec-ch-ua na requisição ao destino.

Envie essa requisição pelo mesmo proxy usado na resolução. Depois, verifique a resposta do aplicativo: um token gerado não comprova que o destino aceitou a requisição.

Se a requisição falhar

Uma tarefa com falha inclui errorCode e error; o exemplo interrompe a execução e os informa. Resoluções com falha são reembolsadas. Um erro HTTP, como 401 ou 402, é um problema separado na requisição — consulte a referência de erros da API antes de tentar novamente.

Guarde o requestId e os parâmetros exatos da tarefa se precisar recuperá-la após um timeout ou reinício do processo. Se você tiver o ID da tarefa, consulte-a periodicamente. Caso contrário, reenvie os parâmetros originais com o mesmo requestId. Simplesmente reiniciar o programa gera outro ID e pode criar outra resolução cobrável.

O chamador para de esperar quando o prazo termina; isso não cancela uma tarefa já criada. Consulte consultas periódicas e recuperação após timeout para ver a sequência completa.

Execute sua primeira tarefa.

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

Criar um espaço de trabalho
Resolva reCAPTCHA Enterprise com PHP · solvethree