حالات الاستخدام

التعامل مع CAPTCHA داخل روبوتات الأتمتة باستخدام CaptchaAI

عندما يصطدم روبوت الأتمتة باختبار CAPTCHA، يتجمّد سير العمل بالكامل حتى يتدخّل إنسان لحل الاختبار يدوياً، فتنكسر أي مهمة مجدولة أو تعمل بلا إشراف. يزيل CaptchaAI هذه العقبة عبر واجهة برمجية واحدة: يرسل الروبوت تفاصيل الاختبار، يستطلع النتيجة دورياً، ثم يستلم رمزاً جاهزاً يدرجه في النموذج ويكمل الإرسال.

النتيجة روبوت يعمل من أوله إلى آخره دون تدخل بشري، سواء ملأ نماذج محمية بـ reCAPTCHA v2، أو حل Cloudflare Turnstile في بوابة حجز، أو قرأ صورة CAPTCHA نصية في بوابة إدخال بيانات. يوضّح هذا الدليل كيف تبني هذا المنطق مرة واحدة وتعيد استخدامه عبر مهامك، مع أمثلة عملية في Python وNode.js.

كيف يحل CaptchaAI أي اختبار CAPTCHA داخل الروبوت

قبل الأمثلة، من المفيد استيعاب الدورة التي يمرّ بها كل اختبار داخل الروبوت. أربع خطوات تتكرّر مهما اختلف نوع CAPTCHA:

  1. يرسل الروبوت تفاصيل الاختبار — النوع ومفتاح الموقع ورابط الصفحة — إلى نقطة النهاية in.php، فيستلم معرّف المهمة.
  2. يستطلع النتيجة دورياً عبر res.php حتى يجهز الحل، دون أن يوقف بقية سير العمل.
  3. يستلم الرمز الجاهز — مثل g-recaptcha-response — بمجرد اكتمال الحل.
  4. يدرج الرمز في النموذج ويكمل الإرسال، كأن مستخدماً حقيقياً اجتاز الاختبار.

هذه الدورة نفسها هي ما تغلّفه الفئة القابلة لإعادة الاستخدام أدناه، فلا تكرّرها في كل مهمة.

سيناريوهات شائعة لأتمتة الروبوتات وحل CAPTCHA

يختلف نوع CAPTCHA باختلاف المهمة. يلخّص الجدول أكثر السيناريوهات تكراراً وطريقة CaptchaAI المناسبة لكل منها:

السيناريو نوع CAPTCHA الشائع طريقة CaptchaAI
تقديم النموذج reCAPTCHA v2 method=userrecaptcha
تسجيل الحساب reCAPTCHA v2/v3 method=userrecaptcha
بوابات إدخال البيانات صورة التحقق method=base64
الحجز أو أنظمة المواعيد Cloudflare Turnstile method=turnstile
الوصول إلى بوابة API Cloudflare Challenge method=cloudflare_challenge

بناء إطار موحّد لحل CAPTCHA في روبوتات الأتمتة

بدل تكرار منطق الإرسال والاستطلاع، ابنِ فئة قابلة لإعادة الاستخدام. تُرسل الفئة التالية أي اختبار إلى in.php، تنتظر الحل عبر res.php، ثم تعيد الرمز:

import requests
import time
import logging

logger = logging.getLogger(__name__)

class CaptchaBot:
    def __init__(self, api_key):
        self.api_key = api_key
        self.session = requests.Session()
        self.session.headers.update({
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
        })

    def solve(self, method, **params):
        """Solve any CAPTCHA type."""
        params["key"] = self.api_key
        params["method"] = method

        resp = requests.get("https://ocr.captchaai.com/in.php", params=params)
        if not resp.text.startswith("OK|"):
            raise Exception(f"Submit error: {resp.text}")

        task_id = resp.text.split("|")[1]
        logger.info(f"Task submitted: {task_id}")

        for _ in range(60):
            time.sleep(5)
            result = requests.get("https://ocr.captchaai.com/res.php", params={
                "key": self.api_key, "action": "get", "id": task_id
            })
            if result.text == "CAPCHA_NOT_READY": continue
            if result.text.startswith("OK|"): return result.text.split("|")[1]
            raise Exception(f"Error: {result.text}")

        raise TimeoutError("CAPTCHA solve timed out")

    def submit_form(self, url, form_data, captcha_field="g-recaptcha-response",
                    site_key=None, captcha_method="userrecaptcha"):
        """Submit a form with CAPTCHA solving."""
        if site_key:
            if captcha_method == "userrecaptcha":
                token = self.solve(captcha_method, googlekey=site_key, pageurl=url)
            elif captcha_method == "turnstile":
                token = self.solve(captcha_method, sitekey=site_key, pageurl=url)
            form_data[captcha_field] = token

        return self.session.post(url, data=form_data)

