المرجع

الترحيل من NextCaptcha إلى CaptchaAI

الترحيل من 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 لتمرير الوكيل نفسه.


الخطوات التالية

أدلة ذات صلة

التعليقات غير مفعّلة لهذا المقال.