Integraciones

Airtable + CaptchaAI: Resolución de CAPTCHA activada por la base de datos

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:

  1. Una automatización de Airtable detecta el nuevo registro
  2. Un script envía los parámetros CAPTCHA a CaptchaAI
  3. CaptchaAI devuelve el token resuelto
  4. 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:

  1. Vaya a la pestaña Automatizaciones
  2. Haga clic en Crear automatización
  3. 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ón
  • sitekey -> Campo Sitekey del paso desencadenante
  • pageurl -> 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
Los comentarios están deshabilitados para este artículo.