مثال: روبوت لإرسال النماذج

مع هذه الفئة، يتقلّص إرسال نموذج محمي بـ reCAPTCHA إلى استدعاء واحد: مرّر رابط الصفحة وبياناته ومفتاح الموقع، ويتكفّل الروبوت بالباقي:

bot = CaptchaBot("YOUR_API_KEY")

# Submit a contact form protected by reCAPTCHA
result = bot.submit_form(
    url="https://example.com/contact",
    form_data={
        "name": "John Doe",
        "email": "john@example.com",
        "message": "Inquiry about your service"
    },
    site_key="6Le-wvkS...",
    captcha_method="userrecaptcha"
)

print(f"Form submitted: {result.status_code}")

مثال: روبوت حجز بخطوات متعددة

تمرّ بعض المهام بعدة صفحات قبل بلوغ CAPTCHA. تخيّل فريق متجر إلكتروني بالمنطقة يختبر نظام حجز المواعيد قبل موسم ذروة مثل الجمعة البيضاء: يحمّل صفحة الحجز، يختار الموعد، ثم يحل CAPTCHA عند الإتمام — ضمن بيئة يملكها ويصرّح باختبارها. ويجمعها المثال التالي في تدفّق واحد:

def appointment_booking_bot(date, time_slot, user_info):
    bot = CaptchaBot("YOUR_API_KEY")

    # Step 1: Load booking page
    page = bot.session.get("https://example.com/book")

    # Step 2: Select date and time
    resp = bot.session.post("https://example.com/book/select", data={
        "date": date,
        "time": time_slot
    })

    # Step 3: Fill personal info with CAPTCHA
    result = bot.submit_form(
        url="https://example.com/book/confirm",
        form_data={
            "name": user_info["name"],
            "email": user_info["email"],
            "phone": user_info["phone"],
            "date": date,
            "time": time_slot
        },
        site_key="6Le-wvkS...",
        captcha_method="userrecaptcha"
    )

    return result.status_code == 200

# Run
success = appointment_booking_bot(
    date="2025-02-15",
    time_slot="10:00",
    user_info={"name": "John Doe", "email": "john@example.com", "phone": "555-0100"}
)

مثال: روبوت إدخال بيانات مع صورة CAPTCHA

تعتمد بوابات إدخال البيانات القديمة على صور CAPTCHA نصية. ينزّل الروبوت الصورة، يحوّلها إلى base64، يرسلها للحل، ثم يدرج النص مع كل سجل، مع تأخير عشوائي لتوزيع الطلبات:

import base64

def data_entry_bot(entries, captcha_image_url):
    bot = CaptchaBot("YOUR_API_KEY")

    for entry in entries:
        # Load the form page
        page = bot.session.get("https://portal.example.com/entry")

        # Download and solve image CAPTCHA
        img = bot.session.get(captcha_image_url)
        img_b64 = base64.b64encode(img.content).decode()
        captcha_text = bot.solve("base64", body=img_b64)

        # Submit entry
        resp = bot.session.post("https://portal.example.com/entry", data={
            **entry,
            "captcha": captcha_text
        })

        logger.info(f"Entry submitted: {resp.status_code}")
        time.sleep(random.uniform(2, 5))

إطار العمل نفسه في Node.js

إن كان روبوتك مبنياً على Node.js، فالمنطق ذاته: فئة تُرسل الاختبار وتستطلع النتيجة عبر Axios وتعيد الرمز:

const axios = require("axios");

class CaptchaBot {
  constructor(apiKey) {
    this.apiKey = apiKey;
  }

  async solve(method, params) {
    params.key = this.apiKey;
    params.method = method;

    const submit = await axios.get("https://ocr.captchaai.com/in.php", {
      params,
    });
    const taskId = submit.data.split("|")[1];

    while (true) {
      await new Promise((r) => setTimeout(r, 5000));
      const result = await axios.get("https://ocr.captchaai.com/res.php", {
        params: { key: this.apiKey, action: "get", id: taskId },
      });
      if (result.data === "CAPCHA_NOT_READY") continue;
      if (result.data.startsWith("OK|")) return result.data.split("|")[1];
      throw new Error(result.data);
    }
  }

