Integrações

Airtable + CaptchaAI: solução de CAPTCHA acionada por banco de dados

Airtable é uma plataforma de banco de dados flexível usada para gerenciamento de projetos, coleta de dados e automação de fluxo de trabalho. Quando seu fluxo de trabalho Airtable precisa interagir com serviços protegidos por CAPTCHA – envio de formulários, processamento de URLs ou automatização de entrada de dados –CaptchaAIpode resolver os CAPTCHAs diretamente do Airtable usando suas extensões de automação e script.

Este guia mostra como configurar automações Airtable que acionam a resolução de CAPTCHA via CaptchaAI quando novos registros são criados ou atualizados.

Cenário do mundo real

Você rastreia URLs de destino em uma tabela Airtable. Cada URL possui um CAPTCHA que precisa ser resolvido antes que os dados possam ser extraídos. Quando um novo URL é adicionado:

  1. Uma automação Airtable detecta o novo registro
  2. Um script envia os parâmetros CAPTCHA para CaptchaAI
  3. CaptchaAI retorna o token resolvido
  4. O token é salvo de volta no registro Airtable

Estrutura da tabela

Crie uma tabela Airtable chamada Tarefas CAPTCHA com estes campos:

Nome do campo Tipo Objetivo
URL URL URL da página de destino
Chave do site Texto de linha única chave do site reCAPTCHA
Estado Seleção única pendente, resolvendo, resolvido, falhou
Símbolo Texto longo Token CAPTCHA resolvido
Resolvido em Data/time Carimbo de data e hora da resolução
Erro Texto de linha única Mensagem de erro se falhar

Etapa 1: Crie a automação

Em Airtable:

  1. Acesse a guia Automações
  2. Clique em Criar automação
  3. Nomeie-o: "Resolver CAPTCHA no novo registro"

Gatilho

Escolha Quando o registro corresponde às condições:

  • Tabela: Tarefas CAPTCHA
  • Condição: o status é "pendente"

Isso é acionado sempre que um registro é definido como "pendente" — abrangendo novos registros e resoluções.

Etapa 2: adicionar a ação de script

Adicione uma ação -> Execute um script:

// Airtable Automation Script — Solve CAPTCHA via CaptchaAI

// Input configuration (set in the left panel):
// - recordId: Record ID from trigger
// - sitekey: Sitekey field from trigger
// - pageurl: URL field from trigger
const config = input.config();
const recordId = config.recordId;
const sitekey = config.sitekey;
const pageurl = config.pageurl;

const API_KEY = 'YOUR_API_KEY'; // Use input.config() for security

// Update status to "solving"
const table = base.getTable('CAPTCHA Tasks');
await table.updateRecordAsync(recordId, {
  'Status': { name: 'solving' },
});

try {
  // Step 1: Submit task to CaptchaAI
  const submitUrl = `https://ocr.captchaai.com/in.php?key=${API_KEY}&method=userrecaptcha&googlekey=${encodeURIComponent(sitekey)}&pageurl=${encodeURIComponent(pageurl)}&json=1`;

  const submitResponse = await fetch(submitUrl);
  const submitResult = await submitResponse.json();

  if (submitResult.status !== 1) {
    throw new Error(`Submit failed: ${submitResult.request}`);
  }

  const taskId = submitResult.request;
  console.log(`Task submitted: ${taskId}`);

  // Step 2: Poll for result (wait 15 seconds first)
  await new Promise(resolve => setTimeout(resolve, 15000));

  let token = null;
  for (let i = 0; i < 20; i++) {
    const pollUrl = `https://ocr.captchaai.com/res.php?key=${API_KEY}&action=get&id=${taskId}&json=1`;
    const pollResponse = await fetch(pollUrl);
    const pollResult = await pollResponse.json();

    if (pollResult.status === 1) {
      token = pollResult.request;
      break;
    }

    if (pollResult.request !== 'CAPCHA_NOT_READY') {
      throw new Error(`Solve failed: ${pollResult.request}`);
    }

    await new Promise(resolve => setTimeout(resolve, 5000));
  }

  if (!token) {
    throw new Error('Polling timeout — CAPTCHA not solved in time');
  }

  // Step 3: Update record with solved token
  await table.updateRecordAsync(recordId, {
    'Status': { name: 'solved' },
    'Token': token,
    'Solved At': new Date().toISOString(),
    'Error': '',
  });

  console.log(`CAPTCHA solved for record ${recordId}`);

} catch (error) {
  // Update record with error
  await table.updateRecordAsync(recordId, {
    'Status': { name: 'failed' },
    'Error': error.message,
  });
  console.error(`Failed: ${error.message}`);
}

Configurar entradas de script

