Integrations

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

Airtable, proje yönetimi, veri toplama ve iş akışı otomasyonu için kullanılan esnek bir veritabanı platformudur. Airtable iş akışınızın CAPTCHA korumalı hizmetlerle (form gönderme, URL'leri işleme veya veri girişini otomatikleştirme) etkileşime girmesi gerektiğindeCaptchaAIAutomations ve Scripting uzantılarını kullanarak CAPTCHA'ları doğrudan Airtable'dan çözebilir.

Bu kılavuz, yeni kayıtlar oluşturulduğunda veya güncellendiğinde CaptchaAI aracılığıyla CAPTCHA çözmeyi tetikleyen Airtable Otomasyonlarının nasıl kurulacağını gösterir.

Gerçek Dünya Senaryosu

Hedef URL'leri Airtable tablosunda izlersiniz. Her URL'de, verilerin çıkarılabilmesi için çözülmesi gereken bir CAPTCHA bulunur. Yeni bir URL eklendiğinde:

  1. Airtable Otomasyonu yeni rekoru tespit ediyor
  2. Bir komut dosyası CAPTCHA parametrelerini CaptchaAI'ye gönderir
  3. CaptchaAI çözülmüş jetonu döndürür
  4. Belirteç Airtable kaydına geri kaydedilir

Tablo Yapısı

Şu alanlarla CAPTCHA Görevleri adlı bir Airtable tablosu oluşturun:

Alan Adı Tür Amaç
URL'si URL'si Hedef sayfa URL'si
Site anahtarı Tek satırlık metin reCAPTCHA site anahtarı
Durum Tek seçim beklemede, çözülüyor, çözüldü, başarısız oldu
Jeton Uzun metin Çözülmüş CAPTCHA belirteci
Çözüldü Tarih/time Çözümün zaman damgası
Hata Tek satırlık metin Başarısız olursa hata mesajı

1. Adım: Otomasyonu Oluşturun

Airtable'da:

  1. Otomasyonlar sekmesine gidin
  2. Otomasyon oluştur'u tıklayın
  3. Adını verin: "Yeni Kayıttaki CAPTCHA'yı Çöz"

Tetikleyici

Kayıt koşullarla eşleştiğinde seçeneğini seçin:

  • Tablo: CAPTCHA Görevleri
  • Durum: Durum "beklemede"

Bu, hem yeni kayıtları hem de yeniden çözümleri kapsayan bir kayıt "beklemede" olarak ayarlandığında tetiklenir.

2. Adım: Komut Dosyası Eylemini Ekleyin

Bir eylem ekleyin – Bir komut dosyası çalıştırın:

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

Komut Dosyası Girişlerini Yapılandırma

Betik eyleminin sol panelinde giriş değişkenlerini eşleyin:

  • recordId – Tetikleme adımından ID kaydı
  • sitekey – tetikleme adımından Sitekey alanı
  • pageurl – tetikleme adımındaki URL alanı

3. Adım: Komut Dosyası Uzantısıyla Toplu İşleme

Birçok kaydı aynı anda işlemek için Airtable'ın Scripting uzantısını (Uygulamalar panelinde mevcuttur) kullanın:

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

Sorun giderme

Sorun Sebep Düzeltme
Otomasyon tetiklenmiyor Kayıt "beklemede" durumuyla eşleşmiyor Durum alanı değerinin tam olarak eşleştiğini doğrulayın
fetch is not defined Airtable Scripting, bazı bağlamlarda remoteFetchAsync'yi kullanır fetch yerine remoteFetchAsync'yi deneyin
Komut dosyası zaman aşımı Airtable komut dosyalarının otomasyonlar için 30 saniyelik bir sınırı vardır Daha az yoklama yinelemesi kullanın; ilk bekleme süresini 20 saniyeye çıkar
Kayıt güncellemesi başarısız oluyor Alan adı uyuşmazlığı updateRecordAsync tablosundaki alan adlarının tam olarak eşleştiğinden emin olun
Komut dosyasında gösterilen API anahtarı Sabit kodlanmış API anahtarı input.config()'yi gizli bir giriş değişkeniyle kullanın

SSS

Airtable'da komut dosyası yürütme süresi sınırı nedir?

Otomasyon komut dosyaları: 30 saniye. Komut dosyası uzantısı: 30 saniye (ancak Pro planlarıyla uzatılabilir). Uzun yoklama için ilk bekleme süresini artırın ve yinelemeleri azaltın.

Bunu Resim CAPTCHA'ları için de kullanabilir miyim?

Evet. method'yi base64 olarak değiştirin ve görüntü verilerini gönderin. Base64 kodlu CAPTCHA görüntülerini Airtable Ek alanlarında saklayabilir ve bunları komut dosyasına çıkarabilirsiniz.

API anahtarını güvenli bir şekilde nasıl kullanırım?

Otomasyonlarda, komut dosyası ayarları panelinde yapılandırılan giriş değişkenlerini kullanın. Komut Dosyası uzantısında, input.textAsync() ile çalışma zamanında anahtarı isteyebilirsiniz.

Başarısız CAPTCHA'ları yeniden çözebilir miyim?

Evet. Durumu tekrar "beklemede" olarak ayarlayın; otomasyon yeniden tetiklenecektir. Yeniden denemeleri sınırlamak için yeniden deneme sayacı alanı ekleyin.

İlgili Makaleler

Sonraki Adımlar

Airtable veritabanlarınızdan CAPTCHA çözmeyi otomatikleştirin -CaptchaAI API anahtarınızı alınve otomasyonu ayarlayın.

İlgili kılavuzlar:

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

İlgili Yazılar

Integrations CaptchaAI ile QA için tarayıcı profili izolasyonu
Staging QA testlerini temiz ve tekrarlanabilir tutmak için çerezleri, storage verilerini, test hesaplarını ve CAPTCHA yapılandırmalarını tarayıcı profiline göre...

Staging QA testlerini temiz ve tekrarlanabilir tutmak için çerezleri, storage verilerini, test hesaplarını ve...

Apr 29, 2026
Tutorials CaptchaAI ile Rakip Analizi Kontrol Paneli Oluşturun
Captcha AI ile Rakip Analizi Kontrol Paneli Oluşturmak için doğrudan yeniden kullanılabilir örnekler ve net bir Captcha AI iş akışı içeren adım adım eğitim.

Captcha AI ile Rakip Analizi Kontrol Paneli Oluşturmak için doğrudan yeniden kullanılabilir örnekler ve net bi...

Apr 30, 2026