تعد اختبارات CAPTCHA أكثر أدوات الحظر شيوعًا في سير عمل تجريف الويب. عندما يقدم موقع مستهدف اختبار reCAPTCHA أو Cloudflare Turnstile أو صورة CAPTCHA، تتوقف أداة الكشط الخاصة بك عن العمل. تعمل واجهة برمجة تطبيقات CaptchaAI على حل هذه التحديات تلقائيًا حتى تستمر أداة الكشط الخاصة بك في العمل.
كيف يعمل حظر CAPTCHA في عملية الكشط
تقوم مواقع الويب بتشغيل اختبارات CAPTCHA بناءً على الإشارات السلوكية:
| إشارة | المحفّز |
|---|---|
| معدل الطلب | عدد كبير جدًا من الطلبات من عنوان IP واحد |
| ملفات تعريف الارتباط مفقودة | لا توجد ملفات تعريف الارتباط للجلسة أو التفضيلات |
| رؤوس تشبه الروبوتات | Accept-Language مفقود، Referer |
| بصمة JavaScript | لم يتم اكتشاف تنفيذ JS أو متصفح بدون رأس |
| سمعة عنوان IP | تم وضع علامة IP على مركز البيانات أو الوكيل |
عند تشغيله، يعرض الموقع اختبار CAPTCHA بدلاً من محتوى الصفحة. تحتاج المكشطة الخاصة بك إلى حل المشكلة وإرسال الرمز المميز للمتابعة.
المتطلبات
| المتطلبات | التفاصيل |
|---|---|
| مفتاح CaptchaAI API | منcaptchaai.com |
| بايثون 3.7+ أو Node.js 16+ | للحصول على أمثلة التعليمات البرمجية |
requests / axios |
مكتبة عميل HTTP |
| عنوان URL للموقع المستهدف | الصفحة التي تخدم اختبار CAPTCHA |
| مفتاح موقع CAPTCHA | منقول من مصدر الصفحة |
الخطوة 1: تحديد نوع CAPTCHA
قبل الحل، حدد نوع CAPTCHA الذي يستخدمه الموقع. التحقق من مصدر الصفحة:
reCAPTCHA v2:
<div class="g-recaptcha" data-sitekey="6Le-wvkS..."></div>
reCAPTCHA v3:
<script src="https://www.google.com/recaptcha/api.js?render=6Le-wvkS..."></script>
Cloudflare Turnstile:
<div class="cf-turnstile" data-sitekey="0x4AAAAA..."></div>
يتطلب كل نوع معلمة method مختلفة عند الإرسال إلى CaptchaAI.
الخطوة 2: استخراج مفتاح الموقع
بايثون (مع الطلبات + BeautifulSoup)
from bs4 import BeautifulSoup
import requests
page = requests.get("https://example.com/protected-page", headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
})
soup = BeautifulSoup(page.text, "html.parser")
# reCAPTCHA v2
recaptcha_div = soup.find("div", class_="g-recaptcha")
if recaptcha_div:
site_key = recaptcha_div["data-sitekey"]
print(f"reCAPTCHA v2 site key: {site_key}")
Node.js (مع التشجيع)
const axios = require("axios");
const cheerio = require("cheerio");
const { data } = await axios.get("https://example.com/protected-page");
const $ = cheerio.load(data);
const siteKey = $(".g-recaptcha").attr("data-sitekey");
console.log("Site key:", siteKey);
الخطوة 3: أرسل اختبار CAPTCHA إلى CaptchaAI
بايثون
import requests
import time
API_KEY = "YOUR_API_KEY"
SITE_KEY = "6Le-wvkS..."
PAGE_URL = "https://example.com/protected-page"
# Submit
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": SITE_KEY,
"pageurl": PAGE_URL
})
if not resp.text.startswith("OK|"):
raise Exception(f"Submit error: {resp.text}")
task_id = resp.text.split("|")[1]
print(f"Task submitted: {task_id}")
# Poll for result
while True:
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY,
"action": "get",
"id": task_id
})
if result.text == "CAPCHA_NOT_READY":
continue
if result.text.startswith("OK|"):
token = result.text.split("|")[1]
print(f"Solved! Token: {token[:50]}...")
break
raise Exception(f"Solve error: {result.text}")
Node.js
const axios = require("axios");
const API_KEY = "YOUR_API_KEY";
const SITE_KEY = "6Le-wvkS...";
const PAGE_URL = "https://example.com/protected-page";
// Submit
const submitResp = await axios.get("https://ocr.captchaai.com/in.php", {
params: {
key: API_KEY,
method: "userrecaptcha",
googlekey: SITE_KEY,
pageurl: PAGE_URL,
},
});
const taskId = submitResp.data.split("|")[1];
// Poll
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
while (true) {
await sleep(5000);
const result = await axios.get("https://ocr.captchaai.com/res.php", {
params: { key: API_KEY, action: "get", id: taskId },
});
if (result.data === "CAPCHA_NOT_READY") continue;
if (result.data.startsWith("OK|")) {
const token = result.data.split("|")[1];
console.log("Token:", token.substring(0, 50));
break;
}
throw new Error(`Error: ${result.data}`);
}
الخطوة 4: أرسل الرمز المميز إلى الموقع المستهدف
بمجرد حصولك على الرمز المميز، أرسله مع بيانات النموذج التي يتوقعها الموقع:
بايثون
# Submit the solved token with the form
form_data = {
"g-recaptcha-response": token,
"username": "user@example.com",
"password": "password123"
}
response = requests.post(PAGE_URL, data=form_data, headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
})
print(f"Status: {response.status_code}")
الخطوة 5: بناء وظيفة مكشطة قابلة لإعادة الاستخدام
لف منطق الحل في وظيفة قابلة لإعادة الاستخدام:
import requests
import time
API_KEY = "YOUR_API_KEY"
def solve_captcha(site_key, page_url, method="userrecaptcha"):
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY,
"method": method,
"googlekey": site_key,
"pageurl": page_url
})
if not resp.text.startswith("OK|"):
raise Exception(resp.text)
task_id = resp.text.split("|")[1]
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get", "id": task_id
})
if result.text == "CAPCHA_NOT_READY":
continue
if result.text.startswith("OK|"):
return result.text.split("|")[1]
raise Exception(result.text)
raise TimeoutError("CAPTCHA solve timed out")
# Use in your scraper
def scrape_page(url, site_key):
token = solve_captcha(site_key, url)
response = requests.post(url, data={"g-recaptcha-response": token})
return response.text
استكشاف الأخطاء وإصلاحها
| خطأ | السبب | إصلاح |
|---|---|---|
ERROR_WRONG_USER_KEY |
مفتاح API غير صالح | تحقق من مفتاحك على لوحة معلومات captchaai.com |
ERROR_ZERO_BALANCE |
لا أموال | إضافة رصيد إلى حسابك |
ERROR_CAPTCHA_UNSOLVABLE |
لا يمكن حل التحدي | تحقق من صحة مفتاح الموقع وعنوان URL |
CAPCHA_NOT_READY (حلقات للأبد) |
حل بطيء أو معلمات خاطئة | زيادة المهلة. تحقق من تطابق مفتاح الموقع مع الصفحة |
| تم رفض الرمز المميز بواسطة الموقع | انتهت صلاحية الرمز المميز أو مفتاح موقع خاطئ | استخدم الرمز المميز خلال 120 ثانية؛ تأكيد مفتاح الموقع |
أفضل الممارسات
- تدوير وكلاء المستخدم - استخدم سلاسل وكيل المستخدم الواقعية للمتصفح
- أضف تأخيرات - يتم طلب مسافة تتراوح بين 2 إلى 5 ثوانٍ لتجنب حدود المعدل
- استخدام الوكلاء - قم بتدوير الوكلاء السكنيين لتوزيع الطلبات
- ** التعامل مع ملفات تعريف الارتباط ** - احتفظ بملفات تعريف الارتباط للجلسة عبر الطلبات
- رموز ذاكرة التخزين المؤقت - تعمل بعض الرموز المميزة لطلبات متعددة ضمن نافذة صلاحيتها
الأسئلة الشائعة
هل يعمل هذا مع المواقع المحمية بواسطة Cloudflare؟
نعم. استخدم method=turnstile لـ Turnstile CAPTCHAs أو method=cloudflare_challenge لصفحات تحدي Cloudflare الكاملة. يرىكيفية تجاوز Cloudflare Turnstile.
هل أحتاج إلى متصفح بلا رأس؟
ليس دائما. بالنسبة لعمليات إرسال النماذج البسيطة باستخدام reCAPTCHA، تعمل طلبات HTTP البسيطة. بالنسبة للمواقع التي تستخدم JavaScript بكثرة، قم بدمج CaptchaAI مع Selenium أو Puppeteer.
ما هي تكلفة كشط 10000 صفحة؟
وفقًا لأسعار CaptchaAI، فإن حل 10000 من تحديات reCAPTCHA v2 يكلف حوالي 10 دولارات. تعتبر اختبارات CAPTCHA للصور أرخص.
هل يمكنني حل اختبارات CAPTCHA بالتوازي؟
نعم. إرسال مهام متعددة في وقت واحد والاستطلاع لكل نتيجة. يرىحل اختبارات CAPTCHA المتعددة بالتوازي.