يمكنك حلّ اختبار reCAPTCHA v2 داخل أي تدفق في Microsoft Power Automate دون مغادرة المنصة: يرسل موصل HTTP بيانات الاختبار إلى CaptchaAI، ثم تستطلع النتيجة دورياً، وتستخدم الرمز المحلول لإكمال إرسال النموذج — بلا سطر برمجي واحد خارج مصمّم التدفقات.
يشرح هذا الدليل الخطوات الخمس كاملةً بالاعتماد على CaptchaAI وموصل HTTP المدمج في Power Automate.
سيناريو واقعي: بوابة مورّد تطلب reCAPTCHA v2
تخيّل فريقاً مالياً في شركة تجزئة إقليمية يسحب يومياً كشوف الفواتير من بوابة مورّد تعرض reCAPTCHA v2 عند كل تسجيل دخول. يتوقّف سكربت الأتمتة هنا فيضطر الموظف إلى التدخل يدوياً. بدلاً من ذلك، يتولّى تدفق Power Automate المهمة بالكامل: يستقبل معاملات الاختبار (مفتاح الموقع وعنوان URL)، ثم يرسلها إلى CaptchaAI عبر موصل HTTP، ويستطلع النتيجة حتى يكتمل الحل، وأخيراً يستخدم الرمز للمصادقة وسحب البيانات المطلوبة.
المتطلبات قبل ربط CaptchaAI بـ Power Automate
- ترخيص Power Automate Premium: موصل HTTP من الموصلات المميّزة ولا يتوفّر في الخطة المجانية؛ بديله موصل مخصّص أو دالة من Azure Functions.
- مفتاح CaptchaAI API: أنشئ حساباً على captchaai.com وانسخ المفتاح من لوحة التحكم.
- تأمين المفتاح: خزّنه في متغيرات البيئة — Environment Variables أو موصل Azure Key Vault بدلاً من كتابته صراحةً داخل التدفق.
الخطوة 1: أنشئ تدفق Power Automate وحدّد مدخلاته
من Power Automate، أنشئ تدفقاً سحابياً فورياً — Instant cloud flow بـ مُشغِّل يدوي أو أي مُشغِّل يناسبك، ثم أضِف مُدخلَين نصّيين إلى المُشغِّل:
- sitekey: مفتاح موقع reCAPTCHA v2.
- pageurl: عنوان URL للصفحة التي يظهر فيها الاختبار.
الخطوة 2: أرسل مهمة CAPTCHA إلى CaptchaAI
أضِف إجراء HTTP (الموصل المميّز)، واضبط الطريقة على GET وحقل URI على https://ocr.captchaai.com/in.php، ثم عرّف معاملات الاستعلام:
key: مفتاح CaptchaAI API الخاص بك.method:userrecaptcha.googlekey:@{triggerBody()['text']}— مُدخَل مفتاح الموقع.pageurl:@{triggerBody()['text_1']}— مُدخَل عنوان URL.json:1.
أضِف بعده إجراء Parse JSON لتفكيك الاستجابة وفق المخطط:
{
"type": "object",
"properties": {
"status": { "type": "integer" },
"request": { "type": "string" }
}
}
المحتوى: @{body('HTTP')}
الخطوة 3: تحقّق من نجاح الإرسال
أضِف إجراء Condition:
- الشرط:
@{body('Parse_JSON')?['status']}يساوي1.
إذا كانت النتيجة لا (فشل الإرسال)، أضِف إجراء Terminate بحالة "Failed" ورسالة: Submit error: @{body('Parse_JSON')?['request']}.
إذا كانت النتيجة نعم، انتقل إلى حلقة الاستطلاع الدوري.
الخطوة 4: ابنِ حلقة الاستطلاع الدوري
داخل فرع "نعم"، أضِف حلقة Do until بالشرط: @{variables('solveStatus')} لا يساوي pending.
قبل الحلقة، هيّئ متغيّرين: solveStatus (سلسلة) بقيمته الابتدائية pending، وsolvedToken (سلسلة) فارغاً. ثم أضِف الإجراءات التالية بالترتيب:
4أ. تأخير
إجراء Delay بمدّة 5 ثوانٍ بين المحاولات.
4ب. HTTP — استطلاع النتيجة
أضِف إجراء HTTP بالطريقة GET وحقل URI على https://ocr.captchaai.com/res.php، مع معاملات الاستعلام:
key: مفتاح CaptchaAI API الخاص بك.action:get.id:@{body('Parse_JSON')?['request']}.json:1.
4ج. Parse JSON — استجابة الاستطلاع
استخدم المخطط نفسه من الخطوة 2.
4د. Condition — فحص الحالة
الشرط: @{body('Parse_JSON_2')?['status']} يساوي 1.
- إذا نعم (تمّ الحل): اضبط
solvedToken=@{body('Parse_JSON_2')?['request']}واضبطsolveStatus=solved. - إذا لا: أضِف شرطاً فرعياً —
@{body('Parse_JSON_2')?['request']}لا يساويCAPCHA_NOT_READY. إن تحقّق (خطأ فعلي) فاضبطsolveStatus=error، وإلّا فاترك الحلقة تُكمل دورتها.
أخيراً، اضبط حدود حلقة Do until: العدد 20 تكراراً كحدّ أقصى، والمهلة PT3M (ثلاث دقائق).
الخطوة 5: استخدم الرمز المحلول
بعد الحلقة، أضِف Condition لفحص @{variables('solveStatus')}:
إذا ساوى "solved": استخدم @{variables('solvedToken')} داخل طلب HTTP POST لإرسال النموذج، أو مرّره عبر البريد أو رسالة Teams. مثال على طلب POST:
- الطريقة:
POST. - URI: عنوان URL للنموذج المستهدف.
- الجسم (Body):
{"g-recaptcha-response": "@{variables('solvedToken')}", "other_field": "value"}.
إذا لم يُحلّ: أرسِل إشعار خطأ عبر Teams أو البريد.
البنية الكاملة للتدفق
[Manual Trigger (sitekey, pageurl)]
↓
[Initialize Variables: solveStatus, solvedToken]
↓
[HTTP: Submit to CaptchaAI /in.php]
↓
[Parse JSON]
↓
[Condition: status = 1?]
↓ Yes
[Do Until: solveStatus ≠ pending]
├── [Delay: 5 seconds]
├── [HTTP: Poll CaptchaAI /res.php]
├── [Parse JSON]
└── [Condition: Solved or Error?]
↓
[Condition: solveStatus = solved?]
↓ Yes
[HTTP: Submit form with token]
↓
[Compose: Success response]
معالجة الأخطاء الشائعة
- موصل HTTP غير متاح: الخطة المجانية لا تشمل الموصلات المميّزة؛ رقِّ إلى Power Automate Premium أو استخدم موصلاً مخصّصاً.
- فشل Parse JSON: جسم الاستجابة نصّي وليس JSON؛ تأكّد من وجود
json=1ضمن معاملات الاستعلام. - الحلقة لا تتوقّف: لم يُحدَّث متغيّر
solveStatus؛ تحقّق من تطابق أسماء المتغيّرات في إجراءات Set Variable. - خطأ 403 من CaptchaAI: مفتاح API خاطئ أو قيد على عنوان IP؛ تحقّق من المفتاح ومن القائمة البيضاء لعناوين IP في حسابك.
- الجهة المستهدفة ترفض الرمز: مفتاح الموقع أو الصفحة أو سياق الجلسة لا يتطابق؛ أعد التقاط المعاملات واستخدم الرمز داخل الجلسة نفسها.
أسئلة شائعة
هل ترتفع التكلفة كلّما زاد عدد عمليات الحل؟
لا. تعتمد CaptchaAI على التسعير بعدد الـ threads المتزامنة لا بعدد عمليات الحل، وكل خطة تشمل عمليات حل غير محدودة لكل thread شهرياً. تبدأ الخطط من BASIC بسعر 15 دولاراً شهرياً مع 5 threads، فتظل تكلفة التدفق متوقّعة.
هل يعمل التدفق نفسه مع reCAPTCHA v3 أو Cloudflare Turnstile؟
نعم، يكفي تعديل المعامل method حسب نوع الاختبار:
userrecaptchaلـ reCAPTCHA v3 أيضاً.turnstileلـ Cloudflare Turnstile.postلاختبارات الصور.
واضبط بقية المعاملات المطلوبة تبعاً لكل نوع.
لماذا تعيد النتيجة CAPCHA_NOT_READY باستمرار؟
هذه استجابة طبيعية تعني أنّ الحل لم يكتمل بعد، ولهذا صُمِّمت حلقة الاستطلاع. تأكّد من التأخير 5 ثوانٍ بين المحاولات ومن أنّ حدّ المهلة PT3M كافٍ قبل الإنهاء.
لماذا يرفض الموقع المستهدف الرمز رغم نجاح الحل؟
راجع السببين الأكثر شيوعاً:
- عدم تطابق مفتاح الموقع أو عنوان الصفحة مع ما أُرسل إلى CaptchaAI.
- استخدام الرمز في جلسة مختلفة عن التي جُمعت منها المعاملات.
الحل: أعد التقاط المعاملات من الصفحة نفسها واستخدم الرمز فوراً ضمن الجلسة ذاتها.
الخطوات التالية
- ابدأ سريعاً: حلّ أول كابتشا خلال 5 دقائق
- حلّ reCAPTCHA v2 عبر الـ API خطوة بخطوة
- حلّ Cloudflare Turnstile عبر الـ API
- حلّ GeeTest v3 عبر الـ API