CaptchaNo
[ التكامل ]

أداة حل الكابتشا لـ
Scrapy

حلّ التحدي داخل التشغيل بدلًا من إفشال المهمة. مثال عملي بلغة ⁦Python⁩، والعوامل الثلاثة التي تحدد قبول الرمز token.

Scrapy · Python
# middlewares.py
import time
import requests

CAPTCHANO_KEY = "cn-YOUR_API_KEY"
HEADERS = {"Authorization": f"Bearer {CAPTCHANO_KEY}"}

def solve(task: dict) -> dict:
    """Block until solved; returns e.g. {"token": "...", "userAgent": "..."}."""
    r = requests.post(
        "https://api.captchano.com/v1/solve",
        params={"wait": 60},
        json=task,
        headers=HEADERS,
        timeout=75,
    )
    data = r.json()
    # A solve can outlast the 60 s wait: poll the task until it finishes.
    while data.get("status") in ("queued", "solving"):
        time.sleep(5)
        data = requests.get(
            f"https://api.captchano.com/v1/task/{data['id']}",
            headers=HEADERS,
            timeout=30,
        ).json()
    if data.get("status") != "ready":
        raise RuntimeError(data.get("error") or data)
    return data["solution"]

class CaptchaNoMiddleware:
    def process_response(self, request, response, spider):
        sitekey = response.css("[data-sitekey]::attr(data-sitekey)").get()
        if not sitekey:
            return response
        solution = solve({"type": "recaptcha_v2", "sitekey": sitekey, "url": response.url})
        return request.replace(
            method="POST",
            body=f"g-recaptcha-response={solution['token']}",
            headers={"Content-Type": "application/x-www-form-urlencoded"},
            dont_filter=True,
        )

ما الذي يحدد قبول الرمز token

  1. مرّر البروكسي الخاص بك. يجب أن يُنشأ الرمز token خلف عنوان IP الخروج نفسه الذي يرسله. وفي الأنظمة التي تقيّم الجلسة، يكون هذا إلزاميًا، وليس مجرد تحسين.
  2. طابِق وكيل المستخدم. يربط Turnstile وعدة أنظمة حماية من الروبوتات الرمز token بوكيل مستخدم. نُعيد لك الوكيل المستخدَم كي تعيد استخدامه كما هو تمامًا.
  3. اطلب متأخرًا. تنتهي صلاحية الرموز token خلال 120 ثانية تقريبًا. اطلب رمزًا عندما تكون مستعدًا للإرسال.

الانتظار المتزامن أم الاستطلاع الدوري

يستخدم المثال ?wait=60، فيُعيد الاستدعاء عملية الحل مكتملة وتبقى خطوة ⁦Scrapy⁩ لديك خطية. وإن كنت تفضّل عدم إبقاء الاتصال مفتوحًا، فاحذف المعامل، واحتفظ بالمعرّف id المُعاد، واستطلع GET /v1/task/{id} كل خمس ثوانٍ. يبقى الرمز token الذي دفعت ثمنه قابلًا للاسترجاع لمدة عشر دقائق، لذا فإن انقطاع الاتصال لا يُفقدك عملية الحل.

التكلفة

⁦$0.00598⁩ لكل عملية حل ناجحة لـ reCAPTCHA v2، ولا تُحتسب عمليات الحل الفاشلة أبدًا. راجع الأسعار لكل أنواع التحديات، أو مرجع API للاطلاع على شكل الطلب الكامل.

[ موقعه في سير العمل ]

كيف تندمج عملية الحل في ⁦Scrapy⁩

لا يحتوي Scrapy على متصفح، لذا تُعالج الكابتشا في downloader middleware: اكتشف التحدي في الاستجابة، وحلّه، ثم أعد الطلب مع الرمز token أو ملف cookie.

  1. 01
    الاكتشاف في process_response

    ابحث عن data-sitekey أو صفحة تحدٍّ معروفة في جسم الاستجابة.

  2. 02
    الحل

    استدعِ API مع sitekey وresponse.url والبروكسي من request.meta.

  3. 03
    إعادة المحاولة مع الرمز token

    أعِد FormRequest يحمل الرمز token، أو الطلب الأصلي مع ملف cookie الناتج عن الحل.

  4. 04
    احتفظ بمخزن ملفات cookie

    دع cookie middleware في Scrapy يحتفظ بالجلسة المجتازة للطلبات التالية.

إدراج الرمز token في الصفحة

تضيف الـ middleware الرمز token إلى بيانات النموذج أو تضبط ملف cookie المُعاد، ثم تُعيد Request جديدًا.

[ المزالق ]

أين تخطئ عمليات التكامل عادةً

حجب الـ reactor

استدعاء HTTP متزامن داخل middleware يعطّل كل الطلبات. استخدم عميلًا غير متزامن أو خيط تنفيذ (thread) منفصلًا لعملية الحل.

تدوير البروكسي

إذا كانت proxy middleware تدوّر عناوين IP مع كل طلب، فثبّت عنوان IP لإعادة المحاولة كي يطابق طلب الحل.

حلقات إعادة المحاولة

حدّد سقفًا لإعادة المحاولة لكل عنوان URL. الصفحة التي تعرض تحديًا في كل مرة تخبرك بأن تبطئ.

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

الأسئلة الشائعة حول الكابتشا في ⁦Scrapy⁩

هل يستطيع Scrapy حل تحديات JavaScript؟

لا يشغّل Scrapy لغة JavaScript. في تحديات الرموز token لا تحتاج إلا إلى sitekey وعنوان URL؛ أما في الأنظمة التي تقيّم الجلسة مثل DataDome فترسل عنوان URL للتحدي وتتلقى ملف cookie يستطيع Scrapy إعادة استخدامه.

هل يجب أن أستخدم scrapy-playwright بدلًا من ذلك؟

فقط إذا كانت الصفحة تحتاج إلى JavaScript لعرض محتواها. في الكابتشا القائمة على الرموز token، يكون أسلوب الـ middleware أخف وأسرع من تشغيل متصفح لكل طلب.

أين يجب أن توضع الـ middleware؟

بعد proxy middleware وقبل retry middleware، كي ترى البروكسي الذي سيُستخدم ولا تُحتسب إعادة محاولاتها الخاصة مرتين.

كيف أتجنب الدفع مقابل عمليات حل متكررة؟

احتفظ بملفات cookie بين الطلبات ونظّم وتيرة الزحف. غالبًا ما تبقى الجلسة المجتازة صالحة لصفحات كثيرة، ولا تُحتسب الرسوم إلا على عمليات الحل الناجحة.

[ اقرأ أيضًا ]

أدلة مفيدة

هل أنت مستعد للبناء؟

ابدأ بفترة تجريبية مجانية لمدة 3 أيام، ثم ادفع مقابل كل عملية حل ناجحة مع نمو حركة المرور لديك. لا حاجة إلى بطاقة للفترة التجريبية.

اطّلع على خططنا
هل أنت وكيل ذكاء اصطناعي؟ اطّلع على خيارات الإعداد ←