يتلخّص التعامل مع reCAPTCHA v2 أثناء استخراج البيانات في حلقة من أربع خطوات: التقط مفتاح الموقع وعنوان الصفحة، أرسلهما إلى خدمة حل مثل CaptchaAI، انتظر الرمز المحلول، ثم احقنه في حقل g-recaptcha-response وأكمل الطلب. ما إن تُتقن هذه الحلقة حتى يصبح أي موقع محمي بـ reCAPTCHA v2 قابلاً للأتمتة دون تدخل بشري.
يغطي هذا الدليل الحلقة كاملةً بأمثلة تعمل فعلياً: Python مع Selenium وrequests، وNode.js مع Puppeteer، إضافةً إلى نهج HTTP خالص بلا متصفح. كما يتناول استخراج مفتاح الموقع، وإدارة التزامن على نطاق واسع، والتعامل مع الأخطاء الشائعة.
لماذا يعترض reCAPTCHA v2 عمليات الاستخراج
يقيّم reCAPTCHA v2 سلوك الزائر قبل تقديم المحتوى: حركة المؤشر، وبصمة المتصفح، وسمعة عنوان IP. حين يشكّ في أن الطلب آلي، يعرض مربع اختيار «لست روبوتاً» أو شبكة صور يجب حلّها. وطالما بقي التحدي دون حل، تحجب الواجهة الخلفية البيانات التي تحتاجها أداة الاستخراج.
النقطة الجوهرية هنا أن الموقع لا يتحقق من نقرة المستخدم مباشرةً، بل من رمز (توكن) توقّعه Google بعد الحل الناجح. هذا يعني أنك لست مضطراً إلى محاكاة النقر أو تحليل الصور بنفسك؛ يكفي أن تحصل على رمز صالح مرتبط بمفتاح الموقع وعنوان الصفحة نفسها، ثم تسلّمه للنموذج. وهذا بالضبط ما تفعله خدمة الحل نيابةً عنك.
المعلمتان اللتان تحتاجهما حلقة الحل
تحتوي كل أداة reCAPTCHA v2 على معلمتين لا غنى عنهما لسكربت الاستخراج:
googlekey— مفتاح الموقع العام المضمَّن في صفحة HTMLpageurl— عنوان URL الذي يظهر فيه اختبار CAPTCHA
يرسل سكربت الاستخراج هاتين القيمتين إلى CaptchaAI API، وينتظر رمزاً محلولاً، ثم يحقن الرمز في حقل g-recaptcha-response داخل الصفحة أو يستدعي دالة رد النداء. بعدها تتحقق الواجهة الخلفية للموقع المستهدف من الرمز لدى Google وتسمح للطلب بالمرور. الحلقة كلها إذن: إرسال ← استطلاع دوري للنتيجة ← حقن الرمز ← إتمام الطلب.
كيف تستخرج مفتاح الموقع (sitekey)
قبل أي إرسال تحتاج إلى قيمة مفتاح الموقع. توجد عادةً في السمة data-sitekey داخل عنصر .g-recaptcha، أو ضمن معلمة k= في رابط سكربت reCAPTCHA. مع متصفح مؤتمت مثل Selenium أو Puppeteer يمكنك قراءتها مباشرةً من DOM بعد تحميل الصفحة. أما في نهج HTTP الخالص فتلتقطها من مصدر HTML عبر تعبير نمطي بسيط أو بمحلل للصفحة. القيمة ثابتة لكل موقع، لذا يمكنك تخزينها وإعادة استخدامها عبر الطلبات بدل استخراجها في كل مرة.
أي أسلوب تكامل تختار؟
الأساليب الثلاثة في هذا الدليل تخدم حالات مختلفة، وينبغي أن يقود اختيارك طبيعةُ الموقع المستهدف لا التعوّد. تلخّص المقارنة التالية متى يناسبك كل منها:
الجدول التالي يستند إلى أنماط تكامل مرصودة، وقد تختلف الحالة المثلى بحسب بنية الموقع وحجم العمل وبيئة التشغيل.
| الأسلوب | الأنسب لـ | يحتاج متصفحاً؟ |
|---|---|---|
| Selenium مع Python | صفحات تعتمد على JavaScript ورد النداء | نعم |
| Puppeteer مع Node.js | أتمتة حديثة مع تحكم دقيق بالمتصفح | نعم |
| HTTP فقط | نماذج تقبل الرمز عبر POST مباشرةً | لا |
Python: السيلينيوم مع CaptchaAI
يفتح المثال التالي الصفحة عبر Selenium، ويستخرج مفتاح الموقع، ويرسله إلى CaptchaAI، ثم يستطلع النتيجة دورياً ويحقن الرمز — مع التقاط دالة رد النداء إن وُجدت:
import requests
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
# Step 1: Open the page with Selenium
driver = webdriver.Chrome()
driver.get("https://example.com/protected-page")
# Step 2: Extract the sitekey
sitekey = driver.find_element(By.CSS_SELECTOR, ".g-recaptcha").get_attribute("data-sitekey")
page_url = driver.current_url
# Step 3: Submit to CaptchaAI
response = requests.get("https://ocr.captchaai.com/in.php", params={
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": page_url,
"json": 1
}).json()
task_id = response["request"]
# Step 4: Poll for result
token = None
for _ in range(40):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": "YOUR_API_KEY",
"action": "get",
"id": task_id,
"json": 1
}).json()
if result.get("status") == 1:
token = result["request"]
break
if result.get("request") != "CAPCHA_NOT_READY":
raise RuntimeError(f"Solve failed: {result['request']}")
# Step 5: Inject the token and submit
driver.execute_script(
f'document.getElementById("g-recaptcha-response").innerHTML = "{token}";'
)
# Check for callback
callback = driver.execute_script(
'var el = document.querySelector(".g-recaptcha"); '
'return el ? el.getAttribute("data-callback") : null;'
)
if callback:
driver.execute_script(f'{callback}("{token}");')
else:
driver.find_element(By.CSS_SELECTOR, "form").submit()
# Step 6: Scrape the data
print(driver.page_source[:500])
driver.quit()
Node.js: Puppeteer مع CaptchaAI
يكرّر إصدار Node.js المنطق نفسه داخل Puppeteer، مع انتظار اكتمال التنقل بعد إرسال النموذج:
const puppeteer = require("puppeteer");
async function scrapeWithCaptcha(url) {
const browser = await puppeteer.launch({ headless: "new" });
const page = await browser.newPage();
await page.goto(url, { waitUntil: "networkidle2" });
// Extract sitekey
const sitekey = await page.$eval(".g-recaptcha", (el) => el.dataset.sitekey);
// Submit to CaptchaAI
const submitRes = await fetch(
`https://ocr.captchaai.com/in.php?${new URLSearchParams({
key: "YOUR_API_KEY",
method: "userrecaptcha",
googlekey: sitekey,
pageurl: url,
json: 1,
})}`
);
const { request: taskId } = await submitRes.json();
// Poll for result
let token;
for (let i = 0; i < 40; i++) {
await new Promise((r) => setTimeout(r, 5000));
const res = await fetch(
`https://ocr.captchaai.com/res.php?${new URLSearchParams({
key: "YOUR_API_KEY",
action: "get",
id: taskId,
json: 1,
})}`
);
const data = await res.json();
if (data.status === 1) {
token = data.request;
break;
}
if (data.request !== "CAPCHA_NOT_READY")
throw new Error(`Solve failed: ${data.request}`);
}
// Inject token
await page.evaluate((t) => {
document.getElementById("g-recaptcha-response").innerHTML = t;
const cb = document.querySelector(".g-recaptcha")?.dataset.callback;
if (cb && window[cb]) window[cb](t);
}, token);
// Wait for navigation after form submit
await page.waitForNavigation({ waitUntil: "networkidle2" });
const content = await page.content();
await browser.close();
return content;
}
scrapeWithCaptcha("https://example.com/protected-page").then(console.log);
نهج HTTP فقط دون متصفح
إذا كان الموقع المستهدف يرسل اختبار CAPTCHA ضمن تدفق إرسال نموذج بسيط، فيمكنك الاستغناء عن المتصفح كلياً وتوفير الذاكرة والوقت. حمّل الصفحة أولاً للحصول على ملفات تعريف الارتباط، ثم حل الكابتشا وأرسل الرمز مع بيانات النموذج:
import requests
import time
session = requests.Session()
session.headers["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0"
# Load the page to get cookies
session.get("https://example.com/protected-page")
# Solve the CAPTCHA
sitekey = "6Le-wvkSAAAAAN..." # extracted from page HTML
solve_resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": "YOUR_API_KEY", "method": "userrecaptcha",
"googlekey": sitekey, "pageurl": "https://example.com/protected-page",
"json": 1
}).json()
task_id = solve_resp["request"]
time.sleep(15)
# Poll
for _ in range(30):
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": "YOUR_API_KEY", "action": "get", "id": task_id, "json": 1
}).json()
if result.get("status") == 1:
token = result["request"]
break
time.sleep(5)
# Submit with token
resp = session.post("https://example.com/protected-page", data={
"g-recaptcha-response": token,
"other_field": "value"
})
print(resp.text[:500])
هذا النهج أسرع وأخف بكثير، لكنه يصلح فقط حين لا يعتمد الموقع على حقن رمز عبر JavaScript.
عندما يُحجب المتصفح قبل ظهور التحدي
تكتشف بعض المواقع المتصفحات العاملة بلا واجهة رسومية (headless) وتحجبها قبل ظهور اختبار CAPTCHA أصلاً. إذا اعتُرض طلبك في هذه المرحلة المبكرة، فالمشكلة في بصمة المتصفح لا في الحل نفسه، وتعالجها بالخطوات التالية:
- استخدم
headless: "new"في Puppeteer للاستفادة من وضع التخفي الأحدث - أضف
--disable-blink-features=AutomationControlledإلى إعدادات Chromium - مرّر سلسلة User-Agent واقعية بدل القيمة الافتراضية
- وزّع البصمة عبر تدوير الخادم الوسيط (البروكسي) مع كل دفعة
الهدف أن تبدو الجلسة كزيارة متصفح حقيقية حتى تصل إلى مرحلة التحدي، حيث تتكفّل خدمة الحل بالباقي.
التوسّع والتزامن حسب عدد المسارات (threads)
يستغرق حل reCAPTCHA v2 الواحد بين 15 و60 ثانية، وهو زمن لا يُذكر لصفحة واحدة لكنه يتراكم عبر آلاف الصفحات. الحل هو التزامن: تشغيل عدة عمليات حل بالتوازي بدل تسلسلها.
يعتمد CaptchaAI نموذج تسعير قائماً على المسارات (threads) لا على عدد عمليات الحل: كل مسار يمثل عملية حل واحدة قيد التنفيذ، وحين تنتهي يلتقط المسار المهمة التالية فوراً، مع عمليات حل غير محدودة طوال الشهر. تبدأ باقة BASIC من 15 دولاراً شهرياً بخمسة مسارات، وتمنحك STANDARD بـ30 دولاراً خمسة عشر مساراً، بينما توفّر ADVANCE بـ90 دولاراً خمسين مساراً متزامناً. الأسعار بالدولار الأمريكي وثابتة بصرف النظر عن نوع الكابتشا.
مثال تطبيقي: لنفترض أن فريقاً في القاهرة أو الرياض يراقب أسعار المنافسين على متجر تجزئة إقليمي محمي بـ reCAPTCHA v2، ويحتاج إلى مسح 5,000 صفحة منتج يومياً. بزمن حل متوسط قدره 30 ثانية للصفحة، تستغرق المعالجة التسلسلية أكثر من 40 ساعة — أطول من اليوم نفسه. أما مع باقة تمنح 50 مساراً متزامناً فتنخفض المدة نظرياً إلى أقل من ساعة، فيكتمل المسح ضمن نافذة تشغيل ليلية واحدة. اضبط عدد المسارات على حجم عملك الفعلي، وخصّص خوادم وسيطة لطلبات الاستخراج التي تلي الحل.
الأسئلة الشائعة
كم تبلغ تكلفة حل reCAPTCHA v2 على نطاق واسع؟
يعتمد الحساب على عدد المسارات المتزامنة لا على عدد عمليات الحل. تبدأ BASIC من 15 دولاراً شهرياً بخمسة مسارات مع عمليات حل غير محدودة، وتتوسّع الباقات حتى ADVANCE بـ90 دولاراً و50 مساراً وما فوقها لأحمال العمل الأكبر. اختر الباقة بحسب التزامن الذي يتطلبه حجمك، لا بحسب عدد الصفحات.
كيف أتعامل مع فشل الحل والمهلات؟
اضبط منطق إعادة المحاولة على النحو التالي:
- أعِد المحاولة عند تلقّي الحالة
CAPCHA_NOT_READYأثناء الاستطلاع الدوري - أوقف المحاولات فوراً عند أي رمز خطأ آخر بدل الانتظار بلا طائل
- اضبط حداً أقصى للمحاولات كما في الأمثلة أعلاه
- سجّل الأخطاء لتمييز مشكلات مفتاح الموقع عن نقص الرصيد
بهذا تميّز الأعطال العابرة من الأعطال الدائمة، وتراجع دليل الأخطاء الشائعة أسفل الصفحة لمعالجة الرموز الأكثر تكراراً.
هل أحتاج فعلاً إلى متصفح؟
ليس دائماً. إذا قبل الموقع حقل g-recaptcha-response ضمن طلب POST، فنهج HTTP الخالص أسرع وأوفر للموارد. أما إذا اعتمد التحقق على حقن رمز عبر JavaScript أو على دالة رد النداء، فستحتاج إلى متصفح مؤتمت مثل Selenium أو Puppeteer.
هل يختلف سير العمل مع reCAPTCHA v3؟
نعم في التقييم لا في البنية. يعتمد reCAPTCHA v3 على درجة ثقة خفية بدل مربع اختيار مرئي، لكن حلقة الإرسال والاستطلاع والحقن تبقى نفسها. الفرق أن v3 يُرجِع درجة قد يرفضها الموقع رغم صحة الرمز، لذا راقب معدل القبول لا الحل وحده. ولا تُخزِّن الرموز في الحالتين: كل رمز يُستخدم مرة واحدة وينتهي خلال دقيقتين تقريباً.
ماذا لو استخدم الموقع reCAPTCHA Enterprise؟
أضف enterprise=1 إلى طلبك في CaptchaAI ليتعامل مع مفاتيح Enterprise، وتبقى بقية الحلقة كما هي — الإرسال والاستطلاع والحقن. للتفاصيل الكاملة اطّلع على حل reCAPTCHA v2 Enterprise عبر API.
ابدأ الآن مع reCAPTCHA v2
- أنشئ مفتاح API من captchaai.com/api.php
- استخرج مفتاح الموقع من الصفحة المستهدفة
- استخدم أمثلة Python أو Node.js أعلاه للحل والحقن
- وسّع عبر عمليات الحل المتزامنة لأحمال العمل الكبيرة