  async submitForm(url, formData, siteKey, method = "userrecaptcha") {
    const token = await this.solve(method, {
      googlekey: siteKey,
      pageurl: url,
    });
    formData["g-recaptcha-response"] = token;

    return axios.post(url, new URLSearchParams(formData));
  }
}

// Usage
const bot = new CaptchaBot("YOUR_API_KEY");
const result = await bot.submitForm(
  "https://example.com/submit",
  { name: "John", email: "john@example.com" },
  "6Le-wvkS..."
);

أنواع CAPTCHA التي يدعمها CaptchaAI فعلياً

قبل أن تبني الروبوت حول نوع معيّن، تأكّد أنه ضمن الأنواع المغطّاة. يتعامل CaptchaAI مع:

  • reCAPTCHA بكل إصداراتها: v2 وv3 وreCAPTCHA Enterprise.
  • Cloudflare Turnstile وCloudflare Challenge.
  • GeeTest v3.
  • صور CAPTCHA النصية والشبكات الصورية (grid).
  • BLS CAPTCHA.

أما hCaptcha وFunCaptcha فغير مدعومَين حتى الآن، لذا صمّم الروبوت حول الأنواع المدعومة فعلياً بدل الاعتماد على نوع لن يجد له حلاً.

معالجة الأعطال الشائعة

يربط الجدول أبرز المشكلات المتكررة عند التشغيل على نطاق واسع بسببها والإجراء المناسب:

المشكلة السبب المحتمل الإجراء
رفض رمز CAPTCHA انتهت صلاحية الرمز قبل إرساله استخدم الرمز خلال 120 ثانية من الحل
اكتشاف النظام للروبوت رغم صحة الرمز بصمة المتصفح أو نمط الطلبات أضف رؤوس HTTP واقعية وتأخيرات بين الطلبات
فشل الإرسال بسبب نقص الحقول حقول مخفية مثل رمز CSRF افحص مصدر النموذج وأدرج جميع الحقول المخفية
حظر بسبب معدل الطلبات كثرة الطلبات من العنوان نفسه أضف تأخيرات عشوائية ودوّر الخوادم الوسيطة

نصائح لتشغيل الروبوت بثبات على نطاق واسع

يتحوّل السكربت الذي ينجح مرة واحدة إلى روبوت موثوق عند مراعاة بضع قواعد تشغيلية:

  • استخدم الرمز خلال 120 ثانية من الحل قبل انتهاء صلاحيته لدى الموقع الهدف.
  • وزّع الطلبات بتأخيرات عشوائية ودوّر الخوادم الوسيطة لتفادي تحديد معدل الطلبات.
  • أضف رؤوس HTTP واقعية حتى تبدو حركة الروبوت أقرب إلى جلسة متصفح حقيقية.
  • افحص مصدر كل نموذج وأدرج الحقول المخفية مثل رمز CSRF قبل الإرسال.
  • شغّل الروبوت ضمن بيئة تملكها أو صرّح باختبارها، والتزم بشروط استخدام المواقع.

الأسئلة الشائعة

ما أنواع CAPTCHA التي يتعامل معها CaptchaAI داخل روبوتات الأتمتة؟

يغطّي CaptchaAI reCAPTCHA بجميع إصداراتها، وCloudflare Turnstile وChallenge، وGeeTest v3، وصور CAPTCHA النصية والشبكات الصورية، وBLS. أما hCaptcha وFunCaptcha فغير مدعومَين حالياً، لذا اختبر نوع الاختبار في صفحتك المستهدفة أولاً وابنِ الروبوت حول الأنواع المتاحة.

كم تكلفة تشغيل روبوت أتمتة عالي الحجم؟

يُحتسب تسعير CaptchaAI على عدد الـ Threads المتزامنة لا على عمليات الحل، مع حلول غير محدودة لكل thread شهرياً. تبدأ BASIC من 15 دولاراً بخمسة threads، وترتفع حتى ADVANCE بتسعين دولاراً و50 thread، فتبقى التكلفة متوقّعة مهما زاد الحجم.

كيف أدمج الحل داخل Selenium أو Playwright؟

استدعِ فئة الروبوت للحصول على الرمز، ثم احقنه في الصفحة عبر JavaScript يملأ حقل الاستجابة (مثل g-recaptcha-response) قبل الإرسال؛ يبقى المتصفح مسؤولاً عن التنقّل ويتكفّل CaptchaAI بطبقة CAPTCHA.

أدلة ذات صلة

التعليقات غير مفعّلة لهذا المقال.