Chame a API de CAPTCHA a partir do PowerShell
Use PowerShell 7.5+ e Invoke-RestMethod para chamar solvethree diretamente. O script abaixo cria uma única tarefa reCAPTCHA Enterprise e consulta o mesmo ID de tarefa até que ela termine ou o limite local de espera se esgote.
Nesta página
Defina as credenciais e os dados de entrada do destino
- 1.
Disponibilize o site para seu espaço de trabalho
Configure um perfil ativo para o hostname de destino no console. Enviar um hostname e uma ação não cria um perfil. Consulte a configuração de perfil de site se isso ainda não tiver sido feito.
- 2.
Forneça as variáveis de ambiente
Defina
SOLVETHREE_API_KEYeSOLVETHREE_PROXYno ambiente do processo do PowerShell usando seu mecanismo habitual de gerenciamento de segredos. Verifique se ambas têm valores antes de executar. A chave de API é enviada em um cabeçalho Bearer; ela não deve ficar no JSON da tarefa. - 3.
Substitua o hostname e a ação do exemplo
Altere
accounts.example.comeloginpara o hostname e a ação exigidos pela sua integração. Use um hostname, não uma URL completa. A requisição usa Enterprise v3 por padrão, portanto não precisa dos campostypenemurl.
Crie uma única vez e consulte pelo ID da tarefa
#requires -Version 7.5
$ErrorActionPreference = 'Stop'
$apiBase = 'https://api.solvethree.com/v1'
$headers = @{ Authorization = "Bearer $env:SOLVETHREE_API_KEY"; Accept = 'application/json' }
$taskInput = @{ site = 'accounts.example.com'; action = 'login'; proxy = $env:SOLVETHREE_PROXY; requestId = [guid]::NewGuid().ToString() }
$requestClock = [Diagnostics.Stopwatch]::StartNew()
function Call-TaskApi($Method, $Path, $Payload = $null) {
$remaining = 180 - $requestClock.Elapsed.TotalSeconds
if ($remaining -le 0) { throw 'Local deadline reached' }
$seconds = [int][Math]::Ceiling([Math]::Min(25, $remaining))
$options = @{ Method = $Method; Uri = "$apiBase$Path"; Headers = $headers;
ConnectionTimeoutSeconds = $seconds; OperationTimeoutSeconds = $seconds;
MaximumRetryCount = 0; MaximumRedirection = 0 }
if ($null -ne $Payload) { $options.Body = $Payload | ConvertTo-Json -Depth 6; $options.ContentType = 'application/json' }
Invoke-RestMethod @options
}
$taskId = $null
try {
$result = Call-TaskApi 'POST' '/tasks?waitMs=0' $taskInput
$taskId = $result.id
while ($result.status -in @('pending', 'solving')) {
$escapedId = [uri]::EscapeDataString($taskId)
$result = Call-TaskApi 'GET' "/tasks/$escapedId`?waitMs=15000"
if ($result.status -in @('pending', 'solving')) { Start-Sleep -Seconds 1 }
}
if ($result.status -ne 'ready') { throw "Task failed: $($result.errorCode)" }
Write-Host "Ready task: $taskId"
# Submit $result.solution.token with userAgent/secChUa and the original proxy.
} catch {
Write-Host "Recovery requestId=$($taskInput.requestId) taskId=$taskId"
throw
}O script envia um POST para /v1/tasks?waitMs=0. As requisições seguintes são GETs para o ID retornado, usando waitMs=15000. pending e solving mantêm o loop em execução; qualquer outro status o encerra.
ConvertTo-Json serializa a tabela hash da tarefa em vez de depender de JSON com aspas inseridas manualmente ou de um comando de shell. O ID da tarefa recebe escape de URL antes das consultas periódicas. Mantenha essas partes ao adaptar o exemplo.
O Stopwatch verifica um limite local de 180 segundos antes de cada chamada à API. Cada chamada recebe tempos limite de conexão e operação de no máximo 25 segundos, reduzidos conforme o tempo disponível diminui. Após uma consulta não terminal, o script espera um segundo. O limite evita consultas intermináveis; não é um corte exato de tempo decorrido.
MaximumRetryCount = 0 desativa novas tentativas automáticas de HTTP, e MaximumRedirection = 0 recusa redirecionamentos. Os parâmetros de tempo limite usados aqui exigem PowerShell 7.5+, não qualquer instalação do PowerShell 7. A referência de Invoke-RestMethod da Microsoft documenta esses parâmetros.
Use o token, não o ID da tarefa
No status ready, o valor de reCAPTCHA a enviar é $result.solution.token. $taskId apenas identifica a tarefa da solvethree. O exemplo termina antes de fazer a requisição da aplicação ao seu destino.
Envie o token com os valores de userAgent e secChUa da solução retornada, usando o proxy original. Não substitua por uma identidade de navegador sem relação com a solução nem envie o token a outro destino. ready significa que a solvethree gerou uma solução; não comprova que o destino aceitou a requisição da sua aplicação.
- Invoke-RestMethod lança uma exceção de HTTP ou conexão
A requisição à API falhou antes que o script pudesse processar uma resposta bem-sucedida. O bloco catch exibe os IDs de recuperação e relança a exceção original.
Experimente: Inspecione o status HTTP e os detalhes da resposta, quando disponíveis. Corrija entradas inválidas em vez de tentar novamente sem alterá-las. Se o resultado da criação da tarefa for incerto, recupere-a conforme descrito abaixo.
- A tarefa retorna failed
Inspecione tanto
$result.errorCodequanto$result.error. A exceção do script para tarefas em estado terminal inclui apenas o código de erro.Experimente: Pare de consultar essa tarefa e resolva a causa informada. Por exemplo,
site-unreachableé um erro da tarefa, não uma prova de que a própria requisição à API falhou. Consulte Erros da API de CAPTCHA.
Recupere uma requisição de resultado incerto sem criar outra tarefa
Um tempo limite excedido não prova que a requisição de criação falhou. O bloco catch exibe requestId e, se tiver sido recebido, taskId. Guarde esses valores.
- 1.
Se você tem um ID de tarefa, consulte essa tarefa
Continue com GET
/v1/tasks/:idem vez de criar outra tarefa. Atingir o prazo local do script não comprova que a tarefa remota falhou. - 2.
Se a criação não retornou um ID de tarefa, reutilize a requisição original
Reenvie as mesmas entradas da tarefa com o mesmo
requestIdpara recuperar a tarefa existente. Alterar as entradas ao reutilizar esse ID causa um conflito. - 3.
Não reinicie este script como procedimento de recuperação
Uma nova execução gera um novo GUID e, portanto, uma nova requisição lógica. Para uso sem supervisão, salve com segurança o requestId original e as entradas da tarefa antes do POST e, depois, salve o ID da tarefa quando ele chegar. O exemplo exibe os IDs de recuperação em caso de falha, mas não os mantém se o processo for perdido.
Mantenha as entradas salvas fora dos logs comuns se a URL do proxy contiver credenciais. Você precisa das entradas originais para a recuperação, não de outra cópia da chave de API.
Fontes e referência da API
Execute sua primeira tarefa.
Comece com $5 em créditos no espaço de trabalho.