Integrations

Airtable + CaptchaAI: Veritabanıyla Tetiklenen CAPTCHA Çözme

Airtable tablonuza yeni bir satır düştüğü anda CAPTCHA'nın çözülüp token'ın aynı kayda yazılmasını istiyorsanız, ayrı bir sunucuya ihtiyacınız yok. Airtable Automations ve Scripting uzantısı, bir kayıt "pending" durumuna geçtiğinde CaptchaAI API'sine istek gönderip dönen token'ı doğrudan tabloya yazacak kadar yeterli.

Bu rehberde reCAPTCHA v2 korumalı sayfaları izleyen bir tablo kurup, her yeni kayıt için çözümü tetikleyen ve sonucu geri yazan bir otomasyon oluşturacaksınız — tek satır sunucu kodu yazmadan.

Ön koşullar

Başlamadan önce elinizde şunların bulunması gerekir:

  • Düzenleme yetkiniz olan bir Airtable base'i ve Automations ile Scripting uzantısına erişim
  • CaptchaAI panelinden alınmış bir API anahtarı ve hesabınızda yeterli bakiye
  • Hedef sayfanın reCAPTCHA v2 sitekey değeri (sayfa kaynağındaki data-sitekey özniteliğinden okunur)
  • Verisini toplayacağınız sayfalar için yetkiniz olduğunun teyidi

Bu dördü hazırsa kurulum uçtan uca 15 dakika sürer.

Bu otomasyon hangi işi çözer

Diyelim ki bir e-ticaret ekibindesiniz ve izniniz olan tedarikçi kataloglarını Airtable'da takip ediyorsunuz. Her satırda, veri toplanmadan önce çözülmesi gereken bir reCAPTCHA v2 içeren bir URL var. Bu sayfaları elle açmak yerine akışı tabloya bağlarsınız:

  1. Airtable Automation yeni kaydı yakalar
  2. Komut dosyası, kaydın sitekey ve pageurl değerlerini CaptchaAI'ye gönderir
  3. CaptchaAI çözülen token'ı döndürür
  4. Token, aynı kaydın alanına geri yazılır

Tüm bu adımlar Airtable'ın içinde çalışır; ayrı bir sunucu, kuyruk servisi veya zamanlanmış iş kurmanız gerekmez.

Tablo yapısı: CAPTCHA Tasks

Önce CAPTCHA Tasks adında bir Airtable tablosu oluşturun. Komut dosyaları alanlara İngilizce adlarıyla eriştiği için alan adlarını aşağıdaki gibi birebir kullanın:

Alan (kodda geçtiği ad) Tür Amaç
URL URL Hedef sayfanın adresi
Sitekey Tek satırlık metin reCAPTCHA sitekey değeri
Status Tek seçim pending, solving, solved, failed
Token Uzun metin Çözülen CAPTCHA token'ı
Solved At Tarih/saat Çözümün zaman damgası
Error Tek satırlık metin Başarısız olursa hata mesajı

İpucu: Status seçenek değerleri komut dosyasındaki metinlerle harfi harfine aynı olmalı; en sık yapılan kurulum hatası buradaki bir yazım farkıdır.

Adım 1: Otomasyonu oluşturun

Airtable panelinde:

  1. Automations sekmesine gidin
  2. Create automation'a tıklayın
  3. Otomasyona bir ad verin: "Solve CAPTCHA on New Record"

Tetikleyici

Tetikleyici olarak When record matches conditions seçeneğini işaretleyin:

Ayar Değer
Tablo CAPTCHA Tasks
Koşul Status alanı pending

Böylece bir kayıt pending durumuna her geçtiğinde otomasyon çalışır. Bu, hem yeni eklenen satırları hem de durumu elle geri alarak yeniden çözdürdüğünüz kayıtları kapsar.

Adım 2: Komut dosyası eylemini ekleyin

Otomasyona bir eylem ekleyin ve Run a script'i seçin:

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

Akış üç aşamalı: görev in.php'ye gönderilir, sonuç res.php'den periyodik sorgulama ile çekilir, token kayda yazılır. CAPCHA_NOT_READY yanıtı geldikçe sorgulama beşer saniye arayla sürer.

Komut dosyası girişlerini eşleyin

Komut dosyası eyleminin sol panelinde giriş değişkenlerini tetikleyici adımındaki alanlarla eşleyin:

Giriş değişkeni Tetikleyici alanı
recordId Kayıt ID'si
sitekey Sitekey alanı
pageurl URL alanı

Adım 3: Scripting uzantısıyla toplu çözüm

Çok sayıda bekleyen kaydı tek seferde işlemek için otomasyon yerine Airtable'ın Scripting uzantısını kullanın (Apps panelinden eklenir). Aşağıdaki betik, pending durumundaki tüm kayıtları sırayla çözer:

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

Yarım kalan çalıştırmayı tamamlama

Her kayıt için durum önce solving, başarılıysa solved, hata varsa failed olur. Böylece uzun bir toplu çalıştırma yarıda kesilse bile baştan başlamanız gerekmez: yalnızca failed kayıtları filtreleyip betiği yeniden çalıştırmanız yeterli olur.

Kurulumu test etme

