Gerencie consultas periódicas e timeouts de tarefas CAPTCHA

Por solvethree5 min de leitura

Crie uma tarefa, guarde seu ID e consulte essa tarefa até que esteja ready, failed ou seu prazo expire. Um timeout do cliente não significa que a tarefa falhou, e chegar ao fim de uma espera de long polling não significa que a resolução parou.

Nesta página

Escolha separadamente a espera do servidor e o timeout do cliente

waitMs controla por quanto tempo uma requisição à API aguarda um resultado antes de responder. Ele é um parâmetro de query da URL, não um campo no JSON da tarefa. Os padrões de criação variam por produto; as consultas GET têm seu próprio limite.

Configurações de espera da API de tarefas
Configurações de espera da API de tarefas
RequisiçãoEspera do servidor
Criar tarefa reCAPTCHA v3 EnterpriseAguarda até 15000 ms por padrão.
Criar tarefa KasadaAguarda até 75000 ms por padrão.
Criar tarefa Ticketmaster TMPTAssíncrona por padrão: waitMs=0. Um waitMs explícito pode ser de até 75000.
Consultar uma tarefa existente com GETSem espera por padrão. Um waitMs explícito pode ser de até 15000.

Dê ao cliente HTTP tempo suficiente para a espera solicitada ao servidor, mais o tempo adicional de rede. Um timeout do cliente menor que a espera do servidor pode interromper a resposta antes que você receba o estado atual da tarefa.

Crie uma única vez e limite as consultas

O método solve dos SDKs oficiais cria a tarefa uma única vez e faz consultas até obter um resultado pronto ou um erro. Python expõe timeout em segundos e poll_interval em segundos; Node.js expõe timeoutMs e pollIntervalMs em milissegundos. As configurações documentadas usam um prazo de três minutos para a resolução e um intervalo de um segundo entre consultas.

Para controle direto, Python fornece create_task e get_task; Node.js fornece createTask e getTask. Use esta sequência:

  1. 1.

    Defina um prazo e crie uma tarefa

    Escolha um prazo total antes da criação. Guarde um requestId com os dados exatos da tarefa para recuperar uma criação interrompida. Para evitar a espera durante a criação, selecione explicitamente uma espera de zero.

  2. 2.

    Salve o ID da tarefa retornado e inspecione seu status

    A criação já pode retornar um resultado terminal. Retorne a solução se o status for ready. Se for failed, inspecione errorCode e error e pare; resoluções que falham são reembolsadas. Apenas pending e solving exigem mais consultas.

  3. 3.

    Consulte a mesma tarefa enquanto houver tempo

    Use GET /v1/tasks/:id, opcionalmente com uma espera de long polling de até 15000 ms. Trate as respostas HTTP que não indicam sucesso antes de ler um payload de sucesso. Se a resposta ainda indicar pending ou solving, repita a consulta com o mesmo ID — não crie outra tarefa.

  4. 4.

    Pare ao atingir o prazo

    Limite cada requisição ao tempo restante, reservando uma margem para o tempo adicional de rede. Quando seu prazo expirar, pare o loop local e mantenha o ID da tarefa para recuperação. Não reclassifique a tarefa como falha só porque seu cliente parou de esperar.

Esta requisição consulta uma tarefa existente, permitindo uma espera de 15 segundos no servidor e um timeout de 30 segundos no cliente. Defina TASK_ID com o ID salvo e mantenha SOLVETHREE_API_KEY no servidor. Nenhum desses timeouts é um prazo total para um loop de consultas repetidas.

API de tarefas · consultar uma tarefa existente
curl --fail-with-body --max-time 30 \
  "https://api.solvethree.com/v1/tasks/$TASK_ID?waitMs=15000" \
  -H "Authorization: Bearer $SOLVETHREE_API_KEY"

Leia o status da tarefa, não apenas o status HTTP

Uma resposta HTTP de sucesso pode conter uma tarefa que ainda precisa de consultas. pending e solving não são terminais; apenas ready contém uma solução utilizável. failed é terminal e inclui errorCode e error.

Estados da tarefa · estruturas de resposta
{
  "nonterminal": [
    {
      "id": "example-task",
      "status": "pending"
    },
    {
      "id": "example-task",
      "status": "solving"
    }
  ],
  "ready": {
    "id": "example-task",
    "status": "ready",
    "solution": {
      "token": "EXAMPLE_TOKEN",
      "userAgent": "EXAMPLE_USER_AGENT",
      "secChUa": "EXAMPLE_CLIENT_HINTS"
    }
  },
  "failed": {
    "id": "example-task",
    "status": "failed",
    "errorCode": "site-unreachable",
    "error": "target page did not respond"
  }
}

A resposta pronta mostrada aqui contém um token reCAPTCHA. Kasada retorna cabeçalhos, enquanto TMPT retorna um valor de cookie bruto. Um resultado pronto significa que uma solução foi gerada — não que o destino subsequente a aceitou. Se um token reCAPTCHA pronto for rejeitado, deixe o diagnóstico das consultas e passe à verificação do token enviado.

Recupere a tarefa existente após um timeout

Um timeout de conexão informa que o cliente não recebeu uma resposta completa. Ele não comprova que a criação falhou. Antes de pagar por outra resolução, recupere a tarefa que você talvez já tenha criado.

  1. 1.

    Se você tem um ID de tarefa, retome as consultas GET

    Consulte esse ID com um novo prazo local finito. Um GET que excedeu o tempo limite não é motivo para enviar outra requisição de criação.

  2. 2.

    Se a criação foi interrompida, reutilize seu requestId

    Reenvie a requisição de tarefa idêntica com o mesmo requestId para recuperar a tarefa existente. Alterar os dados da tarefa ao reutilizar esse ID gera um conflito. Consulte recuperação por ID de requisição para ver o contrato completo.

Ambos os SDKs geram um requestId quando ele é omitido e nunca repetem automaticamente a criação. O SolvethreeError deles expõe IDs de recuperação: request_id e task_id em Python, ou requestId e taskId em JavaScript. Verifique esses campos antes de decidir criar uma nova tarefa lógica.

Uma requisição de consulta retorna um erro HTTP

Inspecione o status HTTP separadamente do status da tarefa. ApiError do SDK expõe esse status e qualquer intervalo de espera para nova tentativa.

Experimente: Para falhas temporárias nas consultas, respeite Retry-After dentro do prazo total de resolução. Os campos do SDK são retry_after em segundos no Python e retryAfterMs em milissegundos no JavaScript.

A tarefa retorna failed

Leia errorCode e error; o SDK representa isso como TaskFailedError.

Experimente: Pare de consultar essa tarefa. Diagnostique a causa informada antes de criar outra; não repita tentativas às cegas com os mesmos dados inválidos nem presuma que o problema seja saldo.

A consulta retorna HTTP 410

O resultado armazenado expirou.

Experimente: Pare de tentar consultar novamente como se fosse um erro temporário de consulta. Os resultados concluídos têm retenção limitada e não são um cache permanente de soluções.

Salvar uma resposta pronta não prolonga a validade do token ou cookie no destino.

Ainda precisa de ajuda?

Envie ao suporte o ID da tarefa e o erro que você recebeu.

Falar com o suporte
Gerencie consultas periódicas e timeouts de tarefas CAPTCHA · solvethree