يُستخدم Airtable على نطاق واسع لإدارة البيانات الخفيفة، وتجميع الطلبات، وبناء مسارات أتمتة سريعة من دون طبقة تطبيق كاملة. وعندما تحتاج هذه المسارات إلى التفاعل مع خدمات محمية بـ CAPTCHA، سواء لإرسال النماذج أو معالجة الروابط أو إدخال البيانات، يمكن لـ CaptchaAI أن يتولى خطوة الحل مباشرة من داخل Airtable عبر Automations وScripting.
يشرح هذا الدليل كيفية إعداد Airtable Automations بحيث يبدأ حل CAPTCHA تلقائيًا عند إنشاء سجل جديد أو تحديث سجل قائم.
سيناريو العالم الحقيقي
يمكنك تتبع عناوين URL المستهدفة في جدول Airtable. يحتوي كل عنوان URL على اختبار CAPTCHA الذي يحتاج إلى حل قبل أن يتم استخراج البيانات. عند إضافة عنوان URL جديد:
- تكتشف أتمتة Airtable السجل الجديد
- يرسل البرنامج النصي معلمات CAPTCHA إلى CaptchaAI
- يعيد CaptchaAI الرمز المميز بعد الحل
- يتم حفظ الرمز المميز مرة أخرى في سجل Airtable
هيكل الجدول
قم بإنشاء جدول Airtable باسم مهام CAPTCHA بهذه الحقول:
| اسم الحقل | النوع | الغرض |
|---|---|---|
| عنوان URL | عنوان URL | عنوان URL للصفحة المستهدفة |
| مفتاح الموقع | نص سطر واحد | مفتاح موقع reCAPTCHA |
| الحالة | اختيار واحد | pending أو solving أو solved أو failed |
| الرمز | نص طويل | الرمز الناتج من حل CAPTCHA |
| وقت الحل | تاريخ/وقت | الطابع الزمني للحل |
| خطأ | نص سطر واحد | رسالة خطأ في حالة الفشل |
الخطوة 1: إنشاء الأتمتة
داخل Airtable:
- انتقل إلى علامة التبويب Automations
- انقر Create automation
- سمها: "حل اختبار 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)
شارك في النقاش
سجّل الدخول لمشاركة رأيك.
تسجيل الدخوللا توجد تعليقات بعد.