API Tutorials

Как решить BLS CAPTCHA шаг за шагом

BLS CAPTCHA — это не reCAPTCHA и не Cloudflare Turnstile: вместо чекбокса или ползунка система показывает от 3 до 9 картинок и текстовую инструкцию вроде «Выберите все изображения с автомобилем». Такую капчу используют визовые порталы BLS International, через которые заявители из России, Казахстана, Беларуси и других стран подают документы на визы в Италию, Испанию, Великобританию и другие направления шенгенской зоны.

Ниже — рабочий процесс целиком: как забрать изображения и текст инструкции со страницы, передать их в CaptchaAI и кликнуть по нужным картинкам в форме. Такой сценарий актуален для визовых агентств и релокационных сервисов, которые автоматизируют собственные интеграции с порталами бронирования и тестируют их в QA-контуре, а не пытаются обойти лимиты записи.

Если сценарий связан со сбором персональных данных заявителей (имя, номер паспорта, дата приёма), собирайте только те поля, которые вы вправе обрабатывать по условиям интеграции — для российской аудитории это требования 152-ФЗ «О персональных данных», для остальных читателей уместна такая же осмотрительность в рамках GDPR.

Коротко: как работает весь процесс

  1. Извлекаете картинки и текст инструкции из DOM страницы бронирования.
  2. Отправляете их одним запросом в CaptchaAI методом bls.
  3. Опрашиваете res.php, пока не придёт решение с индексами картинок.
  4. Кликаете по нужным изображениям в исходном порядке и отправляете форму.

Что понадобится для интеграции

Перед тем как писать код, соберите четыре вещи:

  • API-ключ CaptchaAI — получите на captchaai.com.
  • Изображения BLS CAPTCHA — в кодировке Base64, снятые со страницы бронирования.
  • Текст инструкции — строка, которая указывает, какие изображения выбрать.
  • Язык интеграции — Python 3.7+ или Node.js 14+ (примеры ниже покрывают оба).

Шаг 1. Получите изображения и инструкцию со страницы

BLS CAPTCHA обычно показывает от 3 до 9 изображений и одну текстовую инструкцию — например, «Выберите все изображения с автомобилем». Прежде чем отправлять что-либо в CaptchaAI, нужно вытащить и текст, и картинки из DOM страницы бронирования.

Через 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
  }))
);

Обратите внимание: если src уже содержит data:image/...;base64,, изображение достаточно разрезать по запятой — повторное скачивание не нужно. Если атрибут ведёт на обычный URL, изображение нужно докачать отдельным запросом и закодировать в Base64 самостоятельно, как показано в примере на Selenium.


Шаг 2. Отправьте задачу в CaptchaAI

Инструкция и все изображения уходят в решатель BLS одним запросом — метод API называется bls.

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;
}

Ключ image_base64_1…image_base64_9 соответствует порядку показа картинок на странице — если нумерация собьётся, решение придёт верным, но клики в шаге 4 попадут не туда. Это самая частая причина отклонённого решения на BLS-порталах.


Шаг 3. Опросите API и получите решение

in.php не решает капчу мгновенно — он ставит задачу в очередь и возвращает task_id. Решение нужно забрать отдельным опросом res.php; оно приходит в виде индексов правильных изображений.

Python

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"

Решение BLS CAPTCHA обычно занимает 15–30 секунд — дольше, чем текстовые капчи, потому что задача распознавания изображений сложнее. Опрос с интервалом 5 секунд и лимитом в 30 попыток из примера выше — рабочий баланс между скоростью реакции и числом лишних запросов к res.php.

Если пайплайн работает с нестабильным соединением (например, из офиса релокационного агентства через мобильный интернет), не уменьшайте интервал опроса ниже 3–5 секунд — частые запросы к res.php не ускоряют решение, а только увеличивают число лишних обращений к API при разрыве соединения.


Шаг 4. Кликните по нужным изображениям в форме

