التكاملات

Oxylabs + CaptchaAI: تكامل وكيل مركز البيانات

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

يوضّح هذا الدليل كيفية ربط بروكسيات Oxylabs — مراكز البيانات والسكنية — بخدمة CaptchaAI داخل كود Python جاهز للتشغيل: اختيار البروكسي المناسب، وضبط الجلسات الثابتة، وتشغيل خط أنابيب متزامن دون تعارض بين عناوين الـ IP والرموز المحلولة.


لماذا تجمع بين بروكسي Oxylabs وحل CaptchaAI؟

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

على جانب CaptchaAI، تغطّي الخدمة الأنواع الأكثر شيوعًا في المواقع المحمية:

  • reCAPTCHA v2 وv3، بما فيها الإصدارات غير المرئية وEnterprise
  • Cloudflare Turnstile وCloudflare Challenge
  • GeeTest v3
  • اختبارات الصور وOCR والشبكات (grid) وBLS

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


اختيار منتج Oxylabs المناسب

تتيح Oxylabs عدة فئات من البروكسي، ولكل منها موضع استخدام يختلف بحسب حساسية الموقع الهدف تجاه CAPTCHA وأولوية السرعة:

المنتج حجم عناوين IP السرعة حالة الاستخدام
بروكسي مركز البيانات 2 مليون+ سريع جدًا الحجم الكبير والسرعة أولًا
البروكسي السكني 100 مليون+ متوسط المواقع الحساسة لـ CAPTCHA
بروكسي مزوّد خدمة الإنترنت (ISP) بجودة سكنية سريع التجارة الإلكترونية والمنصات الاجتماعية
البروكسي المحمول 20 مليون+ بطيء الأهداف المخصّصة للجوال
SERP Scraper API مُدارة سريع نتائج Google وBing

القاعدة العملية بسيطة:

  • مركز البيانات: حين تكون السرعة والحجم أهم من كل شيء
  • السكني: حين يبدأ الموقع في عرض اختبار CAPTCHA على كل طلب تقريبًا
  • بروكسي ISP: حلّ وسط لمواقع التجارة الإلكترونية التي توازن بين السرعة والسمعة

التكامل مع Python

يتكرّر المسار في ثلاث خطوات لكل رابط:

  1. اجلب الصفحة عبر بروكسي Oxylabs.
  2. أرسل مفتاح الموقع (sitekey) إلى CaptchaAI عبر نقطة النهاية in.php.
  3. استطلع النتيجة من res.php حتى يعود الرمز، ثم استخدمه في طلبك.

إرسال الطلبات عبر البروكسي وحل reCAPTCHA

لاحظ في الكود التالي استخدام لاحقة -cc- لتوجيه الطلب إلى دولة محددة — وهي نقطة مهمة للأسواق الإقليمية كما سنرى لاحقًا:

import requests
import time

OXYLABS_USER = "customer-USERNAME"
OXYLABS_PASS = "PASSWORD"
OXYLABS_ENDPOINT = "pr.oxylabs.io:7777"

CAPTCHAAI_KEY = "YOUR_API_KEY"
CAPTCHAAI_URL = "https://ocr.captchaai.com"

# Residential rotating proxy
proxies = {
    "http": f"http://{OXYLABS_USER}:{OXYLABS_PASS}@{OXYLABS_ENDPOINT}",
    "https": f"http://{OXYLABS_USER}:{OXYLABS_PASS}@{OXYLABS_ENDPOINT}",
}


def fetch_page(url, country=None):
    """Fetch page through Oxylabs proxy."""
    user = OXYLABS_USER
    if country:
        user += f"-cc-{country}"

    proxy = {
        "http": f"http://{user}:{OXYLABS_PASS}@{OXYLABS_ENDPOINT}",
        "https": f"http://{user}:{OXYLABS_PASS}@{OXYLABS_ENDPOINT}",
    }

    return requests.get(
        url,
        proxies=proxy,
        headers={
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
            "AppleWebKit/537.36 Chrome/126.0.0.0 Safari/537.36"
        },
        timeout=30,
    )


