دروس API

حل BLS CAPTCHA خطوة بخطوة

حلّ BLS CAPTCHA آلياً يتلخّص في أربع خطوات واضحة، وهذا الدليل يشرح كلاً منها بأمثلة جاهزة في Python وNode.js يمكنك لصقها مباشرة في سكربت الأتمتة. المسار كله يمرّ عبر CaptchaAI: أنت تجهّز المدخلات في المتصفّح، والخدمة تعيد إليك أرقام الصور التي يجب النقر عليها.

  1. استخرج الصور ونص التعليمات من صفحة الحجز.
  2. أرسلها إلى CaptchaAI بطريقة bls.
  3. استطلع النتيجة حتى تحصل على فهارس الصور الصحيحة.
  4. انقر تلك الصور وأرسل النموذج.

على عكس شبكة reCAPTCHA القياسية، يعرض BLS CAPTCHA مجموعة صور مخصّصة مصحوبة بتعليمات نصّية متغيّرة، لذا لا يكفي نموذج تعرّف جاهز؛ لا بدّ من إرسال الصور والتعليمات معاً حتى يفهم مزوّد الحل ما المطلوب تحديده بالضبط.

ما هو BLS CAPTCHA ولماذا تُؤتمت حلّه

BLS CAPTCHA اختبار قائم على الصور تعرضه بوّابات BLS International المستخدَمة لحجز مواعيد التأشيرات نيابةً عن عدد من السفارات والقنصليات. يظهر عند فتح نموذج الحجز، ولا يُكمَل النموذج حتى تُختار الصور الصحيحة وفق التعليمات.

  • أين يظهر: في صفحة حجز الموعد قبل تأكيد النموذج مباشرة.
  • كم صورة: من 3 إلى 9 صور في الشبكة الواحدة.
  • ما التعليمات: نص متغيّر مثل "حدّد جميع الصور التي تحتوي على سيارة".

في كثير من مراكز التقديم عبر الشرق الأوسط وشمال إفريقيا، تكون فترات المواعيد المتاحة قصيرة ومتغيّرة، ويُعاد فتح نموذج الحجز مرات عديدة. تكرار هذا الاختبار يدوياً في كل محاولة يبطئ سير العمل ويجعله هشّاً، لذلك يلجأ فرق الأتمتة إلى حلّ BLS CAPTCHA برمجياً ضمن سكربت موثوق يتولّى الاستخراج والإرسال والنقر. يفيد النهج نفسه في اختبار الجودة (QA) للتأكد من أن مسار الحجز يعمل من طرف إلى طرف قبل إطلاق أي تكامل.

المتطلبات

البند القيمة
مفتاح CaptchaAI API من captchaai.com
صور BLS CAPTCHA مشفّرة بترميز Base64 من الصفحة
نص التعليمات النص الذي يحدّد الصور المطلوب اختيارها
اللغة Python 3.7+ أو Node.js 14+

قبل أن تبدأ، راجع النقاط التالية سريعاً:

  • تأكّد من أن رصيد حسابك على لوحة التحكم كافٍ لتشغيل الطلبات.
  • خزّن مفتاح الـ API في متغيّر بيئة بدل كتابته داخل الكود مباشرة.
  • تذكّر أن طريقة bls تُستدعى عبر نقطة النهاية in.php نفسها المستخدمة لبقية الأنواع، فإن سبق لك التكامل مع نقاط نهاية متوافقة مع 2Captcha ستجد المسار مألوفاً.

الخطوة 1: استخراج الصور والتعليمات من الصفحة

أول ما تحتاجه هو قراءة نص التعليمات وجمع كل الصور بترميز Base64. إذا كانت الصورة مضمّنة في السمة src بصيغة data:image فهي مشفّرة سلفاً ويكفي إزالة البادئة؛ وإن كانت رابطاً عادياً فحمّلها ثم شفّرها. الأهم أن ترتّب الصور بالترتيب نفسه الذي تظهر به، لأن الفهارس التي يعيدها الحل تعتمد على هذا الترتيب.

