القاعدة التي تحسم الأمر بسيطة: النموذج الذي يُرسل مرة واحدة يحتاج توكن، والصفحة التي تقف أمامها صفحة تحدٍّ من Cloudflare قبل مئات الطلبات تحتاج كوكي جلسة. الخلط بين المسارين هو السبب الأشهر وراء سكربت يعمل دقيقتين ثم يعود بخطأ 403.
الفارق ليس في شكل الناتج، بل في العمر وإعادة الاستخدام وعدد الخيوط التي ستدفع ثمنها.
متى تختار التوكن ومتى تختار الكوكي
- التوكن — عندما يكون الهدف إرسال نموذج: دخول، تسجيل حساب، أو استمارة حجز.
- الكوكي — عندما تقف صفحة Cloudflare Challenge أمام عشرات المسارات التي تريد قراءتها.
- المسار الهجين — عندما تحرس صفحةُ تحدٍّ نموذجاً يحمل reCAPTCHA، كما في مواقع الحجز.
الاختيار يفرضه الموقع المستهدف لا تفضيلك، فآلية التحقق لديه تقبل توكناً أو تنتظر كوكياً.
الفروق الجوهرية في جدول واحد
| الجانب | التوكن | الكوكي |
|---|---|---|
| الناتج | سلسلة نصية | كوكي مثل cf_clearance |
| الأنواع | reCAPTCHA v2/v3 وTurnstile وhCaptcha | Cloudflare Challenge وجدران WAF |
| الاستعمال | حقل مخفي أو طلب POST | مع كل طلب لاحق |
| العمر | 60–120 ثانية | 30 دقيقة إلى 24 ساعة |
| إعادة الاستخدام | مرة واحدة | طوال الجلسة |
| المتصفح | لاستخراج مفتاح الموقع | لحل التحدي |
| الارتباط | غير مرتبط بعنوان IP | بعنوان IP وبوكيل المستخدم |
مسار التوكن: من مفتاح الموقع إلى الحقل المخفي
الخدمة تعيد القيمة التي كان المتصفح سينتجها، فترسلها ضمن بيانات النموذج.
- استخرج مفتاح الموقع من مصدر الصفحة
- أرسل المفتاح وعنوان URL إلى CaptchaAI عبر
in.php - احفظ معرّف المهمة واستطلع النتيجة عبر
res.php - ضع السلسلة العائدة في الحقل المخفي
- أرسل النموذج قبل انتهاء صلاحية القيمة
أي الأنواع تعتمد على التوكن
- reCAPTCHA v2 — الحقل
g-recaptcha-response - reCAPTCHA v3 — الحقل نفسه مع
actionوenterprise=1لمواقع Enterprise - Turnstile — الحقل
cf-turnstile-response - hCaptcha — الحقل
h-captcha-response، وهو نوع غير مدعوم في CaptchaAI
مثال Python للمسار الكامل
import requests
import time
API_KEY = "YOUR_API_KEY"
# 1. Solve
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": "6Le-wvkSAAAAAPBMR...",
"pageurl": "https://example.com/login",
"json": "1",
}).json()
task_id = resp["request"]
# 2. Poll
token = None
for _ in range(24):
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"]
break
# 3. Submit form with token (no browser needed)
form_response = requests.post("https://example.com/login", data={
"email": "[email protected]",
"password": "password",
"g-recaptcha-response": token,
})
ما يجب أن تتذكره
- لا متصفح عند الإرسال — يكفي طلب POST يحمل القيمة.
- العمر قصير — احسب وقت الحل داخل مهلة الطلب، ولا تضع التوكن في قائمة انتظار.
- استخدام واحد — كل إرسال يحتاج حلاً جديداً.
- التحقق عند الطرف الآخر — الموقع يراجع القيمة لدى مزوّد الحماية.
مسار ملفات تعريف الارتباط: حلّ واحد يفتح جلسة كاملة
هنا لا تحصل على قيمة تضعها في نموذج، بل على تصريح مرور للجلسة.
- يعرض الخادم صفحة تحدٍّ — Cloudflare Challenge أو تحدي JavaScript
- يُكمل المتصفح التحدي، وقد يستخدم Turnstile داخلياً
- يضبط الخادم كوكي الجلسة
cf_clearance - تمرّ الطلبات التالية بهذا الكوكي دون إعادة عرض التحدي
أين يظهر هذا المسار
- صفحات Cloudflare Challenge — الكوكي
cf_clearance - تحدي JavaScript — تحقق دون تفاعل المستخدم
- جدران حماية التطبيقات — كوكي جلسة مكافئ بأسماء مختلفة
استخراج الكوكي ثم متابعة العمل بدون متصفح
from selenium import webdriver
import requests
import time
# 1. Solve the challenge in a browser
driver = webdriver.Chrome()
driver.get("https://example.com/protected")
# Wait for challenge to complete (manually or with CaptchaAI)
time.sleep(10) # Or use CaptchaAI token injection
# 2. Extract cookies from browser
cookies = driver.get_cookies()
cf_clearance = next(
(c for c in cookies if c["name"] == "cf_clearance"), None
)
user_agent = driver.execute_script("return navigator.userAgent")
driver.quit()
# 3. Use cookies for subsequent requests (no browser needed)
session = requests.Session()
session.headers.update({"User-Agent": user_agent})
for cookie in cookies:
session.cookies.set(cookie["name"], cookie["value"])
# All requests now pass the challenge
for page in range(1, 50):
resp = session.get(f"https://example.com/api/data?page={page}")
print(f"Page {page}: {resp.status_code}")
القيود التي تُسقط الجلسة قبل أوانها
- متصفح كامل للحل — طلب HTTP بسيط لا يُكمل صفحة التحدي.
- ارتباط بعنوان IP — استعمال الكوكي من خادم وسيط آخر يعيدك إلى التحدي.
- ارتباط بوكيل المستخدم — يبقى User-Agent مطابقاً لما استُخدم أثناء الحل.
- عمر متغيّر — بين 30 دقيقة و24 ساعة، فعامل انتهاءه كحدث متوقع.
سيناريو من السوق العربي
فريق تجارة إلكترونية في الرياض يراقب أسعار 40 صفحة فئة لدى منافسيه قبل موسم الجمعة البيضاء، والموقع خلف Cloudflare Challenge. المسار الصحيح هنا هو الكوكي: جلسة واحدة تُحل في أقل من 15 ثانية ثم تخدم مئات الطلبات حتى تنتهي صلاحيتها.
الفريق نفسه يشغّل استمارة اشتراك محمية بـ reCAPTCHA v2 تحتاج توكناً جديداً مع كل إرسال، بزمن حل معلن أقل من 60 ثانية. مشروع واحد بمسارين إذن، وخيوط المعالجة تُوزَّع بحسب أيهما يتكرر أكثر. وإذا بدّل الخادم الوسيط عنوان IP بين طلب وآخر فسيسقط الكوكي مبكراً؛ ثبّت العنوان طوال الجلسة.
مصفوفة القرار حسب حالة الاستخدام
| الحالة | المسار | السبب |
|---|---|---|
| نموذج دخول عليه reCAPTCHA | توكن | القيمة تُرسل مع النموذج |
| جمع بيانات من موقع خلف Cloudflare | كوكي | حلّ واحد لطلبات كثيرة |
| استمارة محمية بـ Turnstile | توكن | تُحقن في cf-turnstile-response |
| استدعاء API خلف Cloudflare | كوكي | الجلسة تخدم كل الاستدعاءات |
| عدة نماذج متتالية | توكن لكل إرسال | كل نموذج يحتاج قيمة جديدة |
| مسح دوري لنفس النطاق | كوكي | حلّ واحد حتى انتهاء الصلاحية |
المسار الهجين: كوكي للبوابة وتوكن للنموذج
كثير من المواقع يجمع الاثنين: صفحة تحدٍّ تحرس المسار، ونموذج داخلها يحمل reCAPTCHA. الترتيب هو كل شيء — أكمل التحدي، اقرأ الصفحة، اطلب التوكن بمفتاح الموقع المستخرج، ثم أرسل بالجلسة نفسها.
# Step 1: Get past Cloudflare (cookie)
session = get_cf_clearance_session("https://example.com")
# Step 2: Load the form (using the cookie session)
html = session.get("https://example.com/submit").text
sitekey = extract_sitekey(html)
# Step 3: Solve reCAPTCHA (token)
token = solve_recaptcha(sitekey, "https://example.com/submit")
# Step 4: Submit form (cookie + token)
resp = session.post("https://example.com/submit", data={
"data": "value",
"g-recaptcha-response": token,
})
أثر الاختيار على التكلفة
تُسعّر CaptchaAI على أساس عدد الـ Threads المتزامنة لا على عدد عمليات الحل، وكل خطة تتيح حلولاً غير محدودة ضمن خيوطها. خطة BASIC تبدأ من 15 دولاراً شهرياً مع 5 خيوط، وخطة ADVANCE عند 90 دولاراً مع 50 خيطاً.
معنى ذلك عملياً:
- مسار الكوكي يحتاج خيوطاً قليلة، فالتزامن مطلوب لحظة تجديد الجلسات فقط.
- مسار التوكن يحتاج خيوطاً بقدر عدد النماذج المرسلة في الدقيقة.
- قِس الطلبات المتزامنة فعلياً لا الإجمالي اليومي قبل ترقية الخطة.
أخطاء شائعة تُفشل الدمج
- تخزين التوكن لإعادة استخدامه في إرسال ثانٍ.
- حل التحدي على خادم ثم استعمال الكوكي من عنوان IP مختلف.
- الاستطلاع الدوري بفاصل قصير جداً على
res.phpبدل انتظار ثوانٍ.
الأسئلة الشائعة
كم يعيش التوكن قبل أن يرفضه الموقع؟
بين 60 و120 ثانية غالباً. اجعل خطوة الحل ملتصقة بخطوة الإرسال، وأعد الحل بدل إنعاش قيمة منتهية.
هل ينكسر كوكي cf_clearance إذا غيّرت الخادم الوسيط؟
نعم غالباً. الكوكي مرتبط بعنوان IP الذي أكمل التحدي وبوكيل المستخدم وقتها، فثبّت البروكسي وUser-Agent طوال الجلسة.
هل أحتاج متصفحاً كاملاً في الحالتين؟
لا. مسار التوكن يحتاج المتصفح لاستخراج مفتاح الموقع فقط، أما صفحة التحدي فتحتاج متصفحاً كاملاً أثناء الحل، ثم تكفي جلسة requests.
ماذا عن hCaptcha وGeeTest v4 في CaptchaAI؟
hCaptcha وFunCaptcha غير مدعومين، ودعم GeeTest v4 معلن بصيغة «قريباً» ولم يتوفر بعد. المتاح اليوم: عائلة reCAPTCHA وCloudflare Turnstile وCloudflare Challenge وGeeTest v3 والصور والشبكات وBLS، مع CaptchaFox وFriendly Captcha وLemin في مرحلة beta.
ابدأ التنفيذ مع CaptchaAI
أنشئ مفتاح الـ API من لوحة التحكم على captchaai.com، ثم شغّل المسارين على صفحتك وقِس أيهما أقل استهلاكاً للخيوط.