Integrations

Airtable + CaptchaAI: تشغيل حل CAPTCHA من داخل قاعدة البيانات

يُستخدم Airtable على نطاق واسع لإدارة البيانات الخفيفة، وتجميع الطلبات، وبناء مسارات أتمتة سريعة من دون طبقة تطبيق كاملة. وعندما تحتاج هذه المسارات إلى التفاعل مع خدمات محمية بـ CAPTCHA، سواء لإرسال النماذج أو معالجة الروابط أو إدخال البيانات، يمكن لـ CaptchaAI أن يتولى خطوة الحل مباشرة من داخل Airtable عبر Automations وScripting.

يشرح هذا الدليل كيفية إعداد Airtable Automations بحيث يبدأ حل CAPTCHA تلقائيًا عند إنشاء سجل جديد أو تحديث سجل قائم.

سيناريو العالم الحقيقي

يمكنك تتبع عناوين URL المستهدفة في جدول Airtable. يحتوي كل عنوان URL على اختبار CAPTCHA الذي يحتاج إلى حل قبل أن يتم استخراج البيانات. عند إضافة عنوان URL جديد:

  1. تكتشف أتمتة Airtable السجل الجديد
  2. يرسل البرنامج النصي معلمات CAPTCHA إلى CaptchaAI
  3. يعيد CaptchaAI الرمز المميز بعد الحل
  4. يتم حفظ الرمز المميز مرة أخرى في سجل Airtable

هيكل الجدول

قم بإنشاء جدول Airtable باسم مهام CAPTCHA بهذه الحقول:

اسم الحقل النوع الغرض
عنوان URL عنوان URL عنوان URL للصفحة المستهدفة
مفتاح الموقع نص سطر واحد مفتاح موقع reCAPTCHA
الحالة اختيار واحد pending أو solving أو solved أو failed
الرمز نص طويل الرمز الناتج من حل CAPTCHA
وقت الحل تاريخ/وقت الطابع الزمني للحل
خطأ نص سطر واحد رسالة خطأ في حالة الفشل

الخطوة 1: إنشاء الأتمتة

داخل Airtable:

  1. انتقل إلى علامة التبويب Automations
  2. انقر Create automation
  3. سمها: "حل اختبار CAPTCHA في السجل الجديد"

المحفّز

اختر عندما يتطابق السجل مع الشروط:

  • الجدول: مهام CAPTCHA
  • الحالة: الحالة "معلقة"

يتم تشغيل هذا الإجراء كلما أصبحت حالة السجل pending، لذلك يغطي السجلات الجديدة وعمليات إعادة الحل معًا.

الخطوة 2: إضافة إجراء البرنامج النصي

أضف إجراء Run a 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}`);
}

تكوين مدخلات البرنامج النصي

في اللوحة اليسرى لإجراء البرمجة النصية، عيّن متغيرات الإدخال:

  • recordId - معرف السجل من خطوة المحفّز
  • sitekey - حقل مفتاح الموقع من خطوة التشغيل
  • pageurl - حقل عنوان URL من خطوة التشغيل

الخطوة 3: معالجة الدُفعات باستخدام ملحق البرمجة النصية

لمعالجة العديد من السجلات في وقت واحد، استخدم ملحق البرمجة النصية الخاص بـ Airtable (المتوفر في لوحة التطبيقات):

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

استكشاف الأخطاء وإصلاحها

المشكلة السبب الإجراء
فشل الأتمتة بصمت لم يلتقط المحفّز السجلات في حالة pending تحقّق من شرط المحفّز، وتأكد من أن حقل الحالة مضبوط
خطأ إرسال مفتاح الموقع مفتاح الموقع فارغ أو غير مكتمل تحقّق من تعيين متغير sitekey بشكل صحيح في لوحة الإدخال
انتهاء الوقت وقت الحل تجاوز 60 ثانية زد قيمة maxAttempts أو راجع بيانات الطلب والاستجابة للتحقّق من نوع CAPTCHA
خطأ في تحديث السجل الحقل مفقود أو اسم الحقل خاطئ تحقّق من تطابق أسماء الحقول بين الكود وهيكل الجدول
تجاوز حد وقت التشغيل عمليات استطلاع طويلة تتجاوز حد أتمتة Airtable استخدم نمط async مع خطط التقسيم للدفعات الكبيرة

الخطوات التالية

النقاشات (0)

لا توجد تعليقات بعد.

مقالات ذات صلة

Integrations Bright Data + CaptchaAI: دليل تكامل البروكسي
دليل تكامل لـ Bright Data + Captcha AI: دليل تكامل البروكسي يوضح الإعداد، وأمثلة الكود، ومسار الدمج الأنسب لتشغيل Captcha AI داخل تطبيقاتك بصورة واضحة وقابلة لل...

دليل تكامل لـ Bright Data + Captcha AI: دليل تكامل البروكسي يوضح الإعداد، وأمثلة الكود، ومسار الدمج الأنسب لتش...

Apr 25, 2026
API Tutorials Bash + cURL + CaptchaAI: أتمتة CAPTCHA من سطر الأوامر
شرح خطوة بخطوة لـ Bash + c URL + Captcha AI: أتمتة CAPTCHA من سطر الأوامر مع أمثلة مباشرة قابلة لإعادة الاستخدام ومسار واضح لتطبيقه باستخدام Captcha AI.

شرح خطوة بخطوة لـ Bash + c URL + Captcha AI: أتمتة CAPTCHA من سطر الأوامر مع أمثلة مباشرة قابلة لإعادة الاستخد...

Apr 21, 2026
Getting Started إعداد مفتاح CaptchaAI API والمصادقة
دليل بدء سريع لـ إعداد مفتاح Captcha AI API والمصادقة يشرح المتطلبات الأساسية، وأول الطلبات، والمسار الأبسط للوصول إلى تكامل صحيح مع Captcha AI.

دليل بدء سريع لـ إعداد مفتاح Captcha AI API والمصادقة يشرح المتطلبات الأساسية، وأول الطلبات، والمسار الأبسط لل...

Apr 17, 2026