Chame a API de CAPTCHA a partir do Cloudflare Workers

Por solvethree4 min de leitura

Use um Worker para chamar a API de tarefas do solvethree com fetch no servidor. Mantenha a chave de API do espaço de trabalho em um binding de segredo, defina as entradas do destino no Worker e retorne respostas de tarefas apenas ao chamador autorizado da sua aplicação.

Nesta página

Configure o destino e os segredos

Primeiro, ative no console o perfil do site de destino para seu espaço de trabalho. Enviar um hostname e uma ação não cria um perfil. Consulte a configuração do perfil do site se esse pré-requisito ainda não estiver concluído.

  • SOLVETHREE_API_KEY: a chave de API do seu espaço de trabalho, armazenada como um segredo do Worker.
  • INTEGRATION_KEY: um segredo separado que o chamador da sua aplicação deve enviar em x-integration-key.
  • SOLVETHREE_PROXY: a URL do proxy usado na resolução. Armazene-a como segredo se contiver credenciais.
  • CAPTCHA_SITE: o hostname de destino, não uma URL completa.

O exemplo fixa a ação em login e fornece um único proxy. Altere essas entradas na implantação para corresponder à sua integração; não aceite entradas de destino arbitrárias dos chamadores. Quando recaptchaType é omitido, a API usa reCAPTCHA Enterprise v3 por padrão.

Use a chave de integração entre um chamador confiável da aplicação e o Worker, não em código de navegador distribuído publicamente. Ela é uma credencial compartilhada, não uma autorização de tarefas por usuário.

Crie e consulte tarefas

Worker · chamadas REST autenticadas de criação e consulta
export default {
  async fetch(request, env) {
    if (!env.INTEGRATION_KEY || request.headers.get('x-integration-key') !== env.INTEGRATION_KEY) {
      return new Response('Unauthorized', { status: 401 });
    }
    const url = new URL(request.url);
    const headers = { Authorization: `Bearer ${env.SOLVETHREE_API_KEY}`, 'Content-Type': 'application/json' };
    let response;
    if (request.method === 'POST') {
      const requestId = request.headers.get('x-request-id');
      if (!requestId || !/^[A-Za-z0-9_-]{1,64}$/.test(requestId)) return new Response('Provide X-Request-ID', { status: 400 });
      response = await fetch('https://api.solvethree.com/v1/tasks?waitMs=0', {
        method: 'POST', headers, redirect: 'error', signal: AbortSignal.timeout(20000),
        body: JSON.stringify({ site: env.CAPTCHA_SITE, action: 'login', proxy: env.SOLVETHREE_PROXY, requestId }),
      });
    } else if (request.method === 'GET') {
      const id = url.searchParams.get('id');
      if (!id || !/^[A-Za-z0-9_-]{1,128}$/.test(id)) return new Response('Provide a valid id', { status: 400 });
      response = await fetch(`https://api.solvethree.com/v1/tasks/${encodeURIComponent(id)}?waitMs=15000`, {
        headers, redirect: 'error', signal: AbortSignal.timeout(25000),
      });
    } else return new Response('Use POST or GET', { status: 405 });
    if (!response.ok) return Response.json({ error: 'Solver API request failed', status: response.status }, { status: response.status });
    return Response.json(await response.json(), { headers: { 'Cache-Control': 'no-store' } });
  },
};
// Store keys in Worker secret bindings. The task proxy field does not add a
// generic HTTP proxy option to Workers fetch; another client must submit through it.
  1. 1.

    Crie uma tarefa

    Envie um POST ao Worker com x-integration-key e x-request-id. Escolha um ID de solicitação com 1–64 letras ASCII, números, sublinhados ou hífens. O Worker monta o corpo da tarefa a partir do destino e do proxy configurados; ele não usa um corpo fornecido pelo chamador.

  2. 2.

    Guarde o ID da tarefa

    O Worker retorna a resposta JSON do serviço de resolução. Salve o ID da tarefa retornado e mantenha o ID de solicitação usado para criá-la.

  3. 3.

    Consulte o resultado

    Envie um GET ao Worker com o ID da tarefa no parâmetro de consulta id e o mesmo cabeçalho da chave de integração. O handler valida a sintaxe do ID e consulta essa tarefa no solvethree.

As duas solicitações ao serviço usam a chave do espaço de trabalho para autenticação. O handler repassa códigos de status HTTP que não indicam sucesso com um corpo de erro genérico e marca as respostas JSON bem-sucedidas com Cache-Control: no-store. Ele não verifica a propriedade da tarefa além da chave de integração compartilhada; adicione essa autorização antes de disponibilizar a consulta a usuários distintos.

Trate os tempos limite sem criar outra tarefa

A criação usa waitMs=0 com um tempo limite de fetch de 20 segundos. A consulta usa waitMs=15000 com um tempo limite de fetch de 25 segundos. Esses limites se aplicam a chamadas HTTP individuais, não ao tempo de vida total da tarefa.

Se a criação exceder o tempo limite antes de você receber um ID de tarefa, repita a mesma solicitação de tarefa com o mesmo ID de solicitação. Isso recupera a tarefa existente, caso ela tenha sido criada. Não gere um novo ID só porque a conexão falhou: a primeira solicitação pode já ter chegado ao solvethree. Reutilizar um ID com entradas alteradas gera conflito.

O exemplo não captura exceções de fetch, incluindo tempos limite. Adicione tratamento de exceções se o chamador precisar de uma resposta de erro estruturada, mas mantenha o ID de solicitação disponível para recuperação.

  • pending ou solving: consulte a mesma tarefa novamente, respeitando um prazo total definido no chamador.
  • ready: a solução está disponível; pare as consultas periódicas e passe-a ao cliente de envio.
  • failed: pare as consultas periódicas e inspecione errorCode e error. Corrija o problema informado antes de criar outra tarefa.

Um erro HTTP e uma tarefa com status failed são falhas diferentes. O handler verifica primeiro o status HTTP; o chamador ainda precisa inspecionar o status da tarefa em uma resposta bem-sucedida. Para diagnóstico, consulte erros da API de CAPTCHA.

Envie por um cliente que possa usar o proxy

O exemplo de Worker chama apenas o solvethree. O campo proxy da tarefa informa ao serviço de resolução qual proxy usar; ele não altera o roteamento de rede do Worker. O fetch do Workers não tem uma opção genérica de URL de proxy.

Envie a solução pronta a um cliente que possa enviá-la ao destino pretendido pelo mesmo proxy. Use os valores de userAgent e secChUa retornados na solução, em vez de cabeçalhos de navegador sem relação com ela. Uma tarefa pronta significa que o solvethree gerou uma solução; a aceitação depende da solicitação subsequente ao destino.

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 Cloudflare Workers · solvethree