عندما تضع Cloudflare إشارة على زائر مريب، فإنها تعرض صفحة تحدي بينية. بمجرد حل المشكلة، يتلقى المتصفح ملف تعريف الارتباط cf_clearance الذي يمنح الوصول للجلسة. يشرح هذا الدليل كيفية عمل تدفق التحدي وكيفية تعامل CaptchaAI معه.
كيف تعمل صفحات Cloudflare Challenge
- يطلب المستخدم صفحة محمية بواسطة Cloudflare
- تقوم Cloudflare بتقييم إشارات المخاطر (سمعة IP، والعناوين، وبصمة TLS)
- إذا تم وضع علامة عليه، فسيقوم Cloudflare بإرجاع 403 أو 503 مع صفحة تحدي JavaScript
- تقوم صفحة التحدي بإجراء عمليات فحص للمتصفح وقد تقدم أداة Turnstile
- عند النجاح، يقوم Cloudflare بتعيين
cf_clearanceوإعادة التوجيه إلى عنوان URL الأصلي - تمر الطلبات اللاحقة مع ملف تعريف الارتباط دون أي اعتراض
ملف تعريف الارتباط cf_clearance
| الملكية | التفاصيل |
|---|---|
| الاسم | cf_clearance |
| المجال | نطاق الموقع المستهدف (على سبيل المثال، .example.com) |
| المسار | / |
| مدى الحياة | عادة من 30 دقيقة إلى 24 ساعة |
| المتشعب فقط | نعم |
| آمن | نعم (HTTPS فقط) |
| SameSite | لا شيء |
يرتبط ملف تعريف الارتباط بعدة عوامل:
- عنوان IP — عادةً ما يفشل استخدام ملف تعريف الارتباط من عنوان IP مختلف
- وكيل المستخدم — يجب أن يتطابق مع UA المستخدم أثناء حل التحدي
- بصمة TLS — ترتبط بعض التكوينات بـ TLS ClientHello
أنواع التحدي
يقدم Cloudflare مستويات تحدي مختلفة:
| التحدي | رمز الاستجابة | تفاعل المستخدم | الوصف |
|---|---|---|---|
| تحدي JavaScript | 503 | لا شيء | تنفيذ JavaScript فقط |
| التحدي المدار | 403 | ربما | يقرر Cloudflare - قد يظهر Turnstile أو يمر بصمت |
| التحدي التفاعلي | 403 | نعم | يُظهر دائمًا عنصر واجهة المستخدم Turnstile |
CaptchaAI يحل جميع الأنواع الثلاثة من خلال حل Cloudflare Challenge.
الحل باستخدام CaptchaAI
بايثون
import requests
import time
API_KEY = "YOUR_API_KEY"
TARGET_URL = "https://example.com/protected-page"
# Submit Cloudflare Challenge task
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "turnstile",
"sitekey": "0x0000000000000000000000", # may be generic for CF challenge
"pageurl": TARGET_URL,
"json": "1",
}).json()
if resp["status"] != 1:
raise Exception(f"Submit error: {resp['request']}")
task_id = resp["request"]
print(f"Task ID: {task_id}")
# Poll for result
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["status"] == 1:
token = result["request"]
print(f"Token received: {token[:50]}...")
break
if result["request"] != "CAPCHA_NOT_READY":
raise Exception(f"Error: {result['request']}")
JavaScript
const axios = require('axios');
const API_KEY = 'YOUR_API_KEY';
const TARGET_URL = 'https://example.com/protected-page';
const submit = await axios.post('https://ocr.captchaai.com/in.php', null, {
params: {
key: API_KEY,
method: 'turnstile',
sitekey: '0x0000000000000000000000',
pageurl: TARGET_URL,
json: 1,
}
});
const taskId = submit.data.request;
// Poll
let token = null;
for (let i = 0; i < 30; i++) {
await new Promise(r => setTimeout(r, 5000));
const poll = await axios.get('https://ocr.captchaai.com/res.php', {
params: { key: API_KEY, action: 'get', id: taskId, json: 1 }
});
if (poll.data.status === 1) {
token = poll.data.request;
break;
}
}
console.log(`Token: ${token.substring(0, 50)}...`);
باستخدام الرمز المميز الذي تم حله
بعد الحل، أدخل الرمز المميز في صفحة التحدي للحصول على cf_clearance:
# With Selenium
from selenium import webdriver
driver = webdriver.Chrome()
driver.get(TARGET_URL) # Load the challenge page
# Inject token into Turnstile response field
driver.execute_script("""
const input = document.querySelector('input[name="cf-turnstile-response"]');
if (input) input.value = arguments[0];
// Trigger form submit or callback
const form = document.querySelector('form');
if (form) form.submit();
""", token)
# Wait for redirect and extract cookies
import time
time.sleep(3)
cookies = driver.get_cookies()
cf_clearance = next(
(c for c in cookies if c['name'] == 'cf_clearance'), None
)
if cf_clearance:
print(f"cf_clearance: {cf_clearance['value'][:30]}...")
إعادة استخدام ملف تعريف الارتباط
session = requests.Session()
session.cookies.set("cf_clearance", cf_clearance["value"], domain=".example.com")
session.headers.update({
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
})
# Now access protected pages
resp = session.get("https://example.com/api/data")
print(resp.status_code) # 200
عمر ملفات تعريف الارتباط وتحديثها
تنتهي صلاحية ملف تعريف الارتباط cf_clearance. خطة إعادة الحل:
import datetime
def is_cookie_valid(cookie):
if not cookie:
return False
expiry = cookie.get("expiry", 0)
return datetime.datetime.now().timestamp() < expiry - 60 # 60s buffer
def get_or_refresh_clearance(driver, target_url, solve_func):
cookies = driver.get_cookies()
cf = next((c for c in cookies if c["name"] == "cf_clearance"), None)
if is_cookie_valid(cf):
return cf["value"]
# Re-solve
token = solve_func(target_url)
# ... inject and extract new cookie
استكشاف الأخطاء وإصلاحها
| مشكلة | السبب | إصلاح |
|---|---|---|
| تم رفض ملف تعريف الارتباط بعد الحل | عدم تطابق IP | استخدم نفس الوكيل للحل والطلبات |
| تنتهي صلاحية ملف تعريف الارتباط بسرعة | TTL قصير تم ضبطه بواسطة الموقع | إعادة الحل قبل انتهاء الصلاحية؛ تحقق من حقل expiry |
| 403 على الرغم من ملف تعريف الارتباط الصالح | عدم تطابق وكيل المستخدم | مطابقة UA بين جلسات الحل والطلب |
| صفحة التحدي لا يتم تحميلها | تم تعطيل الJavaScript | استخدام متصفح كامل (Selenium، Puppeteer) |
الأسئلة الشائعة
هل يمكنني مشاركة cf_clearance بين الأجهزة المختلفة؟
فقط إذا كانوا يتشاركون نفس عنوان IP وتطابقت مع سلسلة وكيل المستخدم. غالبًا ما تربط Cloudflare ملف تعريف الارتباط بعنوان IP الأصلي.
كم من الوقت يستمر cf_clearance؟
عادة من 30 دقيقة إلى 24 ساعة، اعتمادًا على تكوين Cloudflare الخاص بمالك الموقع.
حل صفحات Cloudflare Challenge باستخدام CaptchaAI
احصل على مفتاح API الخاص بك علىcaptchaai.com.