باستخدام Selenium

from selenium import webdriver
from selenium.webdriver.common.by import By
import base64
import requests as req

driver = webdriver.Chrome()
driver.get("https://blsitalypakistan.com/appointment")

# Get instruction text
instruction = driver.find_element(By.CSS_SELECTOR, ".captcha-instruction").text
print(f"Instruction: {instruction}")

# Get all captcha images as base64
images = {}
captcha_imgs = driver.find_elements(By.CSS_SELECTOR, ".captcha-image img")
for i, img in enumerate(captcha_imgs, 1):
    src = img.get_attribute("src")
    if src.startswith("data:image"):
        # Already base64
        images[f"image_base64_{i}"] = src.split(",")[1]
    else:
        # Download and encode
        img_data = req.get(src).content
        images[f"image_base64_{i}"] = base64.b64encode(img_data).decode()

باستخدام Puppeteer

const puppeteer = require('puppeteer');

const browser = await puppeteer.launch({ headless: 'new' });
const page = await browser.newPage();
await page.goto('https://blsitalypakistan.com/appointment');

// Get instruction
const instruction = await page.$eval('.captcha-instruction', el => el.textContent);

// Get images as base64
const images = await page.$$eval('.captcha-image img', imgs =>
  imgs.map((img, i) => ({
    key: `image_base64_${i + 1}`,
    value: img.src.startsWith('data:') ? img.src.split(',')[1] : null
  }))
);

الخطوة 2: أرسل الصور إلى CaptchaAI

بعد تجهيز التعليمات والصور، أرسلها جميعاً في حمولة طلب واحدة إلى محلل BLS. الحقول التي يعتمد عليها الطلب:

  • key مفتاح الـ API الخاص بك.
  • method بقيمة bls لاختيار محلل BLS.
  • instructions نص التعليمات المستخرَج من الصفحة.
  • image_base64_1image_base64_9 الصور المشفّرة بترتيب العرض.
  • json بقيمة 1 للحصول على استجابة منظّمة يسهل التحقق منها.

عند نجاح الإرسال يعيد الخادم معرّف المهمة الذي ستستخدمه في خطوة الاستطلاع.

Python

import requests
import time

API_KEY = "YOUR_API_KEY"

payload = {
    "key": API_KEY,
    "method": "bls",
    "instructions": instruction,
    "json": 1
}

# Add each image (up to 9)
for key, value in images.items():
    payload[key] = value

response = requests.post("https://ocr.captchaai.com/in.php", data=payload)
data = response.json()

if data.get("status") != 1:
    raise Exception(f"Submit error: {data.get('request')}")

task_id = data["request"]
print(f"Task submitted: {task_id}")

Node.js

const axios = require('axios');
const FormData = require('form-data');

async function submitBLS(instruction, images) {
  const params = {
    key: 'YOUR_API_KEY',
    method: 'bls',
    instructions: instruction,
    json: 1,
    ...Object.fromEntries(images.map(img => [img.key, img.value]))
  };

  const { data } = await axios.post('https://ocr.captchaai.com/in.php', null, { params });
  if (data.status !== 1) throw new Error(data.request);
  return data.request;
}

الخطوة 3: استطلاع النتيجة حتى اكتمال الحل

الحل ليس فورياً؛ يحتاج المزوّد بضع ثوانٍ لمعالجة الصور، لذلك تستطلع نقطة النهاية res.php دورياً حتى تعود الحالة status بقيمة 1.

def get_bls_solution(task_id):
    for _ in range(30):
        time.sleep(5)
        result = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY,
            "action": "get",
            "id": task_id,
            "json": 1
        }).json()

        if result.get("status") == 1:
            return result["request"]  # e.g., "1,3,5" (image indices)
        if result.get("request") != "CAPCHA_NOT_READY":
            raise Exception(f"Error: {result.get('request')}")

    raise Exception("Timeout")

