الدروس التطبيقية

حل Cloudflare Turnstile مع طلبات Python وCaptchaAI

يحل Cloudflare Turnstile محل اختبارات CAPTCHA التقليدية في ملايين مواقع الويب. يوضح لك هذا الدليل كيفية حل تحديات Turnstile باستخدام مكتبة Python's requests وواجهة برمجة تطبيقات CaptchaAI - بمعدل نجاح عالٍ.


المتطلبات الأساسية

pip install requests

أنت بحاجة إلى:

  • مفتاح CaptchaAI API منcaptchaai.com
  • عنوان URL للصفحة المستهدفة
  • مفتاح الموقع Turnstile

الخطوة 1: قم باستخراج مفتاح موقع Turnstile

import re
import requests

def extract_turnstile_sitekey(url):
    """Extract Cloudflare Turnstile sitekey from page HTML."""
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                      "AppleWebKit/537.36 Chrome/120.0.0.0",
        "Accept": "text/html,*/*;q=0.8",
        "Accept-Language": "en-US,en;q=0.9",
    }
    response = requests.get(url, headers=headers, timeout=15)

    patterns = [
        r'data-sitekey=["\']([0-9x][A-Za-z0-9_-]+)["\']',
        r"sitekey\s*:\s*['\"]([0-9x][A-Za-z0-9_-]+)['\"]",
        r"siteKey\s*[=:]\s*['\"]([0-9x][A-Za-z0-9_-]+)['\"]",
    ]

    for pattern in patterns:
        match = re.search(pattern, response.text)
        if match:
            return match.group(1)

    return None


sitekey = extract_turnstile_sitekey("https://example.com/signup")
print(f"Sitekey: {sitekey}")

الخطوة 2: أرسل إلى CaptchaAI

import requests

API_KEY = "YOUR_API_KEY"

def submit_turnstile(sitekey, page_url):
    """Submit Turnstile solving task to CaptchaAI."""
    response = requests.post("https://ocr.captchaai.com/in.php", data={
        "key": API_KEY,
        "method": "turnstile",
        "sitekey": sitekey,
        "pageurl": page_url,
        "json": 1,
    })

    data = response.json()

    if data.get("status") != 1:
        raise Exception(f"Submit failed: {data.get('request')}")

    return data["request"]


task_id = submit_turnstile("0x4AAAAAAAC3DHQhMMQ_Rxrg", "https://example.com/signup")
print(f"Task ID: {task_id}")

الخطوة 3: استطلاع النتيجة

import time

def poll_result(task_id, timeout=120):
    """Poll CaptchaAI for the solved Turnstile token."""
    start = time.time()

    while time.time() - start < timeout:
        time.sleep(5)

        result = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY,
            "action": "get",
            "id": task_id,
            "json": 1,
        }).json()

        if result.get("status") == 1:
            return result["request"]

        if result.get("request") == "ERROR_CAPTCHA_UNSOLVABLE":
            raise Exception("Turnstile could not be solved")

    raise TimeoutError("Solve timed out")


token = poll_result(task_id)
print(f"Token: {token[:50]}...")

مثال العمل الكامل

import re
import time
import requests

API_KEY = "YOUR_API_KEY"
TARGET_URL = "https://example.com/signup"


def solve_turnstile(sitekey, page_url):
    """Full Turnstile solve: submit + poll."""
    # Submit
    submit = requests.post("https://ocr.captchaai.com/in.php", data={
        "key": API_KEY,
        "method": "turnstile",
        "sitekey": sitekey,
        "pageurl": page_url,
        "json": 1,
    })

    data = submit.json()
    if data.get("status") != 1:
        raise Exception(f"Submit error: {data.get('request')}")

    task_id = data["request"]
    print(f"Task submitted: {task_id}")

    # Poll
    for _ in range(30):
        time.sleep(5)
        result = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY,
            "action": "get",
            "id": task_id,
            "json": 1,
        }).json()

        if result.get("status") == 1:
            return result["request"]

    raise TimeoutError("Solve timed out")


# --- Main flow ---
session = requests.Session()
session.headers.update({
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                  "AppleWebKit/537.36 Chrome/120.0.0.0",
    "Accept": "text/html,*/*;q=0.8",
    "Accept-Language": "en-US,en;q=0.9",
})

# 1. Get page and extract sitekey
response = session.get(TARGET_URL, timeout=15)
match = re.search(r'data-sitekey=["\']([0-9x][A-Za-z0-9_-]+)["\']', response.text)
if not match:
    raise ValueError("Turnstile sitekey not found")
sitekey = match.group(1)
print(f"Sitekey: {sitekey}")

# 2. Solve Turnstile
token = solve_turnstile(sitekey, TARGET_URL)
print(f"Token: {token[:50]}...")

# 3. Submit form with token
form_response = session.post(TARGET_URL, data={
    "cf-turnstile-response": token,
    "email": "user@example.com",
    "password": "SecurePass123",
})
print(f"Form status: {form_response.status_code}")

التعامل مع Turnstile مع معلمة العمل

تتحقق بعض المواقع من صحة معلمة action من جانب الخادم:

def solve_turnstile_with_action(sitekey, page_url, action):
    """Solve Turnstile that requires an action parameter."""
    submit = requests.post("https://ocr.captchaai.com/in.php", data={
        "key": API_KEY,
        "method": "turnstile",
        "sitekey": sitekey,
        "pageurl": page_url,
        "action": action,  # Include the action from data-action attribute
        "json": 1,
    })

    data = submit.json()
    if data.get("status") != 1:
        raise Exception(f"Submit error: {data.get('request')}")

    task_id = data["request"]

    for _ in range(30):
        time.sleep(5)
        result = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY,
            "action": "get",
            "id": task_id,
            "json": 1,
        }).json()

        if result.get("status") == 1:
            return result["request"]

    raise TimeoutError("Solve timed out")