def solve_recaptcha(site_url, sitekey):
    """Solve via CaptchaAI."""
    resp = requests.post(f"{CAPTCHAAI_URL}/in.php", data={
        "key": CAPTCHAAI_KEY,
        "method": "userrecaptcha",
        "googlekey": sitekey,
        "pageurl": site_url,
        "json": 1,
    })
    data = resp.json()
    if data["status"] != 1:
        raise Exception(f"Submit: {data['request']}")

    task_id = data["request"]

    for _ in range(60):
        time.sleep(5)
        resp = requests.get(f"{CAPTCHAAI_URL}/res.php", params={
            "key": CAPTCHAAI_KEY,
            "action": "get",
            "id": task_id,
            "json": 1,
        })
        data = resp.json()
        if data["request"] == "CAPCHA_NOT_READY":
            continue
        if data["status"] == 1:
            return data["request"]
        raise Exception(f"Solve: {data['request']}")

    raise TimeoutError("Timeout")

حلقة الاستطلاع الدوري هنا تنتظر خمس ثوانٍ بين كل محاولة وأخرى وتكرّر حتى ستين مرة، وهو هامش كافٍ لأنواع reCAPTCHA الشائعة. عند نجاح الحل، تستخدم القيمة المعادة في حقل g-recaptcha-response ضمن طلب الإرسال النهائي.

الحفاظ على نفس الـ IP عبر الجلسات الثابتة (sticky)

كثير من المواقع يربط اختبار CAPTCHA بعنوان الـ IP الذي عُرض عليه. إذا حللت الاختبار من عنوان ثم أرسلت التوكن من عنوان آخر، يُرفض الطلب. لذلك عند التعامل مع نموذج محمي، ثبّت الجلسة على نفس الـ IP طوال دورة الحل عبر معرّف sessid:

def get_oxylabs_sticky_proxy(session_id, country=None):
    """Create Oxylabs sticky session (same IP)."""
    user = OXYLABS_USER + f"-sessid-{session_id}"
    if country:
        user += f"-cc-{country}"

    proxy_url = f"http://{user}:{OXYLABS_PASS}@{OXYLABS_ENDPOINT}"
    return {"http": proxy_url, "https": proxy_url}


# CAPTCHA workflow with sticky IP
import random, string
session = "".join(random.choices(string.ascii_lowercase, k=8))
proxy = get_oxylabs_sticky_proxy(session, country="us")

# All requests use the same IP
resp = requests.get("https://target.com/form", proxies=proxy)
# ... solve CAPTCHA ...
resp = requests.post("https://target.com/submit", proxies=proxy, data={
    "g-recaptcha-response": token,
})

بهذا تمرّ خطوات جلب النموذج وحل الاختبار وإرسال البيانات كلها من عنوان واحد، فيبقى السياق متسقًا أمام الموقع.


دمج Oxylabs Web Scraper API مع CaptchaAI

في المواقع التي لا يكفي فيها العرض المدمج (rendering) الخاص بـ Oxylabs للوصول إلى اختبار CAPTCHA، استخدم Web Scraper API لتحميل الصفحة المعروضة بالكامل، ثم مرّر مفتاح الموقع المكتشف إلى CaptchaAI:

def scrape_with_oxylabs_api(url):
    """Use Oxylabs Web Scraper API for rendering, CaptchaAI for CAPTCHAs."""
    resp = requests.post(
        "https://realtime.oxylabs.io/v1/queries",
        auth=(OXYLABS_USER, OXYLABS_PASS),
        json={
            "source": "universal",
            "url": url,
            "render": "html",
            "browser_instructions": [
                {"type": "wait", "wait_time_s": 3},
            ],
        },
    )

    result = resp.json()
    html = result["results"][0]["content"]

    # Check for CAPTCHA in rendered HTML
    import re
    sitekey_match = re.search(r'data-sitekey="([^"]+)"', html)

    if sitekey_match:
        sitekey = sitekey_match.group(1)
        token = solve_recaptcha(url, sitekey)
        return {"html": html, "captcha_solved": True, "token": token}

    return {"html": html, "captcha_solved": False}

