У 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")
Как снизить число повторяющихся ошибок в продакшене
Большинство ошибок из этого гайда — разовые сбои, которые лечатся ретраем. Но если один и тот же код повторяется в логах пачками, стоит закрепить исправление в коде, а не чинить руками при каждом инциденте:
- Логируйте
requestиidиз каждого ответа CaptchaAI — без этого сложно отличитьERROR_CAPTCHA_UNSOLVABLEот истёкшего тайм-аута постфактум. - Добавьте автоматический ретрай на 1–2 попытки для
ERROR_CAPTCHA_UNSOLVABLE, но не больше — бесконечный ретрай на нерешаемой капче просто тратит потоки впустую. - Считайте долю ошибок по каждому коду отдельно — резкий рост именно
ERROR_WRONG_FILE_EXTENSION, например, обычно значит, что BLS обновил вёрстку страницы, а не что временно барахлит сеть.
Часто задаваемые вопросы
Сколько изображений отправлять в CaptchaAI при решении BLS CAPTCHA?
Отправьте все изображения из задания — обычно 3–9 штук, в параметрах image_base64_1…image_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 потоков).