يحل 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.
مقالات ذات صلة
- Cloudflare Challenge مقابل اكتشاف Turnstile
- مقارنة Geetest وCloudflare Turnstile
- بايثون Playwright Captchaai الدليل الكامل