هذا النمط يفصل بين مهمتين: يتولّى Oxylabs عرض الصفحة وتنفيذ JavaScript، ويتولّى CaptchaAI حل الاختبار المكتشف. تذكّر أن Web Scraper API يعالج بعض تحديات JavaScript لكنه لا يحل اختبارات CAPTCHA.


مركز البيانات مقابل السكني: أيهما يقلّل اختبارات CAPTCHA؟

المفاضلة هنا بين السرعة ومعدل ظهور الاختبار. عناوين مراكز البيانات أسرع لكن الأنظمة تتعرّف عليها بسهولة أكبر، فيرتفع معدل ظهور CAPTCHA. العناوين السكنية أبطأ لكنها تخفض هذا المعدل. الدالة التالية تختار نوع البروكسي تلقائيًا بحسب حساسية الموقع الهدف:

# Datacenter: Fast but higher CAPTCHA rate
DC_PROXY = {
    "http": f"http://{OXYLABS_USER}:{OXYLABS_PASS}@dc.pr.oxylabs.io:10000",
    "https": f"http://{OXYLABS_USER}:{OXYLABS_PASS}@dc.pr.oxylabs.io:10000",
}

# Residential: Slower but lower CAPTCHA rate
RES_PROXY = {
    "http": f"http://{OXYLABS_USER}:{OXYLABS_PASS}@pr.oxylabs.io:7777",
    "https": f"http://{OXYLABS_USER}:{OXYLABS_PASS}@pr.oxylabs.io:7777",
}


def smart_proxy_selection(url, captcha_sensitive=True):
    """Pick proxy type based on target site sensitivity."""
    if captcha_sensitive:
        return RES_PROXY  # Less likely to trigger CAPTCHA
    return DC_PROXY  # Faster, CaptchaAI handles any CAPTCHAs

الاستراتيجية المتوازنة أن تبدأ من مركز البيانات لسرعته وتترك CaptchaAI يحل ما يظهر؛ فإذا تحوّل الموقع إلى عرض تحدٍّ على كل طلب، انتقل إلى السكني. بهذا لا تدفع كلفة السرعة إلا حيث تحتاجها فعلًا.


تشغيل خط أنابيب متزامن

لمعالجة قائمة روابط دفعة واحدة، شغّل الدوال السابقة داخل ThreadPoolExecutor مع جلسة ثابتة لكل رابط:

from concurrent.futures import ThreadPoolExecutor, as_completed

def process_url(url):
    session = "".join(random.choices(string.ascii_lowercase, k=8))
    proxy = get_oxylabs_sticky_proxy(session, country="us")

    try:
        resp = requests.get(url, proxies=proxy, timeout=30)

        import re
        match = re.search(r'data-sitekey="([^"]+)"', resp.text)

        if match:
            token = solve_recaptcha(url, match.group(1))
            return {"url": url, "status": "solved"}
        return {"url": url, "status": "no_captcha"}

    except Exception as e:
        return {"url": url, "status": "error", "error": str(e)}


urls = ["https://site1.com", "https://site2.com", "https://site3.com"]

with ThreadPoolExecutor(max_workers=5) as executor:
    futures = {executor.submit(process_url, u): u for u in urls}
    for future in as_completed(futures):
        print(future.result())

هنا تظهر علاقة مباشرة بين التزامن والتكلفة على جانب CaptchaAI. تسعّر الخدمة حسب عدد الـ threads المتزامنة لا حسب كل عملية حل، مع حلول غير محدودة لكل thread طوال الشهر. تبدأ الخطط من BASIC بسعر 15 دولارًا شهريًا و5 threads، ثم STANDARD بسعر 30 دولارًا و15 thread. اجعل قيمة max_workers — وهي 5 في المثال — ضمن عدد الـ threads المتاح في خطتك حتى لا تنتظر الطلبات في قائمة الانتظار.


