Chame a API de CAPTCHA a partir do Laravel
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.
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.
Adicione a configuração do servidor
Adicione a entrada
solvethreedo exemplo ao array existente emconfig/services.php. DefinaSOLVETHREE_API_KEY,CAPTCHA_SITEeSOLVETHREE_PROXYno ambiente do servidor. Mantenha esses valores fora do código do navegador;CAPTCHA_SITEé o hostname, não uma URL completa. - 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 umproxy; não envie tambémproxyCandidates.
Crie um serviço com métodos separados de criação e consulta
<?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.
Crie uma única tarefa para cada resolução lógica
No seu controller ou job autenticado, guarde um
requestIdgerado pelo solicitante antes de chamarcreate. 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 queretrieveaceita. - 2.
Consulte a tarefa existente
Chame
retrievecom o ID da tarefa salvo. Se o status forpendingousolving, 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.
Trate o resultado terminal
Para
failed, pare as consultas e examineerrorCodeeerror; resoluções que falham são reembolsadas. Paraready, use o token de solução retornado. Envie-o com a identidade retornada emuserAgentesecChUae 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.
Fontes e referência da API
Execute sua primeira tarefa.
Comece com $5 em créditos no espaço de trabalho.