Integrationen

Airtable + CaptchaAI: Durch die Datenbank ausgelöste CAPTCHA-Lösung

Airtable ist eine flexible Datenbankplattform für Projektmanagement, Datenerfassung und Workflow-Automatisierung. Wenn Ihr Airtable-Workflow mit CAPTCHA-geschützten Diensten interagieren muss – Formulare senden, URLs verarbeiten oder Dateneingabe automatisieren –CaptchaAI kann die CAPTCHAs mithilfe seiner Automatisierungs- und Skripterweiterungen direkt von Airtable aus lösen.

In dieser Anleitung wird gezeigt, wie Sie Airtable-Automatisierungen einrichten, die die CAPTCHA-Lösung über CaptchaAI auslösen, wenn neue Datensätze erstellt oder aktualisiert werden.

Szenario aus der realen Welt

Sie verfolgen Ziel-URLs in einer Airtable-Tabelle. Jede URL verfügt über ein CAPTCHA, das gelöst werden muss, bevor Daten extrahiert werden können. Wenn eine neue URL hinzugefügt wird:

  1. Eine Airtable-Automatisierung erkennt den neuen Datensatz
  2. Ein Skript übermittelt die CAPTCHA-Parameter an CaptchaAI
  3. CaptchaAI gibt das gelöste Token zurück
  4. Das Token wird wieder im Airtable-Datensatz gespeichert

Tabellenstruktur

Erstellen Sie eine Airtable-Tabelle namens CAPTCHA-Aufgaben mit diesen Feldern:

Feldname Typ Zweck
URL URL URL der Zielseite
Sitekey Einzeiliger Text reCAPTCHA-Sitekey
Status Einzelauswahl ausstehend, lösend, gelöst, fehlgeschlagen
Token Langer Text CAPTCHA-Token gelöst
Gelöst bei Datum/time Zeitstempel der Lösung
Fehler Einzeiliger Text Fehlermeldung, falls fehlgeschlagen

Schritt 1: Erstellen Sie die Automatisierung

In Airtable:

  1. Gehen Sie zur Registerkarte Automatisierungen
  2. Klicken Sie auf Automatisierung erstellen
  3. Nennen Sie es: „CAPTCHA bei neuem Datensatz lösen“

Auslöser

Wählen Sie Wenn der Datensatz mit den Bedingungen übereinstimmt:

  • Tabelle: CAPTCHA-Aufgaben
  • Bedingung: Status ist „ausstehend“

Dies wird immer dann ausgelöst, wenn ein Datensatz auf „Ausstehend“ gesetzt ist – und deckt sowohl neue Datensätze als auch Neulösungen ab.

Schritt 2: Fügen Sie die Skriptaktion hinzu

Fügen Sie eine Aktion hinzu → Führen Sie ein Skript aus:

// 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}`);
}

Konfigurieren Sie Skripteingaben

Ordnen Sie im linken Bereich der Skriptaktion die Eingabevariablen zu:

  • recordId – Datensatz-ID vom Triggerschritt
  • sitekey – Sitekey-Feld aus dem Triggerschritt
  • pageurl – URL-Feld aus dem Triggerschritt

Schritt 3: Stapelverarbeitung mit Scripting-Erweiterung

Um viele Datensätze gleichzeitig zu verarbeiten, verwenden Sie die Scripting-Erweiterung von Airtable (verfügbar im Apps-Bereich):

// 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');

Fehlerbehebung

Problem Ursache Lösung
Token wird erzeugt, aber vom Ziel abgelehnt sitekey, pageurl oder Session-Kontext stimmen nicht Erfasse Parameter erneut und verwende den Token in derselben Browser- oder HTTP-Sitzung
Polling endet im Timeout Intervall, Wartezeit oder Fehlerbehandlung sind zu eng gesetzt Poll alle 5-10 Sekunden, trenne Timeout von echten Fehlercodes und logge die Ursache
Beispiel funktioniert lokal, aber nicht im Workflow Callback, Form-Feld oder Token-Injektion fehlt in der echten Zielkette Prüfe den exakten Übergabepfad vom Solver bis zur finalen Zielanfrage

Verwandte Leitfäden

Diskussionen (0)

Noch keine Kommentare.