سيناريو عملي: مراقبة الأسعار في أسواق الخليج

تخيّل فريقًا في القاهرة يراقب أسعار المنافسين على منصات تجارة إلكترونية تخدم السعودية والإمارات. لكي تظهر النتائج كما يراها مستخدم محلي، تُوجَّه الطلبات عبر عناوين IP إقليمية بلاحقة الدولة: -cc-sa للسعودية و-cc-ae للإمارات بدلًا من country="us". تبدأ الطلبات ببروكسي مركز البيانات للسرعة، فإذا عرض الموقع reCAPTCHA أو Turnstile تولّى CaptchaAI حلّه وأعاد الرمز فورًا. وإذا ظهرت الاختبارات على كل طلب في نطاق معيّن، يُنقل ذلك النطاق وحده إلى البروكسي السكني الإقليمي مع بقاء الباقي على مركز البيانات — فتُحفظ السرعة والتكلفة معًا. الأسعار تبقى بالدولار الأمريكي كما في صفحة تسعير كل خدمة.


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

المشكلة السبب المحتمل الإجراء
رمز 403 من البروكسي عنوان IP مدرج في القائمة السوداء انتقل إلى البروكسي السكني أو دوّر العنوان
فشل المصادقة نقطة نهاية خاطئة مركز البيانات: dc.pr.oxylabs.io:10000 — السكني: pr.oxylabs.io:7777
انتهاء صلاحية الجلسة الثابتة المهلة الافتراضية 10 دقائق أنشئ معرّف جلسة جديدًا
ظهور CAPTCHA على كل صفحة تم التعرّف على عنوان مركز البيانات استخدم البروكسي السكني
استجابة بطيئة زمن استجابة الشبكة السكنية اقبل التأخير أو انتقل إلى بروكسي ISP

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

هل يحتاج حل CAPTCHA إلى جلسة IP ثابتة (sticky)؟

نعم في أغلب الحالات. حين يربط الموقع الاختبار بعنوان الـ IP، يجب أن تمرّ خطوات جلب النموذج وحل الاختبار وإرسال التوكن من العنوان نفسه، وإلا رُفض الطلب. استخدم معرّف sessid لتثبيت الجلسة طوال دورة الحل.

كيف تُحسب تكلفة CaptchaAI عند التشغيل المتزامن؟

تُحسب حسب عدد الـ threads المتزامنة لا حسب كل عملية حل، وكل thread يمنحك حلولًا غير محدودة خلال الشهر. اضبط عدد العمال المتزامنين في الكود ضمن حدود الـ threads في خطتك؛ فمثلًا خطة BASIC بسعر 15 دولارًا توفّر 5 threads متزامنة.

ماذا عن اختبارات hCaptcha وFunCaptcha؟

لا. لا يحل CaptchaAI حاليًا اختبارات hCaptcha أو FunCaptcha (Arkose Labs). لكنه يغطّي reCAPTCHA v2 وv3 وCloudflare Turnstile وCloudflare Challenge وGeeTest v3 واختبارات الصور وOCR والشبكات وBLS، وهي الأنواع الأكثر شيوعًا في مسارات استخراج البيانات.

متى أختار بروكسي مركز البيانات بدلًا من السكني؟

اختره حين تكون السرعة والحجم الأولوية والموقع لا يعرض CAPTCHA بكثافة، ودع CaptchaAI يحل ما يظهر. انتقل إلى السكني فقط حين يبدأ الموقع في عرض تحدٍّ على كل طلب تقريبًا.


أدلة ذات صلة


اجمع بين البنية التحتية لبروكسي Oxylabs وحل CaptchaAI — أنشئ مفتاح الـ API الخاص بك.

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