Troubleshooting

Ошибки BLS CAPTCHA и их устранение

У BLS CAPTCHA нет единого сообщения об ошибке на все случаи — сбой почти всегда указывает на конкретный этап конвейера: отправку запроса, извлечение изображений, применение решения или тайм-аут. Ниже — реальные коды ошибок CaptchaAI по BLS CAPTCHA, их причины и рабочие исправления.

Пример из практики: команда, тестирующая автоматизацию визовых порталов BLS International для заявителей из Казахстана и Беларуси, обычно ловит именно эти четыре типа ошибок при переносе Selenium-скрипта в staging.


С чего начать диагностику

Прежде чем искать код ошибки ниже, пройдите чек-лист — часто помогает за минуту:

Проверить Как
Инструкция извлечена? Выведите текст инструкции в лог и сверьте с тем, что видно в браузере
Изображения валидны? Сохраните base64-строку в файл и откройте — картинка должна открываться
Количество изображений совпадает? Сравните число отправленных image_base64_N с числом миниатюр на странице
Порядок изображений верный? Убедитесь, что порядок в DOM совпадает с порядком отображения
Префикс base64 убран? Уберите data:image/...;base64, перед отправкой
Формат решения понятен? Индексы через запятую, отсчёт с 1: "1,3,5"
Индексы пересчитаны? Вычтите 1 при обращении к массиву с отсчётом от 0

Не помогло — читайте разбор ниже.


Причины, которые не сводятся к одному коду ошибки

Не каждый сбой BLS CAPTCHA приходит с понятным кодом. На практике встречаются ещё три источника проблем, которые в логах выглядят как «всё зависло» или «ничего не произошло»:

  • Просроченный или неверный API-ключ. Запрос вернёт общую ошибку авторизации, а не ERROR_BAD_PARAMETERS — первым делом сверьте ключ в панели управления CaptchaAI.
  • Не хватает потоков на тарифе. Если параллельных задач больше, чем потоков в тарифе, часть запросов встаёт в очередь и выглядит как тайм-аут, хотя формально это не ошибка BLS.
  • Обрыв сети или прокси между вашим сервером и ocr.captchaai.com. Соединение, оборванное на середине запроса, тоже маскируется под зависшую задачу — добавьте таймаут на HTTP-клиенте и повторную отправку.

Ошибки при отправке запроса в API. Три кода, которые CaptchaAI возвращает ещё до того, как задача уходит на решение.

ERROR_BAD_PARAMETERS

Причина: в запросе не хватает обязательного параметра — инструкции или изображений.

Как исправить:

# WRONG — missing instructions
response = requests.post("https://ocr.captchaai.com/in.php", data={
    "key": API_KEY, "method": "bls",
    "image_base64_1": img1, "json": 1
})

# CORRECT — include instructions
response = requests.post("https://ocr.captchaai.com/in.php", data={
    "key": API_KEY, "method": "bls",
    "instructions": "Select all images with a car",
    "image_base64_1": img1, "json": 1
})

ERROR_WRONG_FILE_EXTENSION

Причина: изображение передано не в валидном base64 или в неподдерживаемом формате.

Как исправить:

  • изображения должны быть в base64-кодировке PNG или JPEG;
  • уберите префикс data:image/...;base64,;
  • проверьте, что base64-строка не обрезана.
import base64

# Strip the data URI prefix
src = img_element.get_attribute("src")
if src.startswith("data:image"):
    b64 = src.split(",")[1]
else:
    # Download and encode
    img_data = requests.get(src).content
    b64 = base64.b64encode(img_data).decode()

ERROR_CAPTCHA_UNSOLVABLE

Причина: изображения слишком низкого качества, размыты, либо инструкция сформулирована неоднозначно.

Как исправить:

  • снимайте изображения в полном разрешении;
  • убедитесь, что текст инструкции извлечён без искажений;
  • повторите попытку — часть заданий объективно сложнее остальных.

Ошибки извлечения изображений. Эта группа не связана с API CaptchaAI напрямую — проблема в том, как ваш код достаёт картинки со страницы BLS.

Изображения подгружаются динамически

Проблема: при первой отрисовке страницы изображений ещё нет в DOM.

Решение: дождитесь полной отрисовки CAPTCHA:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# Wait for captcha images to load
WebDriverWait(driver, 10).until(
    EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".captcha-image img"))
)

Изображения лежат в canvas, а не в img

Проблема: некоторые реализации BLS рисуют изображения на <canvas>, а не в обычных <img>-элементах.

Решение: извлекайте данные canvas в base64:

canvas_elements = driver.find_elements(By.CSS_SELECTOR, ".captcha-canvas")
for i, canvas in enumerate(canvas_elements, 1):
    b64 = driver.execute_script(
        "return arguments[0].toDataURL('image/png').split(',')[1];",
        canvas
    )
    payload[f"image_base64_{i}"] = b64

Изображения защищены от хотлинкинга

Проблема: при запросе URL изображения вне браузера сервер отвечает 403.

