Cloudflare Turnstile هو بديل CAPTCHA الأسرع نموًا. لحلها باستخدام CaptchaAI، تحتاج إلى مفتاح الموقع وعنوان URL للصفحة. يغطي هذا الدليل كل الطرق للعثور على مفتاح الموقع - بدءًا من استعلامات DOM البسيطة وحتى اعتراض استدعاءات عرض JavaScript.
حيث تعيش مفاتيح الموقع Turnstile
تظهر مفاتيح موقع Turnstile في ثلاثة أماكن:
- سمة
data-sitekeyعلى عناصر.cf-turnstile - استدعاء
turnstile.render()JavaScript - عنوان URL الخاص بـ Turnstile iframe
src
الطريقة الأولى: سمة DOM
// Browser console
document.querySelectorAll('.cf-turnstile').forEach((el, i) => {
console.log(`Turnstile ${i}:`, {
sitekey: el.getAttribute('data-sitekey'),
action: el.getAttribute('data-action'),
cData: el.getAttribute('data-cdata'),
theme: el.getAttribute('data-theme'),
});
});
بايثون (HTML ثابت)
import re
import requests
html = requests.get("https://example.com/login").text
matches = re.findall(
r'class=["\'][^"\']*cf-turnstile[^"\']*["\'][^>]*data-sitekey=["\']([^"\']+)',
html
)
for sk in matches:
print(f"Sitekey: {sk}")
بايثون (السيلينيوم)
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://example.com/login")
widgets = driver.find_elements(By.CSS_SELECTOR, ".cf-turnstile")
for w in widgets:
sitekey = w.get_attribute("data-sitekey")
action = w.get_attribute("data-action")
print(f"Sitekey: {sitekey}, Action: {action}")
الطريقة الثانية: عرض استدعاء JavaScript
تعرض بعض المواقع Turnstile برمجيًا:
turnstile.render('#captcha-container', {
sitekey: '0x4AAAAAAAB...',
callback: function(token) {
document.getElementById('cf-token').value = token;
},
});
مقتطف من مصدر الصفحة:
# Find turnstile.render calls
render_match = re.search(
r'turnstile\.render\s*\([^,]*,\s*\{([^}]+)\}',
html
)
if render_match:
config = render_match.group(1)
sk = re.search(r'sitekey\s*:\s*["\']([^"\']+)', config)
if sk:
print(f"Sitekey from render: {sk.group(1)}")
اعتراض Puppeteer
// Intercept turnstile.render before page loads
await page.evaluateOnNewDocument(() => {
window.__turnstileParams = [];
const origRender = window.turnstile?.render;
Object.defineProperty(window, 'turnstile', {
set(val) {
this._turnstile = val;
const orig = val.render;
val.render = function(container, params) {
window.__turnstileParams.push(params);
console.log('Turnstile render:', JSON.stringify(params));
return orig.apply(this, arguments);
};
},
get() { return this._turnstile; }
});
});
await page.goto('https://example.com/login', { waitUntil: 'networkidle2' });
const params = await page.evaluate(() => window.__turnstileParams);
console.log('Captured Turnstile params:', params);
الطريقة الثالثة: Iframe src
يعرض Turnstile إطار iframe. مفتاح الموقع موجود في src:
document.querySelectorAll('iframe').forEach(iframe => {
if (iframe.src.includes('challenges.cloudflare.com')) {
console.log('Turnstile iframe:', iframe.src);
const match = iframe.src.match(/sitekey=([A-Za-z0-9_-]+)/);
if (match) console.log('Sitekey:', match[1]);
}
});
حل Turnstile مع CaptchaAI
بايثون
import requests
import time
API_KEY = "YOUR_API_KEY"
SITEKEY = "0x4AAAAAAAB..."
PAGE_URL = "https://example.com/login"
# Submit
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "turnstile",
"sitekey": SITEKEY,
"pageurl": PAGE_URL,
"json": "1",
}).json()
if resp["status"] != 1:
raise Exception(f"Submit error: {resp['request']}")
task_id = resp["request"]
# Poll
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"]
print(f"Turnstile token: {token[:50]}...")
break
if result["request"] != "CAPCHA_NOT_READY":
raise Exception(f"Error: {result['request']}")
JavaScript
const axios = require('axios');
const submit = await axios.post('https://ocr.captchaai.com/in.php', null, {
params: {
key: 'YOUR_API_KEY',
method: 'turnstile',
sitekey: '0x4AAAAAAAB...',
pageurl: 'https://example.com/login',
json: 1,
}
});
const taskId = submit.data.request;
// Poll for result
let token = null;
for (let i = 0; i < 24; i++) {
await new Promise(r => setTimeout(r, 5000));
const poll = await axios.get('https://ocr.captchaai.com/res.php', {
params: { key: 'YOUR_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)}...`);
حقن الرمز
يقوم Turnstile بتخزين الرمز المميز الخاص به في إدخال مخفي يسمى cf-turnstile-response:
# Selenium
driver.execute_script("""
const input = document.querySelector('input[name="cf-turnstile-response"]');
if (input) input.value = arguments[0];
// Also set in the Turnstile widget's callback
const widget = document.querySelector('.cf-turnstile');
const callbackName = widget?.getAttribute('data-callback');
if (callbackName && typeof window[callbackName] === 'function') {
window[callbackName](arguments[0]);
}
""", token)
استكشاف الأخطاء وإصلاحها
| مشكلة | السبب | إصلاح |
|---|---|---|
لم يتم العثور على عنصر .cf-turnstile |
يتم تقديمه ديناميكيًا | انتظر تحميل الصفحة أو استخدم MutationObserver |
| مفتاح الموقع فارغ | يتم التعيين عبر JavaScript API | ابحث عن turnstile.render في البرامج النصية |
| تم رفض الرمز المميز | مفتاح الموقع أو عنوان URL للصفحة غير صحيح | تحقق مرة أخرى من تطابق القيمتين مع الموقع المستهدف |
معلمة method خاطئة |
استخدام userrecaptcha للباب الدوار |
استخدم method=turnstile |
الأسئلة الشائعة
هل حل Turnstile أصعب من حل reCAPTCHA؟
رقم CaptchaAI يتعامل مع كليهما. يتم حل Turnstile عادة خلال 10-25 ثانية، مقارنة بـ reCAPTCHA v2.
هل لدى Turnstile وضع غير مرئي؟
يحتوي Turnstile على أوضاع "مُدارة" و"غير تفاعلية" لا تعرض أداة مرئية. تعمل طرق استخراج مفتاح الموقع بنفس الطريقة.
حل اختبارات CAPTCHA Cloudflare Turnstile باستخدام CaptchaAI
احصل على مفتاح API الخاص بك علىcaptchaai.com.