لقد قمت بحل اختبار 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",
}
كيفية العثور على اسم الحقل الصحيح:
- افتح علامة التبويب شبكة DevTools → للمتصفح
- أكمل تحدي Turnstile يدويًا
- ابحث عن طلب تقديم النموذج
- انظر إلى نص الطلب لاسم حقل الرمز المميز
السبب 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. حافظ على اتساق كلاهما.
أدلة ذات صلة
- CAPTCHA حل مشكلة إسقاط معدل النجاح: مخطط انسيابي للتشخيص
- البدء السريع مع CaptchaAI: حلّ أول كابتشا في 5 دقائق
إصلاح أخطاء 403 —حل Turnstile مع CaptchaAI.