Canlı veriyle çalışmadan önce akışı tek bir kayıtla doğrulayın:

  1. sitekey ve URL alanları dolu bir test satırı ekleyin
  2. Status alanını pending yapın
  3. Durumun sırayla solving ve solved olduğunu izleyin
  4. Token alanının dolduğunu ve Solved At damgasının yazıldığını doğrulayın

Durum failed olarak kalırsa Error alanındaki mesaj sizi doğrudan sebebe götürür.

Otomasyon mu, toplu betik mi?

İki yaklaşımı da kurdunuz; hangisini kullanacağınız kayıtların tabloya nasıl düştüğüne bağlı. Damla damla gelen kayıtlarda otomasyonu açık bırakın; toplu yığınları elle betikle işleyin.

Kriter Automation (kayıt başına) Scripting uzantısı (toplu)
Tetikleme Kayıt pending olunca otomatik Siz çalıştırdığınızda elle
En uygun senaryo Tek tek, akış hâlinde gelen kayıtlar Bir defada biriken çok sayıda kayıt
Çözüm biçimi Kayıt başına ayrı çalıştırma Tek döngüde sırayla
İzleme Otomasyon çalışma günlüğü output.text() çıktısı

Maliyet, thread planlaması ve KVKK

CaptchaAI çözüm başına değil, eşzamanlı thread başına faturalandırır; bu da TL kuru oynasa bile aylık maliyetinizi USD üzerinden öngörülebilir tutar. Thread sayısını iş yükünüze göre seçin:

  • Otomasyon kayıtları tek tek işlediğinden başlangıç için BASIC ($15/ay, 5 thread) çoğu ekibe yeter.
  • Toplu betikle yüzlerce kaydı kısa sürede işleyecekseniz daha yüksek thread sayısına geçin; aynı anda çözülen CAPTCHA adedi thread sayısıyla sınırlıdır.

KVKK notu: Topladığınız veri kişisel veri içeriyorsa bu iş Türkiye'de KVKK kapsamına girer. Otomasyonu yalnızca yetkiniz olan kaynaklar ve onaylı QA akışları için çalıştırın.

Sık sorulan sorular

Çözülen token Airtable'a yazıldıktan sonra ne kadar geçerli kalır?

reCAPTCHA v2 token'ları kısa ömürlüdür — genellikle yaklaşık iki dakika. Bu yüzden token'ı kayda yazıldıktan sonra hedef isteğinizde hızlıca kullanın; saatlerce bekleyen bir token büyük olasılıkla geçersiz olur.

Bu otomasyon Airtable'ın ücretsiz planında çalışır mı?

Airtable'ın ücretsiz planı sınırlı sayıda otomasyon çalıştırması ve Scripting uzantısını içerir; düşük hacimler için ücretli plan gerekmez. CaptchaAI tarafında en düşük plan BASIC ($15/ay, 5 thread) başlangıç için yeterlidir.

Kurulumu Zapier veya Make yerine neden Airtable içinde yapayım?

Verileriniz zaten Airtable'da duruyorsa çözümü tablonun içinde tutmak en az hareketli yoldur: token doğrudan kayda yazılır, araya başka bir servis girmez. Zapier veya Make'i ise CAPTCHA çözümünü birden çok uygulama arasındaki daha geniş bir iş akışına bağlamanız gerektiğinde tercih edin.

reCAPTCHA v2 dışında hangi CAPTCHA türlerini çözebilirim?

method parametresini değiştirerek aynı akışı desteklenen diğer türlerde de kullanabilirsiniz: reCAPTCHA v3, Cloudflare Turnstile, GeeTest v3 ve görüntü/OCR CAPTCHA'ları. hCaptcha ve FunCaptcha (Arkose Labs) desteklenmiyor; CaptchaFox, Friendly Captcha ve Lemin beta aşamasındadır.

API anahtarımı Airtable'da nasıl güvende tutarım?

Otomasyonlarda anahtarı doğrudan koda yazmak yerine betik ayarları panelinde bir giriş değişkeni tanımlayıp input.config() ile okuyun. Scripting uzantısında ise input.textAsync() ile anahtarı çalışma zamanında sorabilirsiniz; böylece anahtar betik metninde açıkta kalmaz.

Sık karşılaşılan sorunlar

Sorun Sebep Çözüm
Otomasyon tetiklenmiyor Kayıt pending koşuluyla eşleşmiyor Status alanı değerinin harfi harfine eşleştiğini doğrulayın
fetch is not defined Airtable Scripting bazı bağlamlarda remoteFetchAsync kullanır fetch yerine remoteFetchAsync deneyin
Komut dosyası zaman aşımına uğruyor Otomasyon betiklerinde 30 saniyelik sınır var Sorgulama yinelemesini azaltın; ilk beklemeyi 20 saniyeye çıkarın
Kayıt güncellenmiyor Alan adı uyuşmuyor updateRecordAsync içindeki alan adlarının tabloyla birebir aynı olduğundan emin olun
API anahtarı betikte görünüyor Sabit kodlanmış API anahtarı input.config() ile gizli bir giriş değişkeni kullanın

İlgili Makaleler

Sonraki Adımlar

Airtable veritabanlarınızdan CAPTCHA çözümünü otomatikleştirin — CaptchaAI API anahtarınızı alın ve otomasyonu kurun.

İlgili kılavuzlar:

Bu makale için yorumlar devre dışı bırakılmıştır.