عندما يصطدم روبوت الأتمتة باختبار CAPTCHA، يتجمّد سير العمل بالكامل حتى يتدخّل إنسان لحل الاختبار يدوياً، فتنكسر أي مهمة مجدولة أو تعمل بلا إشراف. يزيل CaptchaAI هذه العقبة عبر واجهة برمجية واحدة: يرسل الروبوت تفاصيل الاختبار، يستطلع النتيجة دورياً، ثم يستلم رمزاً جاهزاً يدرجه في النموذج ويكمل الإرسال.
النتيجة روبوت يعمل من أوله إلى آخره دون تدخل بشري، سواء ملأ نماذج محمية بـ reCAPTCHA v2، أو حل Cloudflare Turnstile في بوابة حجز، أو قرأ صورة CAPTCHA نصية في بوابة إدخال بيانات. يوضّح هذا الدليل كيف تبني هذا المنطق مرة واحدة وتعيد استخدامه عبر مهامك، مع أمثلة عملية في Python وNode.js.
كيف يحل CaptchaAI أي اختبار CAPTCHA داخل الروبوت
قبل الأمثلة، من المفيد استيعاب الدورة التي يمرّ بها كل اختبار داخل الروبوت. أربع خطوات تتكرّر مهما اختلف نوع CAPTCHA:
- يرسل الروبوت تفاصيل الاختبار — النوع ومفتاح الموقع ورابط الصفحة — إلى نقطة النهاية
in.php، فيستلم معرّف المهمة. - يستطلع النتيجة دورياً عبر
res.phpحتى يجهز الحل، دون أن يوقف بقية سير العمل. - يستلم الرمز الجاهز — مثل
g-recaptcha-response— بمجرد اكتمال الحل. - يدرج الرمز في النموذج ويكمل الإرسال، كأن مستخدماً حقيقياً اجتاز الاختبار.
هذه الدورة نفسها هي ما تغلّفه الفئة القابلة لإعادة الاستخدام أدناه، فلا تكرّرها في كل مهمة.
سيناريوهات شائعة لأتمتة الروبوتات وحل CAPTCHA
يختلف نوع CAPTCHA باختلاف المهمة. يلخّص الجدول أكثر السيناريوهات تكراراً وطريقة CaptchaAI المناسبة لكل منها:
| السيناريو | نوع CAPTCHA الشائع | طريقة CaptchaAI |
|---|---|---|
| تقديم النموذج | reCAPTCHA v2 | method=userrecaptcha |
| تسجيل الحساب | reCAPTCHA v2/v3 | method=userrecaptcha |
| بوابات إدخال البيانات | صورة التحقق | method=base64 |
| الحجز أو أنظمة المواعيد | Cloudflare Turnstile | method=turnstile |
| الوصول إلى بوابة API | Cloudflare Challenge | method=cloudflare_challenge |
بناء إطار موحّد لحل CAPTCHA في روبوتات الأتمتة
بدل تكرار منطق الإرسال والاستطلاع، ابنِ فئة قابلة لإعادة الاستخدام. تُرسل الفئة التالية أي اختبار إلى in.php، تنتظر الحل عبر res.php، ثم تعيد الرمز:
import requests
import time
import logging
logger = logging.getLogger(__name__)
class CaptchaBot:
def __init__(self, api_key):
self.api_key = api_key
self.session = requests.Session()
self.session.headers.update({
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
})
def solve(self, method, **params):
"""Solve any CAPTCHA type."""
params["key"] = self.api_key
params["method"] = method
resp = requests.get("https://ocr.captchaai.com/in.php", params=params)
if not resp.text.startswith("OK|"):
raise Exception(f"Submit error: {resp.text}")
task_id = resp.text.split("|")[1]
logger.info(f"Task submitted: {task_id}")
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": self.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(f"Error: {result.text}")
raise TimeoutError("CAPTCHA solve timed out")
def submit_form(self, url, form_data, captcha_field="g-recaptcha-response",
site_key=None, captcha_method="userrecaptcha"):
"""Submit a form with CAPTCHA solving."""
if site_key:
if captcha_method == "userrecaptcha":
token = self.solve(captcha_method, googlekey=site_key, pageurl=url)
elif captcha_method == "turnstile":
token = self.solve(captcha_method, sitekey=site_key, pageurl=url)
form_data[captcha_field] = token
return self.session.post(url, data=form_data)
مثال: روبوت لإرسال النماذج
مع هذه الفئة، يتقلّص إرسال نموذج محمي بـ reCAPTCHA إلى استدعاء واحد: مرّر رابط الصفحة وبياناته ومفتاح الموقع، ويتكفّل الروبوت بالباقي:
bot = CaptchaBot("YOUR_API_KEY")
# Submit a contact form protected by reCAPTCHA
result = bot.submit_form(
url="https://example.com/contact",
form_data={
"name": "John Doe",
"email": "john@example.com",
"message": "Inquiry about your service"
},
site_key="6Le-wvkS...",
captcha_method="userrecaptcha"
)
print(f"Form submitted: {result.status_code}")
مثال: روبوت حجز بخطوات متعددة
تمرّ بعض المهام بعدة صفحات قبل بلوغ CAPTCHA. تخيّل فريق متجر إلكتروني بالمنطقة يختبر نظام حجز المواعيد قبل موسم ذروة مثل الجمعة البيضاء: يحمّل صفحة الحجز، يختار الموعد، ثم يحل CAPTCHA عند الإتمام — ضمن بيئة يملكها ويصرّح باختبارها. ويجمعها المثال التالي في تدفّق واحد:
def appointment_booking_bot(date, time_slot, user_info):
bot = CaptchaBot("YOUR_API_KEY")
# Step 1: Load booking page
page = bot.session.get("https://example.com/book")
# Step 2: Select date and time
resp = bot.session.post("https://example.com/book/select", data={
"date": date,
"time": time_slot
})
# Step 3: Fill personal info with CAPTCHA
result = bot.submit_form(
url="https://example.com/book/confirm",
form_data={
"name": user_info["name"],
"email": user_info["email"],
"phone": user_info["phone"],
"date": date,
"time": time_slot
},
site_key="6Le-wvkS...",
captcha_method="userrecaptcha"
)
return result.status_code == 200
# Run
success = appointment_booking_bot(
date="2025-02-15",
time_slot="10:00",
user_info={"name": "John Doe", "email": "john@example.com", "phone": "555-0100"}
)
مثال: روبوت إدخال بيانات مع صورة CAPTCHA
تعتمد بوابات إدخال البيانات القديمة على صور CAPTCHA نصية. ينزّل الروبوت الصورة، يحوّلها إلى base64، يرسلها للحل، ثم يدرج النص مع كل سجل، مع تأخير عشوائي لتوزيع الطلبات:
import base64
def data_entry_bot(entries, captcha_image_url):
bot = CaptchaBot("YOUR_API_KEY")
for entry in entries:
# Load the form page
page = bot.session.get("https://portal.example.com/entry")
# Download and solve image CAPTCHA
img = bot.session.get(captcha_image_url)
img_b64 = base64.b64encode(img.content).decode()
captcha_text = bot.solve("base64", body=img_b64)
# Submit entry
resp = bot.session.post("https://portal.example.com/entry", data={
**entry,
"captcha": captcha_text
})
logger.info(f"Entry submitted: {resp.status_code}")
time.sleep(random.uniform(2, 5))
إطار العمل نفسه في Node.js
إن كان روبوتك مبنياً على Node.js، فالمنطق ذاته: فئة تُرسل الاختبار وتستطلع النتيجة عبر Axios وتعيد الرمز:
const axios = require("axios");
class CaptchaBot {
constructor(apiKey) {
this.apiKey = apiKey;
}
async solve(method, params) {
params.key = this.apiKey;
params.method = method;
const submit = await axios.get("https://ocr.captchaai.com/in.php", {
params,
});
const taskId = submit.data.split("|")[1];
while (true) {
await new Promise((r) => setTimeout(r, 5000));
const result = await axios.get("https://ocr.captchaai.com/res.php", {
params: { key: this.apiKey, action: "get", id: taskId },
});
if (result.data === "CAPCHA_NOT_READY") continue;
if (result.data.startsWith("OK|")) return result.data.split("|")[1];
throw new Error(result.data);
}
}
async submitForm(url, formData, siteKey, method = "userrecaptcha") {
const token = await this.solve(method, {
googlekey: siteKey,
pageurl: url,
});
formData["g-recaptcha-response"] = token;
return axios.post(url, new URLSearchParams(formData));
}
}
// Usage
const bot = new CaptchaBot("YOUR_API_KEY");
const result = await bot.submitForm(
"https://example.com/submit",
{ name: "John", email: "john@example.com" },
"6Le-wvkS..."
);
أنواع CAPTCHA التي يدعمها CaptchaAI فعلياً
قبل أن تبني الروبوت حول نوع معيّن، تأكّد أنه ضمن الأنواع المغطّاة. يتعامل CaptchaAI مع:
- reCAPTCHA بكل إصداراتها: v2 وv3 وreCAPTCHA Enterprise.
- Cloudflare Turnstile وCloudflare Challenge.
- GeeTest v3.
- صور CAPTCHA النصية والشبكات الصورية (grid).
- BLS CAPTCHA.
أما hCaptcha وFunCaptcha فغير مدعومَين حتى الآن، لذا صمّم الروبوت حول الأنواع المدعومة فعلياً بدل الاعتماد على نوع لن يجد له حلاً.
معالجة الأعطال الشائعة
يربط الجدول أبرز المشكلات المتكررة عند التشغيل على نطاق واسع بسببها والإجراء المناسب:
| المشكلة | السبب المحتمل | الإجراء |
|---|---|---|
| رفض رمز CAPTCHA | انتهت صلاحية الرمز قبل إرساله | استخدم الرمز خلال 120 ثانية من الحل |
| اكتشاف النظام للروبوت رغم صحة الرمز | بصمة المتصفح أو نمط الطلبات | أضف رؤوس HTTP واقعية وتأخيرات بين الطلبات |
| فشل الإرسال بسبب نقص الحقول | حقول مخفية مثل رمز CSRF | افحص مصدر النموذج وأدرج جميع الحقول المخفية |
| حظر بسبب معدل الطلبات | كثرة الطلبات من العنوان نفسه | أضف تأخيرات عشوائية ودوّر الخوادم الوسيطة |
نصائح لتشغيل الروبوت بثبات على نطاق واسع
يتحوّل السكربت الذي ينجح مرة واحدة إلى روبوت موثوق عند مراعاة بضع قواعد تشغيلية:
- استخدم الرمز خلال 120 ثانية من الحل قبل انتهاء صلاحيته لدى الموقع الهدف.
- وزّع الطلبات بتأخيرات عشوائية ودوّر الخوادم الوسيطة لتفادي تحديد معدل الطلبات.
- أضف رؤوس HTTP واقعية حتى تبدو حركة الروبوت أقرب إلى جلسة متصفح حقيقية.
- افحص مصدر كل نموذج وأدرج الحقول المخفية مثل رمز CSRF قبل الإرسال.
- شغّل الروبوت ضمن بيئة تملكها أو صرّح باختبارها، والتزم بشروط استخدام المواقع.
الأسئلة الشائعة
ما أنواع CAPTCHA التي يتعامل معها CaptchaAI داخل روبوتات الأتمتة؟
يغطّي CaptchaAI reCAPTCHA بجميع إصداراتها، وCloudflare Turnstile وChallenge، وGeeTest v3، وصور CAPTCHA النصية والشبكات الصورية، وBLS. أما hCaptcha وFunCaptcha فغير مدعومَين حالياً، لذا اختبر نوع الاختبار في صفحتك المستهدفة أولاً وابنِ الروبوت حول الأنواع المتاحة.
كم تكلفة تشغيل روبوت أتمتة عالي الحجم؟
يُحتسب تسعير CaptchaAI على عدد الـ Threads المتزامنة لا على عمليات الحل، مع حلول غير محدودة لكل thread شهرياً. تبدأ BASIC من 15 دولاراً بخمسة threads، وترتفع حتى ADVANCE بتسعين دولاراً و50 thread، فتبقى التكلفة متوقّعة مهما زاد الحجم.
كيف أدمج الحل داخل Selenium أو Playwright؟
استدعِ فئة الروبوت للحصول على الرمز، ثم احقنه في الصفحة عبر JavaScript يملأ حقل الاستجابة (مثل g-recaptcha-response) قبل الإرسال؛ يبقى المتصفح مسؤولاً عن التنقّل ويتكفّل CaptchaAI بطبقة CAPTCHA.