أنماط تقديم الرمز المميز

النموذج 1: نموذج POST مع استجابة Turnstile cf

# Most common — Turnstile uses cf-turnstile-response field
response = session.post(form_url, data={
    "cf-turnstile-response": token,
    "email": "user@example.com",
})

النمط 2: واجهة برمجة تطبيقات JSON

response = session.post(api_url, json={
    "turnstileToken": token,
    "email": "user@example.com",
})

النمط 3: اسم الحقل المخصص

# Some sites rename the field — check the form HTML
response = session.post(form_url, data={
    "cf-turnstile-response": token,
    "captcha_token": token,  # Custom duplicate field
    "action": "signup",
})

فئة جاهزة للإنتاج

import re
import time
import requests

class TurnstileSolver:
    """Production-ready Turnstile solver with retry logic."""

    API_URL = "https://ocr.captchaai.com"

    def __init__(self, api_key, max_retries=3):
        self.api_key = api_key
        self.max_retries = max_retries

    def extract_sitekey(self, session, url):
        """Extract Turnstile sitekey from page."""
        response = session.get(url, timeout=15)
        match = re.search(
            r'data-sitekey=["\']([0-9x][A-Za-z0-9_-]+)["\']', response.text
        )
        return match.group(1) if match else None

    def solve(self, sitekey, page_url, action=None):
        """Solve Turnstile with retry logic. Returns token string."""
        for attempt in range(1, self.max_retries + 1):
            try:
                token = self._solve_once(sitekey, page_url, action)
                return token
            except TimeoutError:
                print(f"Attempt {attempt} timed out")
            except Exception as e:
                error_str = str(e)
                if "ERROR_ZERO_BALANCE" in error_str:
                    raise  # Don't retry billing errors
                if "ERROR_WRONG_USER_KEY" in error_str:
                    raise
                print(f"Attempt {attempt} failed: {e}")

        raise Exception(f"Failed after {self.max_retries} attempts")

    def _solve_once(self, sitekey, page_url, action=None):
        """Single solve attempt."""
        params = {
            "key": self.api_key,
            "method": "turnstile",
            "sitekey": sitekey,
            "pageurl": page_url,
            "json": 1,
        }
        if action:
            params["action"] = action

        submit = requests.post(f"{self.API_URL}/in.php", data=params, timeout=30)
        submit.raise_for_status()
        data = submit.json()

        if data.get("status") != 1:
            raise Exception(f"Submit error: {data.get('request')}")

        task_id = data["request"]

        for _ in range(30):
            time.sleep(5)
            result = requests.get(f"{self.API_URL}/res.php", params={
                "key": self.api_key,
                "action": "get",
                "id": task_id,
                "json": 1,
            }, timeout=30).json()

            if result.get("status") == 1:
                return result["request"]
            if result.get("request") == "ERROR_CAPTCHA_UNSOLVABLE":
                raise Exception("CAPTCHA unsolvable")

        raise TimeoutError("Poll timed out")


# Usage
solver = TurnstileSolver("YOUR_API_KEY")
token = solver.solve("0x4AAAAAAAC3DHQhMMQ_Rxrg", "https://example.com/signup")

استكشاف الأخطاء وإصلاحها

أعراض السبب إصلاح
تم استلام الرمز ولكن تم رفض النموذج مفتاح الموقع خاطئ أو الإجراء المفقود أعد استخراج مفتاح الموقع، وقم بتضمين الإجراء إذا كان موجودًا
"لم يتم العثور على مفتاح الموقع" تم تحميل Turnstile عبر JavaScript استخدم السيلينيوم للصفحات الديناميكية
HTTP 403 قبل الحصول على الصفحة طلب حظر Cloudflare BIC أضف رؤوس المتصفح المناسبة
يستغرق الحل أكثر من 60 ثانية ازدحام الصف عادي في أوقات الذروة، انتظر لفترة أطول
يعمل الرمز المميز مرة واحدة ثم يفشل يتطلب الموقع رمزًا مميزًا جديدًا لكل محاولة حل رمز مميز جديد لكل إرسال

الأسئلة المتداولة

ما هو معدل النجاح؟

يحقق CaptchaAI معدل نجاح بمعدل نجاح عالٍ على Cloudflare Turnstile عبر جميع أوضاع عناصر واجهة المستخدم.

كم يستغرق الحل؟

وقت الحل النموذجي هو 5-15 ثانية. Turnstile بشكل عام أسرع من reCAPTCHA.

هل وضع Turnstile مهم؟

لا. تستخدم الأوضاع المُدارة وغير التفاعلية وغير المرئية نفس استدعاء واجهة برمجة التطبيقات (API). يعالج CaptchaAI اختلافات الأوضاع داخليًا.

ماذا لو كانت الصفحة تحتوي على Turnstile وreCAPTCHA؟

غير شائع ولكنه ممكن. حدد اختبار CAPTCHA الذي يحمي النموذج الذي ترسله وقم بحل هذا النموذج. يستخدمون أسماء حقول استجابة مختلفة.


ملخص

يتطلب حل Cloudflare Turnstile باستخدام Python requests ثلاث خطوات: استخراج مفتاح الموقع من صفحة HTML، وإرساله إلىCaptchaAIباستخدام method=turnstile، واستطلاع للرمز المميز. قم بإرسال الرمز المميز كـ cf-turnstile-response في بيانات النموذج الخاص بك. يوفر CaptchaAI معدل نجاح بمعدل نجاح عالٍ في جميع أوضاع Turnstile.

مقالات ذات صلة

أدلة ذات صلة

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