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:
- Eine Airtable-Automatisierung erkennt den neuen Datensatz
- Ein Skript übermittelt die CAPTCHA-Parameter an CaptchaAI
- CaptchaAI gibt das gelöste Token zurück
- 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:
- Gehen Sie zur Registerkarte Automatisierungen
- Klicken Sie auf Automatisierung erstellen
- 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 Triggerschrittsitekey– Sitekey-Feld aus dem Triggerschrittpageurl– 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
- CaptchaAI Schnellstart
- API-Antwortformate und Fehlercodes
- reCAPTCHA v2 per API lösen
Diskussionen (0)
Beteiligen Sie sich an der Unterhaltung
Melden Sie sich an, um Ihre Meinung zu teilen.
AnmeldenNoch keine Kommentare.