Решение: извлекайте изображения прямо в контексте браузера:

# Get image data from within the browser
b64 = driver.execute_script("""
    var img = arguments[0];
    var canvas = document.createElement('canvas');
    canvas.width = img.naturalWidth;
    canvas.height = img.naturalHeight;
    canvas.getContext('2d').drawImage(img, 0, 0);
    return canvas.toDataURL('image/png').split(',')[1];
""", img_element)

Ошибки при применении решения. Изображения извлечены верно, запрос ушёл, ответ получен — но капча всё равно не проходит.

Выбраны не те изображения

Причина: порядок изображений при извлечении не совпадает с порядком, в котором они показаны на экране.

Как исправить: сохраняйте единый порядок:

# Ensure images are indexed in display order
captcha_imgs = driver.find_elements(By.CSS_SELECTOR, ".captcha-image img")
# The order of find_elements matches DOM order = display order
for i, img in enumerate(captcha_imgs, 1):
    payload[f"image_base64_{i}"] = extract_base64(img)

Индексы решения не совпадают

Причина: CaptchaAI возвращает индексы с отсчётом от 1, а код на вашей стороне использует отсчёт от 0.

Как исправить:

solution = result["request"]  # e.g., "1,3,5"
indices = [int(i) for i in solution.split(",")]

# Convert to 0-based for array access
for idx in indices:
    captcha_imgs[idx - 1].click()  # 1-based → 0-based

Форма не отправляется после верного выбора

Причина: не хватает скрытых полей формы или дополнительных токенов.

Как исправить: проверьте скрытые поля, которые нужно отправить вместе с решением:

# Look for hidden captcha tokens
hidden_fields = driver.find_elements(By.CSS_SELECTOR, "input[type='hidden']")
for field in hidden_fields:
    name = field.get_attribute("name")
    value = field.get_attribute("value")
    print(f"Hidden field: {name}={value}")

Ошибки тайм-аута. Здесь виноват не код, а время: капча или ответ CaptchaAI успевают устареть до того, как форма их примет.

CAPTCHA истекает раньше, чем готово решение

Проблема: у BLS CAPTCHA короткое окно действия.

Как исправить:

  • извлекайте изображения и сразу отправляйте их в CaptchaAI;
  • не делайте паузу между извлечением и отправкой;
  • если решение занимает больше 60 секунд, капча, скорее всего, уже истекла — обновите страницу и повторите.

Опрос res.php затягивается

Как исправить: проверьте, что опрос настроен правильно:

# Standard polling pattern
for _ in range(30):  # 30 attempts × 5 seconds = 150 seconds max
    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"]
    if result.get("request") == "ERROR_CAPTCHA_UNSOLVABLE":
        # Don't keep polling — start over
        raise Exception("Unsolvable")

Как снизить число повторяющихся ошибок в продакшене

Большинство ошибок из этого гайда — разовые сбои, которые лечатся ретраем. Но если один и тот же код повторяется в логах пачками, стоит закрепить исправление в коде, а не чинить руками при каждом инциденте:

  1. Логируйте request и id из каждого ответа CaptchaAI — без этого сложно отличить ERROR_CAPTCHA_UNSOLVABLE от истёкшего тайм-аута постфактум.
  2. Добавьте автоматический ретрай на 1–2 попытки для ERROR_CAPTCHA_UNSOLVABLE, но не больше — бесконечный ретрай на нерешаемой капче просто тратит потоки впустую.
  3. Считайте долю ошибок по каждому коду отдельно — резкий рост именно ERROR_WRONG_FILE_EXTENSION, например, обычно значит, что BLS обновил вёрстку страницы, а не что временно барахлит сеть.

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

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

Отправьте все изображения из задания — обычно 3–9 штук, в параметрах image_base64_1image_base64_9. Меньшее количество обычно значит, что часть картинок не извлеклась.

Что делать, если постоянно приходит ERROR_CAPTCHA_UNSOLVABLE?

Сначала проверьте качество изображений: сохраните base64 в файл и откройте — размытая картинка не решается. Если с качеством всё в порядке, просто повторите отправку.

Как отличить тайм-аут от ошибки в выборе изображений?

Тайм-аут выглядит как валидный ответ CaptchaAI, который форма отклоняет как «истёкший» код. Ошибка выбора обычно возвращает конкретное сообщение о неверных индексах. Замерьте время от извлечения до отправки решения: больше 60 секунд обычно значит, что капча истекла.

Нужно ли переписывать код, если BLS изменит вёрстку CAPTCHA?

Да, но только часть, отвечающую за извлечение изображений и разбор DOM. Параметры запроса к CaptchaAI (method=bls, instructions, image_base64_N) не изменятся — обновлять придётся только ваш Selenium- или Puppeteer-код.

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

Для параллельного прогона нескольких форм хватит тарифа STANDARD ($30/мес, 15 потоков) — поток нужен на каждый одновременный запрос, а не на лицензию. При сотне и более тестов переходите на ADVANCE ($90/мес, 50 потоков).


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

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