الترحيل من NextCaptcha إلى CaptchaAI لا يفرض عليك إعادة كتابة منطق الحل؛ فالذي يتغيّر فعليًا ثلاثة أمور فقط: صيغة نقطة النهاية، وطريقة إرسال الطلب (من جسم JSON إلى معاملات نموذج)، وكيفية قراءة الاستجابة. يعتمد NextCaptcha على واجهة REST بصيغة JSON عبر /createTask و/getTaskResult، بينما يستخدم CaptchaAI تنسيق in.php/res.php واسع الانتشار المتوافق مع نمط 2Captcha. يعرض هذا الدليل التطابق الحقلي الدقيق بين الواجهتين، مع أمثلة Python وJavaScript جاهزة للنسخ، وخطة اختبار متوازٍ تتيح لك التحويل دون توقّف الإنتاج.
لماذا الترحيل من NextCaptcha إلى CaptchaAI
الدافع الأكثر شيوعًا هو ثبات التكلفة. تخيّل فريق أتمتة في القاهرة أو الرياض يدير مراقبة أسعار على عدة متاجر إلكترونية ويحتاج إلى فاتورة شهرية يمكن التنبؤ بها بدل تكلفة تتحرك مع كل مهمة. يعتمد CaptchaAI على تسعير قائم على الـ threads المتزامنة مع عدد حلول غير محدود لكل thread خلال الشهر، وتبدأ الباقات من BASIC بسعر $15 شهريًا و5 threads. هذا النموذج يجعل توسيع الحِمل مسألة زيادة عدد الـ threads، لا مفاجآت في نهاية الشهر.
قبل كتابة أي كود، يساعد أن تبقي هذه المقابلة الذهنية حاضرة:
- نقطة النهاية: من
/createTaskو/getTaskResultإلىin.phpوres.php. - الطلب: من جسم JSON إلى معاملات نموذج بسيطة (أو سلسلة استعلام عند الاستطلاع).
- الاستجابة: من
errorId/taskId/solutionإلىstatus/request.
بمجرد استيعاب هذه المحاور الثلاثة، تصبح بقية الترحيل مجرد استبدال حقلي مباشر.
تطابق نقاط النهاية بين NextCaptcha وCaptchaAI
الفرق الأول الذي ستصادفه هو في عناوين نقاط النهاية نفسها وطريقة استدعائها. يلخّص الجدول التالي أين يذهب كل نداء بعد التبديل:
| الإجراء | NextCaptcha | CaptchaAI |
|---|---|---|
| إرسال المهمة | POST /createTask |
POST https://ocr.captchaai.com/in.php |
| الحصول على النتيجة | POST /getTaskResult |
GET https://ocr.captchaai.com/res.php |
| التحقق من الرصيد | POST /getBalance |
GET res.php?action=getbalance&key=KEY |
لاحظ فارقًا جوهريًا: يرسل NextCaptcha كل شيء عبر POST، بينما يعتمد CaptchaAI على POST للإرسال وGET للاستطلاع.
اختلافات بنية الطلب
NextCaptcha — الإرسال (جسم JSON)
{
"clientKey": "next_captcha_key",
"task": {
"type": "RecaptchaV2TaskProxyless",
"websiteURL": "https://example.com",
"websiteKey": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"
}
}
CaptchaAI — الإرسال (معاملات نموذج)
POST https://ocr.captchaai.com/in.php
key=YOUR_API_KEY&method=userrecaptcha&googlekey=6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-&pageurl=https://example.com&json=1
الفكرة نفسها في الحالتين: مفتاح، ونوع مهمة، وعنوان الصفحة، ومفتاح الموقع. لكن التغليف يختلف — كائن task متداخل مقابل معاملات مسطّحة.
تحويل المعاملات
| حقل NextCaptcha | حقل CaptchaAI | ملاحظات |
|---|---|---|
clientKey |
key |
مفتاح واجهة البرمجة |
task.type |
method |
انظر تطابق النوع أدناه |
task.websiteURL |
pageurl |
عنوان URL للصفحة المستهدفة |
task.websiteKey |
googlekey أو sitekey |
مفتاح الموقع لاختبارات الرمز |
task.recaptchaDataSValue |
data-s |
معامل بيانات reCAPTCHA |
task.isInvisible |
invisible=1 |
علامة reCAPTCHA غير المرئي |
task.pageAction |
action |
إجراء reCAPTCHA v3 |
taskId |
id |
معرّف المهمة للاستطلاع |
تطابق نوع المهمة
| نوع مهمة NextCaptcha | طريقة CaptchaAI + المعاملات |
|---|---|
RecaptchaV2TaskProxyless |
method=userrecaptcha |
RecaptchaV2Task |
method=userrecaptcha + proxy، proxytype |
HCaptchaTaskProxyless |
hCaptcha غير مدعوم حاليًا في CaptchaAI |
HCaptchaTask |
hCaptcha غير مدعوم حاليًا في CaptchaAI |
ImageToTextTask |
method=base64 + body |
TurnstileTaskProxyless |
method=turnstile |
يحلّ CaptchaAI عائلة reCAPTCHA بنسخها المختلفة، وCloudflare Turnstile وChallenge، وGeeTest v3، واختبارات الصور وOCR والشبكة، إضافة إلى BLS. أما hCaptcha وFunCaptcha فغير مدعومة حاليًا؛ إن كان جزء من حركتك يعتمد عليها فخطّط لإبقائه مؤقتًا على مزوّده الحالي حتى يتوفّر الدعم.
اختلافات تنسيق الاستجابة
بعد أن يتطابق الإرسال، يبقى فرق أخير عليك استيعابه قبل النظر إلى الكود: شكل الاستجابة. تختلف أسماء الحقول ونوع القيم المعادة بين الخدمتين في مرحلتي الإرسال والاستطلاع كما توضّح الجداول التالية.
استجابة الإرسال
| الحقل | NextCaptcha | CaptchaAI |
|---|---|---|
| التحقق من النجاح | errorId === 0 |
status === 1 |
| معرّف المهمة | taskId (عدد صحيح) |
request (سلسلة) |
| رسالة الخطأ | errorDescription |
request (سلسلة رمز الخطأ) |
استجابة الاستطلاع
| الحقل | NextCaptcha | CaptchaAI |
|---|---|---|
| فحص الجاهزية | status === "ready" |
status === 1 |
| غير جاهز | status === "processing" |
request === "CAPCHA_NOT_READY" |
| الحل | solution.gRecaptchaResponse |
request |
| الخطأ | errorDescription |
request (رمز الخطأ) |
النقطة التي تكسر معظم عمليات الترحيل الأولى: في NextCaptcha يكون الحل كائنًا متداخلًا (solution.gRecaptchaResponse)، بينما يعيده CaptchaAI مباشرة في الحقل request. حدّث دالة التحليل لديك وفقًا لذلك قبل تشغيل الكود التالي.
ترحيل الكود من NextCaptcha إلى CaptchaAI
Python — قبل (NextCaptcha)
import requests
import time
CLIENT_KEY = "your_nextcaptcha_key"
BASE_URL = "https://api.nextcaptcha.com"
def solve_recaptcha_v2(sitekey, pageurl):
# Submit
resp = requests.post(f"{BASE_URL}/createTask", json={
"clientKey": CLIENT_KEY,
"task": {
"type": "RecaptchaV2TaskProxyless",
"websiteURL": pageurl,
"websiteKey": sitekey
}
})
data = resp.json()
if data.get("errorId") != 0:
return {"error": data.get("errorDescription")}
task_id = data["taskId"]
# Poll
for _ in range(60):
time.sleep(5)
result = requests.post(f"{BASE_URL}/getTaskResult", json={
"clientKey": CLIENT_KEY,
"taskId": task_id
}).json()
if result.get("status") == "ready":
return {"solution": result["solution"]["gRecaptchaResponse"]}
if result.get("errorId") != 0:
return {"error": result.get("errorDescription")}
return {"error": "TIMEOUT"}
Python — بعد (CaptchaAI)
import os
import time
import requests
API_KEY = os.environ["CAPTCHAAI_API_KEY"]
def solve_recaptcha_v2(sitekey, pageurl):
# Submit — different endpoint and format
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": pageurl,
"json": 1
})
data = resp.json()
if data.get("status") != 1:
return {"error": data.get("request")}
captcha_id = data["request"]
# Poll — GET instead of POST, different response format
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY,
"action": "get",
"id": captcha_id,
"json": 1
}).json()
if result.get("status") == 1:
return {"solution": result["request"]}
if result.get("request") != "CAPCHA_NOT_READY":
return {"error": result.get("request")}
return {"error": "TIMEOUT"}
انتبه إلى أن CaptchaAI يقرأ مفتاح الـ API من متغيّر بيئة (CAPTCHAAI_API_KEY) بدل تضمينه في الكود — عادة أمان بسيطة يُستحسن اعتمادها أثناء الترحيل.
JavaScript — قبل (NextCaptcha)
const axios = require("axios");
const CLIENT_KEY = "your_nextcaptcha_key";
const BASE_URL = "https://api.nextcaptcha.com";
async function solveRecaptchaV2(sitekey, pageurl) {
const submit = await axios.post(`${BASE_URL}/createTask`, {
clientKey: CLIENT_KEY,
task: {
type: "RecaptchaV2TaskProxyless",
websiteURL: pageurl,
websiteKey: sitekey,
},
});
if (submit.data.errorId !== 0) return { error: submit.data.errorDescription };
const taskId = submit.data.taskId;
for (let i = 0; i < 60; i++) {
await new Promise((r) => setTimeout(r, 5000));
const poll = await axios.post(`${BASE_URL}/getTaskResult`, {
clientKey: CLIENT_KEY,
taskId,
});
if (poll.data.status === "ready") return { solution: poll.data.solution.gRecaptchaResponse };
if (poll.data.errorId !== 0) return { error: poll.data.errorDescription };
}
return { error: "TIMEOUT" };
}
JavaScript — بعد (CaptchaAI)
const axios = require("axios");
const API_KEY = process.env.CAPTCHAAI_API_KEY;
async function solveRecaptchaV2(sitekey, pageurl) {
const submit = await axios.post("https://ocr.captchaai.com/in.php", null, {
params: { key: API_KEY, method: "userrecaptcha", googlekey: sitekey, pageurl, json: 1 },
});
if (submit.data.status !== 1) return { error: submit.data.request };
const captchaId = submit.data.request;
for (let i = 0; i < 60; i++) {
await new Promise((r) => setTimeout(r, 5000));
const poll = await axios.get("https://ocr.captchaai.com/res.php", {
params: { key: API_KEY, action: "get", id: captchaId, json: 1 },
});
if (poll.data.status === 1) return { solution: poll.data.request };
if (poll.data.request !== "CAPCHA_NOT_READY") return { error: poll.data.request };
}
return { error: "TIMEOUT" };
}
قائمة تحقق الترحيل
استخدم هذه القائمة كمرجع تنفيذي أثناء التبديل، وراجع كل بند بالترتيب قبل تحويل حركة الإنتاج بالكامل:
| الخطوة | الحالة |
|---|---|
| أنشئ حساب CaptchaAI وأضف رصيدًا | ☐ |
عيّن جميع أنواع createTask إلى طرق CaptchaAI |
☐ |
استبدل clientKey بمفتاح CaptchaAI API |
☐ |
| حوّل الإرسال من POST بجسم JSON إلى POST بنموذج | ☐ |
| حدّث الاستطلاع من POST إلى GET بمعاملات الاستعلام | ☐ |
| حدّث تحليل الاستجابة (تنسيق status/request) | ☐ |
| شغّل اختبار مقارنة متوازيًا | ☐ |
| حوّل حركة الإنتاج بالكامل | ☐ |
استكشاف الأخطاء وإصلاحها
إن ظهرت أخطاء مباشرة بعد التبديل، فالأسباب الأكثر شيوعًا محصورة في أربع حالات يسهل تشخيصها وحلها بسرعة:
| المشكلة | السبب | الإجراء |
|---|---|---|
ERROR_KEY_DOES_NOT_EXIST |
ما زلت تستخدم clientKey الخاص بـ NextCaptcha |
استبدله بمفتاح CaptchaAI API |
| تعطّل تحليل الاستجابة | بنية JSON مختلفة عمّا كنت تتوقّعه | حدّث الكود ليقرأ الحقلين status (عدد صحيح) وrequest |
ERROR_WRONG_USER_KEY |
مفتاح API مشوّه أو ناقص | تحقّق من صيغة المفتاح في لوحة تحكم CaptchaAI |
| أنواع المهام غير معرّفة | ما زلت تمرّر أسماء أنواع NextCaptcha | طابقها مع قيم method في CaptchaAI (انظر الجدول أعلاه) |
الأسئلة الشائعة
هل يمكنني تشغيل NextCaptcha وCaptchaAI بالتوازي أثناء الترحيل؟
نعم، وهذا هو المسار الموصى به. أرسل نسبة صغيرة من حركتك إلى CaptchaAI أولًا وقارن النتائج جنبًا إلى جنب مع NextCaptcha، ثم ارفع النسبة تدريجيًا حتى تتأكد من تطابق السلوك قبل تحويل الإنتاج بالكامل.
هل يدعم CaptchaAI الأنواع نفسها التي كنت أحلّها عبر NextCaptcha؟
يغطّي CaptchaAI عائلة reCAPTCHA، وCloudflare Turnstile وChallenge، وGeeTest v3، واختبارات الصور والشبكة وOCR، وBLS. أما hCaptcha وFunCaptcha فغير مدعومين حاليًا، لذا راجع أنواع الحركة لديك قبل التحويل الكامل.
كيف يختلف نموذج تكلفة CaptchaAI؟
يفوتر CaptchaAI بحسب عدد الـ threads المتزامنة، لا بحسب كل مهمة، مع حلول غير محدودة لكل thread خلال الشهر. تبدأ الباقات من BASIC بسعر $15 شهريًا و5 threads، ما يجعل التكلفة الشهرية ثابتة ويسهل التنبؤ بها مع نمو الحجم.
كيف أتعامل مع مهام الوكيل (proxy) بعد الترحيل؟
في NextCaptcha تُحدَّد مهام الوكيل بأسماء أنواع مثل RecaptchaV2Task. في CaptchaAI تبقى الطريقة نفسها، وتضيف إليها المعاملين proxy=user:pass@host:port وproxytype=HTTP لتمرير الوكيل نفسه.
الخطوات التالية
- البدء السريع مع CaptchaAI: حلّ أول كابتشا في 5 دقائق
- كيفية حلّ reCAPTCHA v2 عبر الـ API: دليل خطوة بخطوة
- كيفية حل Cloudflare Turnstile باستخدام واجهة API
- كيفية حل GeeTest v3 باستخدام API