استكشاف الأخطاء

Cloudflare Turnstile 403 بعد إرسال الرمز المميز: دليل الإصلاح

لقد قمت بحل اختبار Turnstile CAPTCHA وحصلت على رمز صالح، لكن الموقع المستهدف لا يزال يعرض 403 Forbidden. يغطي هذا الدليل كل الأسباب.


لماذا 403 بعد رمز صالح

السبب احتمال
ملف تعريف الارتباط cf_clearance مفقود شائع جدًا
** انتهت صلاحية الرمز ** مشترك
نقطة نهاية الإرسال خاطئة مشترك
رؤوس الطلب مفقودة معتدل
عدم تطابق عنوان IP بين الحل والإرسال معتدل
Cloudflare Challenge (ليس Turnstile) الخلط في بعض الأحيان

السبب 1: ملف تعريف الارتباط cf_clearance مفقود

يقوم Turnstile بتعيين ملفات تعريف الارتباط أثناء التحقق من الصحة. إذا لم تقم بتضمين ملفات تعريف الارتباط هذه في طلبك اللاحق، فسوف يقوم Cloudflare بحظرك.

import requests

session = requests.Session()

# Step 1: Load the page to get initial cookies
session.get("https://example.com")

# Step 2: Solve Turnstile
token = solve_turnstile(
    api_key="YOUR_API_KEY",
    sitekey="TURNSTILE_SITEKEY",
    pageurl="https://example.com",
)

# Step 3: Submit token to the validation endpoint
# This sets cf_clearance cookie
resp = session.post("https://example.com/api/verify", data={
    "cf-turnstile-response": token,
}, headers={
    "Content-Type": "application/x-www-form-urlencoded",
    "Origin": "https://example.com",
    "Referer": "https://example.com/",
})

# Step 4: Now make your actual request WITH the session cookies
resp = session.get("https://example.com/protected-page")
print(resp.status_code)  # Should be 200 now

السبب 2: انتهاء صلاحية الرمز المميز

تستمر رموز Turnstile لمدة 300 ثانية تقريبًا، ولكن استخدمها على الفور للحصول على أفضل النتائج.

import time

# Solve
start = time.time()
token = solve_turnstile(...)
solve_time = time.time() - start

# Check if token is still fresh
if solve_time > 240:  # > 4 minutes is risky
    print("Token may be too old, solving again...")
    token = solve_turnstile(...)

# Submit immediately
submit_token(token)

السبب 3: طريقة التقديم الخاطئة

تعرف على كيفية قيام الموقع بإرسال رمز Turnstile المميز:

# Some sites use a hidden form field
data = {
    "cf-turnstile-response": token,
    "username": "user",
    "password": "pass",
}

# Some sites use a custom header
headers = {
    "X-Turnstile-Token": token,
}

# Some sites use JSON body
json_data = {
    "turnstileToken": token,
    "email": "user@example.com",
}

كيفية العثور على اسم الحقل الصحيح:

  1. افتح علامة التبويب شبكة DevTools → للمتصفح
  2. أكمل تحدي Turnstile يدويًا
  3. ابحث عن طلب تقديم النموذج
  4. انظر إلى نص الطلب لاسم حقل الرمز المميز

السبب 4: الرؤوس المفقودة

يتحقق Cloudflare من رؤوس الطلبات للتأكد من اتساقها:

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Language": "en-US,en;q=0.9",
    "Origin": "https://example.com",
    "Referer": "https://example.com/login",
    "Sec-Fetch-Dest": "document",
    "Sec-Fetch-Mode": "navigate",
    "Sec-Fetch-Site": "same-origin",
}

session.headers.update(headers)

السبب 5: Cloudflare Challenge مقابل Turnstile

Turnstile وCloudflare Challenge هما نظامان مختلفان:

ميزة Turnstile Cloudflare Challenge
** القطعة ** مربع اختيار مرئي على الصفحة شاشة التحدي بملء الصفحة
طريقة CaptchaAI turnstile cloudflare_challenge
حقل الرمز cf-turnstile-response N/A (يعتمد على ملفات تعريف الارتباط)

إذا رأيت تحديًا بصفحة كاملة، فاستخدم method=cloudflare_challenge بدلاً من ذلك.


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

import requests
import time
import re


def solve_turnstile_and_access(target_url, api_key):
    """Complete flow: solve Turnstile and access protected page."""
    session = requests.Session()
    session.headers.update({
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
    })

    # Load page, get cookies and sitekey
    resp = session.get(target_url)
    match = re.search(r'data-sitekey="([^"]+)"', resp.text)
    if not match:
        raise RuntimeError("Turnstile sitekey not found")

    sitekey = match.group(1)

    # Solve via CaptchaAI
    submit_resp = requests.post("https://ocr.captchaai.com/in.php", data={
        "key": api_key,
        "method": "turnstile",
        "sitekey": sitekey,
        "pageurl": target_url,
        "json": 1,
    }, timeout=30)
    task_id = submit_resp.json()["request"]

    # Poll
    for _ in range(12):
        time.sleep(5)
        poll = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": api_key, "action": "get",
            "id": task_id, "json": 1,
        }, timeout=15)
        data = poll.json()
        if data.get("status") == 1:
            token = data["request"]
            break
    else:
        raise TimeoutError("Solve timeout")

    # Submit token using the same session
    form_resp = session.post(target_url, data={
        "cf-turnstile-response": token,
    }, headers={
        "Origin": f"https://{requests.utils.urlparse(target_url).netloc}",
        "Referer": target_url,
    })

    return session, form_resp


# Usage
session, resp = solve_turnstile_and_access(
    "https://example.com/login",
    "YOUR_API_KEY",
)
# session now has valid cookies for subsequent requests

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

المشكلة السبب الإجراء
403 على الرغم من الرمز الصالح ملفات تعريف الارتباط للجلسة مفقودة استخدم نفس الجلسة لجميع الطلبات
403 في الصفحات اللاحقة لم يتم تعيين cf_clearance يجب أن يؤدي التحقق من صحة الرمز المميز إلى إرجاع ملف تعريف الارتباط
يعمل مرة واحدة، ثم 403 انتهت صلاحية ملف تعريف الارتباط إعادة حل لملف تعريف الارتباط الطازج
دائما 403 تحدي الصفحة الكاملة، وليس Turnstile استخدم طريقة cloudflare_challenge

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

كم من الوقت يستمر cf_clearance؟

عادة من 30 دقيقة إلى 24 ساعة. إذا بدأت الطلبات اللاحقة بالفشل، فأعد حل مشكلة Turnstile.

هل أحتاج إلى وكيل لـ Turnstile؟

غالبًا لا - معدل نجاح CaptchaAI بمعدل نجاح عالٍ على Turnstile يعمل عادةً بدون وكلاء. قم بإضافة وكيل فقط إذا كان الموقع يتحقق من تناسق IP.

هل يمكنني تمرير cf_clearance إلى جلسة أخرى؟

نعم، ولكنه مرتبط بوكيل المستخدم وقد يكون مرتبطًا بعنوان IP. حافظ على اتساق كلاهما.


أدلة ذات صلة


إصلاح أخطاء 403 —حل Turnstile مع CaptchaAI.

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