No painel esquerdo da ação do script, mapeie as variáveis de entrada:

  • recordId -> ID do registro da etapa de disparo
  • sitekey → campo Sitekey da etapa de disparo
  • pageurl → campo URL da etapa do gatilho

Etapa 3: Processamento em lote com extensão de script

Para processar muitos registros de uma vez, use a extensão de script do Airtable (disponível no painel Aplicativos):

// Batch CAPTCHA Solver — Airtable Scripting Extension
const API_KEY = 'YOUR_API_KEY';
const table = base.getTable('CAPTCHA Tasks');

// Get all pending records
const query = await table.selectRecordsAsync({
  fields: ['URL', 'Sitekey', 'Status'],
});

const pendingRecords = query.records.filter(
  r => r.getCellValueAsString('Status') === 'pending'
);

output.text(`Found ${pendingRecords.length} pending CAPTCHAs`);

for (const record of pendingRecords) {
  const sitekey = record.getCellValueAsString('Sitekey');
  const pageurl = record.getCellValueAsString('URL');

  if (!sitekey || !pageurl) {
    output.text(`Skipping ${record.id} — missing sitekey or URL`);
    continue;
  }

  output.text(`Solving for: ${pageurl}`);

  await table.updateRecordAsync(record.id, {
    'Status': { name: 'solving' },
  });

  try {
    // Submit
    const submitResp = await fetch(
      `https://ocr.captchaai.com/in.php?key=${API_KEY}&method=userrecaptcha&googlekey=${encodeURIComponent(sitekey)}&pageurl=${encodeURIComponent(pageurl)}&json=1`
    );
    const submitData = await submitResp.json();

    if (submitData.status !== 1) throw new Error(submitData.request);

    // Poll
    await new Promise(r => setTimeout(r, 15000));
    let token = null;

    for (let i = 0; i < 20; i++) {
      const pollResp = await fetch(
        `https://ocr.captchaai.com/res.php?key=${API_KEY}&action=get&id=${submitData.request}&json=1`
      );
      const pollData = await pollResp.json();

      if (pollData.status === 1) { token = pollData.request; break; }
      if (pollData.request !== 'CAPCHA_NOT_READY') throw new Error(pollData.request);
      await new Promise(r => setTimeout(r, 5000));
    }

    if (!token) throw new Error('Timeout');

    await table.updateRecordAsync(record.id, {
      'Status': { name: 'solved' },
      'Token': token,
      'Solved At': new Date().toISOString(),
    });
    output.text(`✓ Solved: ${pageurl}`);

  } catch (e) {
    await table.updateRecordAsync(record.id, {
      'Status': { name: 'failed' },
      'Error': e.message,
    });
    output.text(`✗ Failed: ${e.message}`);
  }
}

output.text('Batch processing complete');

Solução de problemas

Problema Causa Correção
A automação não aciona O registro não corresponde à condição "pendente" Verifique se o valor do campo Status corresponde exatamente
fetch is not defined Airtable Scripting usa remoteFetchAsync em alguns contextos Experimente remoteFetchAsync em vez de fetch
Tempo limite do script Os scripts Airtable têm um limite de 30 segundos para automações Use menos iterações de pesquisa; aumente a espera inicial para 20 segundos
A atualização do registro falha Incompatibilidade de nome de campo Certifique-se de que os nomes dos campos na tabela updateRecordAsync correspondam exatamente
Chave de API exposta no script Chave de API codificada Use input.config() com uma variável de entrada secreta

Perguntas frequentes

Qual é o limite de tempo de execução do script no Airtable?

Scripts de automação: 30 segundos. Extensão de script: 30 segundos (mas pode ser estendida com planos Pro). Para sondagens longas, aumente a espera inicial e reduza as iterações.

Posso usar isso para Image CAPTCHAs também?

Sim. Altere method para base64 e envie os dados da imagem. Você pode armazenar imagens CAPTCHA codificadas em base64 em campos Airtable Attachment e extraí-las no script.

Como lidar com a chave API com segurança?

Em Automações, use variáveis de entrada configuradas no painel de configurações do script. Na extensão Scripting, você pode solicitar a chave em tempo de execução com input.textAsync().

Posso resolver CAPTCHAs com falha?

Sim. Defina o status novamente como "pendente" e a automação será acionada novamente. Adicione um campo de contador de novas tentativas para limitar novas tentativas.

Artigos relacionados

  • Como resolver o retorno de chamada do Recaptcha V2 usando API
  • Torniquete Recaptcha V2 no mesmo local
  • Mecanismo de retorno de chamada Recaptcha V2

Próximas etapas

Automatize a resolução de CAPTCHA a partir de seus bancos de dados Airtable -obtenha sua chave API CaptchaAIe configure a automação.

Guias relacionados:

Os comentários estão desativados para este artigo.