Индексы из решения — это порядковые номера картинок на странице (начиная с 1), их нужно перевести в клики по DOM-элементам:

# 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()

Небольшая пауза между кликами (0,3 секунды в примере) не обязательна для самого API, но снижает шанс, что форма BLS отбросит слишком быструю серию событий как подозрительную.


Готовый пример на Python

Все четыре шага целиком, от запуска браузера до отправки формы:

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()

Возможные ошибки и их устранение

Ошибка Причина Решение
ERROR_BAD_PARAMETERS Не передана инструкция или изображения Передайте и текст инструкции, и хотя бы одно изображение
ERROR_CAPTCHA_UNSOLVABLE Изображения слишком размытые или нечитаемые Снимайте картинки в более высоком качестве; проверьте корректность кодировки Base64
Кликнуты не те изображения Нарушен порядок нумерации картинок Убедитесь, что изображения пронумерованы в том же порядке, в котором отображаются на странице
Решение отклонено формой Изображения изменились после извлечения Извлекайте изображения и сразу отправляйте задачу, не откладывая

Если ошибка повторяется на конкретной странице BLS-портала, для начала проверьте DOM вручную через DevTools — селекторы .captcha-instruction и .captcha-image img могут отличаться у разных стран и версий портала.

Быстрые проверки перед повторной отправкой задачи:

  • Совпадает ли число ключей image_base64_* с числом картинок на странице прямо сейчас.
  • Не изменилась ли инструкция за время, пока собирались изображения.
  • Возвращает ли res.php статус 1, а не CAPCHA_NOT_READY или код ошибки.

Нужен полный рабочий проект?

Если нужна не просто вставка кода, а готовый проект с настройкой окружения, опросом, повторными попытками и обработкой ошибок, смотрите полный рабочий пример на GitHub →


Часто задаваемые вопросы

Сколько изображений показывает BLS CAPTCHA и как это влияет на скорость решения?

Обычно от 3 до 9 — число зависит от конкретной страницы и сессии. Связь со скоростью прямая:

  • 3–4 изображения — решение обычно ближе к нижней границе диапазона в 15–30 секунд.
  • 8–9 изображений — распознавание сложнее, решение может занять время ближе к верхней границе диапазона.

В каком формате нужно передавать изображения в API?

PNG или JPEG в кодировке Base64. Перед отправкой обязательно удалите префикс data:image/...;base64, — CaptchaAI ожидает только саму строку Base64, без него.

Сколько API-потоков нужно для интеграции с BLS-порталом?

Зависит от объёма — цена в обоих случаях не зависит от числа решённых задач в рамках потока:

  • BASIC ($15/мес, 5 потоков) — хватает для тестовой интеграции и небольшого агентства с редкими заявками.
  • ADVANCE ($90/мес, 50 потоков) — разумный выбор при обработке десятков форм параллельно, например для релокационного сервиса.

Что делать, если решение BLS CAPTCHA стабильно отклоняется формой?

Чаще всего дело не в самом решении, а в задержке между извлечением и отправкой: если изображения на странице успели обновиться, старое решение больше не совпадает с текущим набором картинок. Проверьте два момента:

  • Извлекайте и отправляйте задачу без промежуточных шагов — каждая лишняя секунда увеличивает риск, что картинки на странице обновятся.
  • Убедитесь, что нумерация image_base64_1…9 совпадает с порядком отображения на странице.

Можно ли решать BLS CAPTCHA без Selenium?

Да. API CaptchaAI работает с Base64-изображениями и текстом инструкции — ему всё равно, каким способом вы их получили.

Puppeteer, Playwright или прямые HTTP-запросы к странице подходят так же хорошо, если вы умеете забирать изображения и текст инструкции из DOM без полноценного браузерного драйвера Selenium.


Похожие материалы

Если этот сценарий — только часть более широкой интеграции с CaptchaAI, эти материалы закрывают смежные вопросы:

Комментарии для этой статьи отключены.