Chame a API de CAPTCHA a partir do PowerShell

Por solvethree5 min de leitura

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. 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. 2.

    Forneça as variáveis de ambiente

    Defina SOLVETHREE_API_KEY e SOLVETHREE_PROXY no 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. 3.

    Substitua o hostname e a ação do exemplo

    Altere accounts.example.com e login para 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 campos type nem url.

Crie uma única vez e consulte pelo ID da tarefa

PowerShell · criar uma única vez e manter o ID de recuperação
#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.errorCode quanto $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. 1.

    Se você tem um ID de tarefa, consulte essa tarefa

    Continue com GET /v1/tasks/:id em vez de criar outra tarefa. Atingir o prazo local do script não comprova que a tarefa remota falhou.

  2. 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 requestId para recuperar a tarefa existente. Alterar as entradas ao reutilizar esse ID causa um conflito.

  3. 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.

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 PowerShell · solvethree