Airtable es una plataforma de base de datos flexible que se utiliza para la gestión de proyectos, la recopilación de datos y la automatización del flujo de trabajo. Cuando su flujo de trabajo de Airtable necesita interactuar con servicios protegidos por CAPTCHA (enviar formularios, procesar URL o automatizar la entrada de datos), CaptchaAI puede resolver los CAPTCHA directamente desde Airtable utilizando sus extensiones de Automatizaciones y Scripting.
Esta guía muestra cómo configurar automatizaciones de Airtable que activan la resolución de CAPTCHA a través de CaptchaAI cuando se crean o actualizan nuevos registros.
Escenario del mundo real
Realiza un seguimiento de las URL de destino en una tabla de Airtable. Cada URL tiene un CAPTCHA que debe resolverse antes de poder extraer los datos. Cuando se agrega una nueva URL:
- Una automatización de Airtable detecta el nuevo registro
- Un script envía los parámetros CAPTCHA a CaptchaAI
- CaptchaAI devuelve el token resuelto
- El token se guarda nuevamente en el registro de Airtable.
Estructura de la tabla
Crea una tabla Airtable llamada Tareas CAPTCHA con estos campos:
| Nombre del campo | Tipo | Propósito |
|---|---|---|
| URL | URL | URL de la página de destino |
| Sitekey | Texto de una sola línea | Sitekey de reCAPTCHA |
| Estado | Selección única | pendiente, solucionando, resuelto, fallido |
| Token | Texto largo | Token CAPTCHA resuelto |
| Resuelto en | Fecha/hora | Marca de tiempo de resolución |
| Error | Texto de una sola línea | Mensaje de error si falla |
Paso 1: crear la automatización
En Airtable:
- Vaya a la pestaña Automatizaciones
- Haga clic en Crear automatización
- Nómbrelo: "Resolver CAPTCHA en un nuevo registro"
Disparador
Elige Cuando el registro coincida con las condiciones:
- Tabla: Tareas CAPTCHA
- Condición: El estado es "pendiente"
Esto se activa cada vez que un registro se establece como "pendiente", abarcando tanto registros nuevos como resueltos.
Paso 2: agregue la acción del script
Agregar una acción -> Ejecutar un 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
En el panel izquierdo de la acción del script, asigne las variables de entrada:
recordId-> ID de registro del paso de activaciónsitekey-> Campo Sitekey del paso desencadenantepageurl-> campo URL del paso desencadenante
Paso 3: procesamiento por lotes con extensión de secuencias de comandos
Para procesar muchos registros a la vez, use la extensión de scripting de Airtable (disponible en el panel de aplicaciones):
// 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');
Solución de problemas
| problema | causa | Solución |
|---|---|---|
| La automatización no se activa | El registro no coincide con la condición "pendiente" | Verificar que el valor del campo Estado coincida exactamente |
fetch is not defined |
Airtable Scripting usa remoteFetchAsync en algunos contextos |
Pruebe remoteFetchAsync en lugar de fetch |
| Tiempo de espera del guión | Los scripts de Airtable tienen un límite de 30 segundos para automatizaciones | Utilice menos iteraciones de sondeo; aumentar la espera inicial a 20 segundos |
| La actualización del registro falla | El nombre del campo no coincide | Asegúrese de que los nombres de los campos en la tabla updateRecordAsync coincidan exactamente |
| Clave API expuesta en script | Clave API codificada | Utilice input.config() con una variable de entrada secreta |
Preguntas frecuentes
¿Cuál es el límite de tiempo de ejecución del script en Airtable?
Guiones de automatización: 30 segundos. Extensión de secuencias de comandos: 30 segundos (pero se puede ampliar con planes Pro). Para sondeos prolongados, aumente la espera inicial y reduzca las iteraciones.
¿Puedo usar esto también para CAPTCHA de imágenes?
Sí. Cambie method a base64 y envíe los datos de la imagen. Puede almacenar imágenes CAPTCHA codificadas en base64 en los campos adjuntos de Airtable y extraerlas en el script.
¿Cómo manejo la clave API de forma segura?
En Automatizaciones, utilice variables de entrada configuradas en el panel de configuración del script. En la extensión Scripting, puede solicitar la clave en tiempo de ejecución con input.textAsync().
¿Puedo volver a resolver CAPTCHA fallidos?
Sí. Vuelva a establecer el Estado en "pendiente" y la automatización se volverá a activar. Agregue un campo de contador de reintentos para limitar los reintentos.
Artículos relacionados
- Cómo resolver reCAPTCHA v2 con callback
- reCAPTCHA v2 y Turnstile en el mismo sitio
- Mecanismo de callback de reCAPTCHA v2
Guías relacionadas:
- Make (Integromat) + CaptchaAI
- Inicio rápido de CaptchaAI