solution = get_bls_solution(task_id)
print(f"Select images: {solution}")  # e.g., "1,3,5"

ثلاث ملاحظات تجعل حلقة الاستطلاع مستقرة:

  • طالما بقيت الاستجابة CAPCHA_NOT_READY فالمهمة قيد المعالجة، فاصبر واستطلع من جديد.
  • أي رسالة أخرى تعني خطأً يجب إيقاف الحلقة عنده بدل الاستمرار.
  • النتيجة تأتي كسلسلة فهارس مفصولة بفواصل، مثل 1,3,5، تمثّل أرقام الصور الصحيحة بترتيب العرض. وفاصل خمس ثوانٍ بين المحاولات يوازن بين سرعة الاستجابة وعدم إرهاق الخادم.

الخطوة 4: انقر الصور الصحيحة وأرسل النموذج

بعد الحصول على الفهارس، حوّلها إلى قائمة أعداد صحيحة ثم نفّذ التالي:

  • انقر كل صورة يقابلها فهرس في القائمة.
  • اطرح واحداً من الفهرس لأنه يبدأ من 1 بينما ترقيم عناصر المتصفّح يبدأ من 0.
  • أضف تأخيراً بسيطاً بين النقرات لمحاكاة تفاعل طبيعي، ثم أرسل النموذج.
# Parse the solution indices
selected = [int(i) for i in solution.split(",")]

# Click each correct image
captcha_imgs = driver.find_elements(By.CSS_SELECTOR, ".captcha-image img")
for idx in selected:
    captcha_imgs[idx - 1].click()  # Convert 1-based to 0-based
    time.sleep(0.3)  # Small delay between clicks

# Submit the form
driver.find_element(By.CSS_SELECTOR, ".captcha-submit").click()

مثال بايثون الكامل

يجمع المثال التالي الخطوات الأربع في سكربت واحد: يفتح صفحة الحجز، يستخرج التعليمات والصور، يرسلها إلى CaptchaAI، يستطلع النتيجة، ثم ينقر الصور الصحيحة ويرسل النموذج.

import requests
import time
import base64
from selenium import webdriver
from selenium.webdriver.common.by import By

API_KEY = "YOUR_API_KEY"
driver = webdriver.Chrome()
driver.get("https://blsitalypakistan.com/appointment")

# 1. Extract instruction and images
instruction = driver.find_element(By.CSS_SELECTOR, ".captcha-instruction").text
captcha_imgs = driver.find_elements(By.CSS_SELECTOR, ".captcha-image img")

payload = {"key": API_KEY, "method": "bls", "instructions": instruction, "json": 1}
for i, img in enumerate(captcha_imgs, 1):
    src = img.get_attribute("src")
    if src.startswith("data:image"):
        payload[f"image_base64_{i}"] = src.split(",")[1]

# 2. Submit to CaptchaAI
resp = requests.post("https://ocr.captchaai.com/in.php", data=payload).json()
task_id = resp["request"]

# 3. Poll for solution
for _ in range(30):
    time.sleep(5)
    result = requests.get("https://ocr.captchaai.com/res.php", params={
        "key": API_KEY, "action": "get", "id": task_id, "json": 1
    }).json()
    if result.get("status") == 1:
        selected = [int(i) for i in result["request"].split(",")]
        break

# 4. Click correct images and submit
for idx in selected:
    captcha_imgs[idx - 1].click()
    time.sleep(0.3)
driver.find_element(By.CSS_SELECTOR, ".captcha-submit").click()

print("CAPTCHA solved!")
driver.quit()

أفضل الممارسات لموثوقية الحل

اعتماد حلّ BLS على صور حيّة يجعل التوقيت وجودة المدخلات عاملَي النجاح الأهم:

  • قصّر الفجوة الزمنية: استخرج الصور ونفّذ النقر في الجلسة نفسها، لأن الشبكة قد تتجدّد بعد ثوانٍ.
  • راقب جودة الصور: الصور الواضحة تُحل أسرع وأدقّ من الصور المضغوطة أو الباهتة.
  • تعامل مع الأخطاء بلطف: أعد المحاولة على أخطاء المهلة المؤقتة، وتوقّف فوراً عند أخطاء المدخلات لتصحيحها.
  • سجّل كل استجابة: حفظ المعرّف والفهارس يسهّل تتبّع الأعطال لاحقاً.

