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:
- Uma automação Airtable detecta o novo registro
- Um script envia os parâmetros CAPTCHA para CaptchaAI
- CaptchaAI retorna o token resolvido
- 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:
- Acesse a guia Automações
- Clique em Criar automação
- 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 disparositekey→ campo Sitekey da etapa de disparopageurl→ 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:
- Script do Google Apps + CaptchaAI
- Zapier + CaptchaAI: resolução de CAPTCHA sem código
- Faça (Integromat) + CaptchaAI