تحتاج إلى حل كابتشا داخل سكربت أو خط CI/CD دون تثبيت أي مكتبة؟ أداة cURL وحدها تكفي: طلبان عبر HTTP إلى واجهة CaptchaAI REST — أحدهما يرسل التحدي والآخر يستطلع النتيجة — يمنحانك توكناً جاهزاً للاستخدام. ولأن cURL مثبّت مسبقاً على معظم أنظمة Linux وmacOS ومتوفر على Windows، فهو الخيار الأسرع للاختبار اليدوي، وربط خطوط الأتمتة، وكتابة نصوص الطرفية الخفيفة دون الاعتماد على أي SDK.
تخيّل فريق اختبار في القاهرة أو الرياض يشغّل اختبارات تسجيل الدخول ليلياً عبر GitHub Actions. بدلاً من إضافة تبعية Python كاملة لمجرد حل reCAPTCHA واحد في خطوة الاختبار، يكفي استدعاء أمر cURL من داخل مهمة الـ CI ليبقى المسار بسيطاً وأخف في الصيانة. هذا الدليل يبني هذا المسار خطوة بخطوة: من فحص الرصيد، إلى سكربت Bash قابل لإعادة الاستخدام، وصولاً إلى المعالجة الدُفعية وتشغيله على Windows.
المتطلبات
تحتاج إلى ثلاثة عناصر فقط قبل أن تكتب أول أمر:
| المتطلب | التفاصيل |
|---|---|
| cURL | أي نسخة حديثة |
| jq (اختياري) | لتحليل الاستجابات وتنسيق JSON |
| مفتاح CaptchaAI API | احصل على واحد من هنا |
الأداة jq ليست ضرورية، لكنها تسهّل استخراج الحقول من الاستجابات عندما تعمل مع صيغة JSON بدل الاستجابات النصية البسيطة.
الأوامر الأساسية
تعتمد الواجهة على نقطتَي نهاية اثنتين فقط: in.php لإرسال التحدي، وres.php لفحص الرصيد واستطلاع النتيجة. الأوامر الثلاثة التالية تغطّي الدورة الكاملة من البداية إلى التوكن النهائي.
التحقق من الرصيد
ابدأ دائماً بالتأكد من أن مفتاحك فعّال وأن الرصيد كافٍ. هذا الأمر يعيد رقماً عشرياً يمثّل رصيدك الحالي:
curl -s "https://ocr.captchaai.com/res.php?key=YOUR_API_KEY&action=getbalance"
الإخراج: 1.234
إرسال reCAPTCHA v2
لإرسال تحدٍّ من نوع reCAPTCHA v2 تمرّر method=userrecaptcha مع مفتاح الموقع في googlekey وعنوان الصفحة في pageurl. تعيد الواجهة معرّف المهمة الذي ستستخدمه لاحقاً في الاستطلاع:
curl -s "https://ocr.captchaai.com/in.php?key=YOUR_API_KEY&method=userrecaptcha&googlekey=6Le-wvkS...&pageurl=https://example.com"
الإخراج: OK|73548291
الرقم الذي يلي OK| هو معرّف المهمة (task ID)؛ احتفظ به لأنه مفتاح استطلاع النتيجة في الخطوة التالية.
استطلاع النتيجة
الحل ليس فورياً؛ يحتاج بضع ثوانٍ. استطلع النتيجة باستخدام المعرّف عبر action=get. طالما لم يكتمل الحل ستحصل على CAPCHA_NOT_READY، وعند الاكتمال ستحصل على التوكن مسبوقاً بـ OK|:
curl -s "https://ocr.captchaai.com/res.php?key=YOUR_API_KEY&action=get&id=73548291"
الإخراج: OK|03AGdBq24PBCbw... أو CAPCHA_NOT_READY
القاعدة العملية: انتظر خمس ثوانٍ بين كل استطلاع وآخر لتجنّب إغراق الواجهة بطلبات لا داعي لها.
سكربت Bash قابل لإعادة الاستخدام
تكرار خطوتَي الإرسال والاستطلاع يدوياً غير عملي. غلّفهما في دالة واحدة تتولى الإرسال، ثم الاستطلاع في حلقة حتى الحل أو انتهاء المهلة، مع معالجة الأخطاء. لاحظ set -euo pipefail في المقدمة الذي يوقف السكربت فور حدوث أي خطأ بدل المتابعة بصمت.
أنشئ الملف solve_captcha.sh:
#!/bin/bash
set -euo pipefail
API_KEY="${CAPTCHAAI_API_KEY:?Set CAPTCHAAI_API_KEY environment variable}"
BASE_URL="https://ocr.captchaai.com"
solve_recaptcha() {
local site_key="$1"
local page_url="$2"
local timeout="${3:-300}"
# Submit
local response
response=$(curl -s "${BASE_URL}/in.php?key=${API_KEY}&method=userrecaptcha&googlekey=${site_key}&pageurl=${page_url}")
if [[ ! "$response" == OK|* ]]; then
echo "ERROR: Submit failed: $response" >&2
return 1
fi
local task_id="${response#OK|}"
echo "Submitted task: $task_id" >&2
# Poll
local deadline=$((SECONDS + timeout))
while (( SECONDS < deadline )); do
sleep 5
local result
result=$(curl -s "${BASE_URL}/res.php?key=${API_KEY}&action=get&id=${task_id}")
if [[ "$result" == "CAPCHA_NOT_READY" ]]; then
echo "Waiting..." >&2
continue
fi
if [[ "$result" == OK|* ]]; then
echo "${result#OK|}"
return 0
fi
echo "ERROR: Solve failed: $result" >&2
return 1
done
echo "ERROR: Timeout after ${timeout}s" >&2
return 1
}
# Usage: ./solve_captcha.sh SITE_KEY PAGE_URL
if [[ $# -ge 2 ]]; then
solve_recaptcha "$1" "$2"
fi
تعتمد الدالة على متغيّر البيئة CAPTCHAAI_API_KEY، ما يعني أن المفتاح لا يظهر أبداً داخل نص السكربت. اجعل الملف قابلاً للتنفيذ:
chmod +x solve_captcha.sh
ثم شغّله بعد تعيين المفتاح في البيئة:
export CAPTCHAAI_API_KEY="your_key_here"
./solve_captcha.sh "6Le-wvkS..." "https://example.com"
يطبع السكربت رسائل الحالة على stderr والتوكن النهائي على stdout، ما يجعله جاهزاً للربط مع أوامر أخرى عبر الأنابيب.
حل Cloudflare Turnstile
نفس النمط ينطبق على أنواع أخرى؛ ما يتغيّر هو قيمة method واسم معامل مفتاح الموقع. لحل Cloudflare Turnstile استخدم method=turnstile مع sitekey:
curl -s "https://ocr.captchaai.com/in.php?key=${CAPTCHAAI_API_KEY}&method=turnstile&sitekey=0x4AAAAA...&pageurl=https://example.com"
بعد الإرسال، استطلع النتيجة بالمعرّف بنفس أمر res.php الذي رأيته سابقاً.
حل كابتشا الصور
لكابتشا الصور والنصوص (OCR)، حوّل الصورة إلى base64 وأرسلها في body:
# Encode image to base64
IMAGE_B64=$(base64 -w 0 captcha.png)
# Submit
curl -s "https://ocr.captchaai.com/in.php?key=${CAPTCHAAI_API_KEY}&method=base64&body=${IMAGE_B64}"
عندما تكون الصورة كبيرة، إرسالها ضمن رابط URL قد يتجاوز الحد المسموح لطوله؛ في هذه الحالة استخدم طلب POST مع رفع الملف مباشرة:
curl -s -X POST "https://ocr.captchaai.com/in.php" \
-F "key=${CAPTCHAAI_API_KEY}" \
-F "method=post" \
-F "file=@captcha.png"
حل التوكن واستخدامه في مسار واحد
القيمة الحقيقية تظهر حين تربط الحل بالخطوة التالية مباشرة. المثال التالي يحصل على التوكن من السكربت السابق ثم يرسله مع بيانات النموذج في حقل g-recaptcha-response:
#!/bin/bash
# Solve CAPTCHA and submit form in one pipeline
API_KEY="${CAPTCHAAI_API_KEY}"
SITE_KEY="6Le-wvkS..."
TARGET_URL="https://example.com/login"
# Solve
TOKEN=$(./solve_captcha.sh "$SITE_KEY" "$TARGET_URL")
if [[ -z "$TOKEN" ]]; then
echo "Failed to solve CAPTCHA"
exit 1
fi
# Submit form with token
curl -s -X POST "$TARGET_URL" \
-d "username=user" \
-d "password=pass" \
-d "g-recaptcha-response=${TOKEN}"
هذا هو النمط نفسه الذي يستخدمه فريق الاختبار في السيناريو الذي بدأنا به: خطوة واحدة تحل التحدي وتكمل تسجيل الدخول ضمن مهمة CI واحدة.
المعالجة الدُفعية
عندما تحتاج إلى معالجة عدة عناوين دفعة واحدة، اقرأ قائمة من ملف نصي وحُلّها واحداً تلو الآخر، مع تسجيل النتائج في ملف CSV:
#!/bin/bash
# Input file: urls.txt (one URL per line)
while IFS= read -r url; do
echo "Processing: $url"
TOKEN=$(./solve_captcha.sh "6Le-wvkS..." "$url")
if [[ -n "$TOKEN" ]]; then
echo "$url,$TOKEN" >> results.csv
echo " Solved ✓"
else
echo " Failed ✗"
fi
done < urls.txt
لرفع الإنتاجية في الدفعات الكبيرة، تذكّر أن CaptchaAI يعتمد التسعير على أساس الـ threads المتزامنة؛ فكل thread يعالج تحدياً واحداً في اللحظة، وعدد الـ threads في خطتك هو ما يحدّد كم طلباً يمكنك تشغيله بالتوازي.
PowerShell على Windows
إن كنت على Windows دون بيئة Bash، فإن Invoke-RestMethod يؤدي نفس الدور. المنطق واحد: إرسال، ثم استطلاع في حلقة حتى تختفي حالة CAPCHA_NOT_READY:
$ApiKey = $env:CAPTCHAAI_API_KEY
$BaseUrl = "https://ocr.captchaai.com"
# Submit
$response = Invoke-RestMethod "${BaseUrl}/in.php?key=${ApiKey}&method=userrecaptcha&googlekey=6Le-wvkS...&pageurl=https://example.com"
if ($response -match '^OK\|(.+)$') {
$taskId = $Matches[1]
Write-Host "Task: $taskId"
} else {
Write-Error "Submit failed: $response"
exit 1
}
# Poll
do {
Start-Sleep -Seconds 5
$result = Invoke-RestMethod "${BaseUrl}/res.php?key=${ApiKey}&action=get&id=${taskId}"
} while ($result -eq 'CAPCHA_NOT_READY')
if ($result -match '^OK\|(.+)$') {
$token = $Matches[1]
Write-Host "Token: $token"
} else {
Write-Error "Solve failed: $result"
}
استكشاف الأخطاء وإصلاحها
معظم المشكلات في هذا المسار تعود إلى الشبكة أو تنسيق المفتاح. الجدول التالي يلخّص أكثرها شيوعاً وحلولها المباشرة:
| الخطأ | السبب | الإصلاح |
|---|---|---|
curl: (6) Could not resolve host |
مشكلة DNS | تحقق من الشبكة |
ERROR_WRONG_USER_KEY |
مفتاح API غير صالح | تحقق من وجود مسافات أو أسطر جديدة في المفتاح |
| الاستجابة فارغة | انتهاء مهلة الشبكة | أضف --connect-timeout 30 |
base64: invalid input |
مشكلة في الملف الثنائي | استخدم base64 -w 0 بدون تغليف |
الأسئلة الشائعة
كيف أستخرج التوكن من الاستجابة باستخدام jq؟
حين تعمل مع استجابات JSON، مرّرها إلى jq لاستخراج الحقل الذي تريده بدل تحليل النص يدوياً، مثل curl -s "..." | jq -r '.request'. أما مع الاستجابات النصية البسيطة على شكل OK|token فيكفي قصّ الجزء بعد OK| كما في سكربت Bash أعلاه.
ماذا تعني CAPCHA_NOT_READY وكم مرة أستطلع؟
هي حالة طبيعية تعني أن الحل لم يكتمل بعد؛ ليست خطأً. كرّر الاستطلاع كل خمس ثوانٍ تقريباً حتى تحصل على استجابة تبدأ بـ OK|، مع تعيين مهلة قصوى (مثل 300 ثانية) لإيقاف الحلقة إن طال الانتظار.
كيف أؤمّن مفتاح الـ API داخل السكربتات وخطوط CI/CD؟
لا تكتب المفتاح داخل نص السكربت أبداً. مرّره عبر متغيّر البيئة CAPTCHAAI_API_KEY، وخزّنه في خطوط الأتمتة كـ "سر" (secret) — سواء في GitHub Actions أو GitLab CI أو Jenkins — ثم اقرأه من البيئة وقت التشغيل فقط.
هل يعمل هذا على Windows دون تثبيت Bash؟
نعم. استخدم قسم PowerShell أعلاه المبني على Invoke-RestMethod، فهو يكرّر منطق الإرسال والاستطلاع نفسه بأدوات Windows الأصلية دون الحاجة إلى Bash أو أي طبقة توافق إضافية.
كم عدد الـ threads الذي أحتاجه لتشغيل طلبات متوازية؟
يعتمد ذلك على عدد التحديات التي تريد حلّها في اللحظة نفسها. لأن CaptchaAI يسعّر حسب الـ threads المتزامنة مع حلول غير محدودة لكل thread، فإن كل طلب متوازٍ يشغل thread واحداً؛ اختر خطة يتناسب عدد threadها مع ذروة التزامن المتوقعة في دفعاتك.