استكشاف الأخطاء وإصلاحها

أغلب المشكلات في تكامل BLS تعود إلى مدخلات ناقصة أو صور غير محدَّثة، ويلخّص الجدول أكثرها شيوعاً:

خطأ السبب إصلاح
ERROR_BAD_PARAMETERS تعليمات أو صور مفقودة ضمِّن نص التعليمات وصورة واحدة على الأقل
ERROR_CAPTCHA_UNSOLVABLE الصور ضبابية جداً أو غير واضحة التقط صوراً أعلى جودة وتأكّد من صحة ترميز Base64
اختيار صور خاطئة ترتيب الصور غير صحيح رقّم الصور بترتيب العرض الصحيح على الصفحة
رفض الحل تغيّرت الصور بعد الاستخراج استخرج الصور وأرسلها فوراً في الجلسة نفسها

النقطة الأهم عملياً هي الطزاجة: نموذج BLS قد يجدّد الصور بعد ثوانٍ، فإذا مرّ وقت طويل بين الاستخراج والنقر فقد يُرفض الحل حتى لو كان صحيحاً. اجعل الفترة بين الخطوتين أقصر ما يمكن.

مثال كامل قابل للتشغيل

هل تحتاج إلى مشروع عمل كامل مع إعداد البيئة والاستطلاع وإعادة المحاولة ومعالجة الأخطاء؟

راجع المثال الكامل القابل للتشغيل على GitHub →

الأسئلة الشائعة

كم من الوقت يستغرق حل BLS CAPTCHA؟

عادةً بين 15 و30 ثانية، لكن الرقم يتغيّر بحسب وضوح الصور وحجم الطلب ووقت التشغيل. تحديات التعرّف على الصور تستغرق وقتاً أطول من اختبارات CAPTCHA النصّية، لذا خصّص مهلة استطلاع مريحة.

هل يتوافق أسلوب bls مع نقاط النهاية المتوافقة مع 2Captcha؟

نعم؛ تُرسل طريقة bls إلى in.php وتُستطلع النتيجة من res.php بالنمط نفسه المألوف في تكاملات 2Captcha، مع فارق إضافة حقل instructions ومفاتيح الصور image_base64_n. هذا يجعل الانتقال إلى CaptchaAI سلساً إن كان لديك تكامل قائم.

ماذا أفعل إذا تغيّرت الصور بين الاستخراج والإرسال؟

أعد استخراج الصور مباشرة قبل الإرسال، ونفّذ النقر فور عودة النتيجة. إن استمر الرفض، قصّر مهلة الاستطلاع أو قلّل التأخير بين النقرات حتى تبقى الجلسة والصور متطابقة.

كم تبلغ تكلفة حل BLS CAPTCHA عبر CaptchaAI؟

التسعير قائم على عدد الـ Threads المتزامنة لا على كل عملية حل. تبدأ الخطط من BASIC بسعر ‏$15 شهرياً مع 5 Threads وعدد غير محدود من عمليات الحل لكل Thread، وتتدرّج حتى الخطط الأعلى للأحجام الكبيرة. راجع captchaai.com للأسعار المحدّثة.

هل يدعم CaptchaAI أنواع CAPTCHA أخرى إلى جانب BLS؟

نعم؛ يحل CaptchaAI عائلات reCAPTCHA v2 وv3، وCloudflare Turnstile وChallenge، وGeeTest v3، وكابتشا الصور/OCR والشبكات، إلى جانب BLS. أما hCaptcha وFunCaptcha (Arkose Labs) فغير مدعومَين حالياً، ودعم GeeTest v4 قادم قريباً.

أدلة ذات صلة

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