BLS CAPTCHA почти всегда стоит на последнем шаге формы: при выборе слота записи на визу, перед загрузкой документов или при проверке статуса заявления. Задача решается через API CaptchaAI — сервис принимает изображение и код instructions, и в большинстве интеграций сложность не в самой CAPTCHA, а в сессии портала вокруг неё: cookie, CSRF-токен и таймаут нужно синхронизировать с моментом отправки ответа. Ниже — какие форматы заданий встречаются у BLS CAPTCHA, как передать её в CaptchaAI по шагам и какие сценарии на практике чаще всего ломают автоматизацию.
Какие форматы заданий использует BLS CAPTCHA
BLS CAPTCHA чаще всего представлена как:
- изображение с искажённым текстом;
- задача с математическим выражением;
- задание на выбор нужных изображений;
- текстовая головоломка.
Формат может меняться от запроса к запросу в рамках одной и той же формы. Поэтому каждому заданию нужен свой код instructions — он сообщает CaptchaAI, какую логику обработки применить именно к этому типу CAPTCHA, а не универсальный шаблон.
Где на портале появляется BLS CAPTCHA
BLS CAPTCHA встречается на порталах государственных услуг, в частности:
| Тип портала | Где стоит CAPTCHA | Зачем |
|---|---|---|
| Запись на визу | Перед выбором слота | Не даёт автоматически захватывать места записи |
| Формы загрузки документов | Перед отправкой | Проверяет, что действие выполняет человек |
| Проверка статуса заявления | Перед показом статуса | Ограничивает частоту автоматических проверок |
| Формы заявок | Перед отправкой формы | Не даёт автоматически отправлять заявки |
Как решить BLS CAPTCHA через API CaptchaAI
Шаг 1. Получите изображение CAPTCHA и инструкции
import requests
from bs4 import BeautifulSoup
import base64
session = requests.Session()
# Load the portal page
page = session.get("https://portal.example.gov/appointment")
soup = BeautifulSoup(page.text, "html.parser")
# Find the CAPTCHA image
captcha_img = soup.select_one("img#captcha-image, img.captcha")
captcha_url = captcha_img["src"]
# Download the CAPTCHA image
if captcha_url.startswith("data:"):
# Base64 encoded inline image
img_data = captcha_url.split(",")[1]
else:
# URL-referenced image
img_response = session.get(captcha_url)
img_data = base64.b64encode(img_response.content).decode()
Шаг 2. Отправьте задание в CaptchaAI
import time
def solve_bls_captcha(image_base64, instructions=""):
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": "YOUR_API_KEY",
"method": "base64",
"body": image_base64,
"instructions": instructions,
"json": 1
})
task_id = resp.json()["request"]
for _ in range(30):
time.sleep(3)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": "YOUR_API_KEY",
"action": "get",
"id": task_id,
"json": 1
})
data = result.json()
if data["status"] == 1:
return data["request"]
raise TimeoutError("BLS solve timed out")
# Solve
captcha_answer = solve_bls_captcha(img_data)
Шаг 3. Отправьте форму
# Find form fields
form_data = {
"captcha_response": captcha_answer,
"appointment_type": "visa",
"location": "embassy-city",
# ... other form fields
}
# Submit with the same session (cookies preserved)
result = session.post(
"https://portal.example.gov/appointment/submit",
data=form_data
)
if "success" in result.text.lower():
print("Form submitted successfully")
Типичные ошибки при решении BLS CAPTCHA
| Проблема | Причина | Решение |
|---|---|---|
| «Сессия истекла» сразу после решения | Между решением CAPTCHA и отправкой формы прошло слишком много времени | Решайте CAPTCHA непосредственно перед отправкой формы |
| Изображение CAPTCHA не загружается | Портал требует конкретный заголовок Referer | Указывайте Referer с URL страницы портала |
| Ответ верный, но форма отклонена | Не передан CSRF-токен или скрытые поля формы | Извлекайте все скрытые поля формы перед отправкой |
| Портал блокирует после нескольких попыток | Сработало ограничение частоты запросов | Разносите попытки по времени, при необходимости меняйте IP |
| Каждый раз новое задание | Портал генерирует новую CAPTCHA на каждый запрос | Получайте свежее изображение и решайте заново при каждой попытке |
Типовые сценарии на BLS-порталах
Сценарий 1. Многоэтапные формы
Госпорталы часто строят запись на визу как многоэтапную форму, где CAPTCHA появляется на последнем шаге:
# Step 1: Select service type
session.post(url, data={"service": "passport"})
# Step 2: Fill personal details
session.post(url, data={"name": "...", "dob": "..."})
# Step 3: Select appointment slot
session.post(url, data={"slot": "2026-04-10-09:00"})
# Step 4: Solve CAPTCHA and confirm
captcha_answer = solve_bls_captcha(get_captcha_image(session))
session.post(url, data={"captcha": captcha_answer, "confirm": "true"})
Именно на этом шаге чаще всего теряют время: пока заполнялись предыдущие поля, сессия могла устареть, и CAPTCHA нужно запрашивать заново, а не переиспользовать уже полученное изображение.
Сценарий 2. Обновление CAPTCHA после неверного ответа
Если ответ CAPTCHA неверный, портал выпускает новое задание:
max_attempts = 3
for attempt in range(max_attempts):
# Get fresh CAPTCHA for each attempt
captcha_image = get_captcha_image(session)
answer = solve_bls_captcha(captcha_image)
result = session.post(submit_url, data={"captcha": answer})
if "incorrect" not in result.text.lower():
break
print(f"Attempt {attempt + 1} — CAPTCHA refreshed, retrying")
Сценарий 3. Сессии с ограничением по времени
Госпорталы обычно завершают сессию через фиксированный интервал:
import time
session_start = time.time()
SESSION_TIMEOUT = 600 # 10 minutes typical
def check_session_valid():
elapsed = time.time() - session_start
if elapsed > SESSION_TIMEOUT - 60: # 1 min safety margin
print("Session expiring — refresh needed")
return False
return True
# Before CAPTCHA submission
if not check_session_valid():
# Start a fresh session
session = requests.Session()
session.get(portal_url)
session_start = time.time()
На практике: визовые агентства и консультанты, которые параллельно ведут по несколько заявок клиентов, обычно вручную проверяют анкетные данные перед отправкой и поручают решение CAPTCHA API — так меньше ошибок ввода в пиковый сезон подачи документов. Автоматизация здесь снимает узкое место в самой CAPTCHA, а не решает вопрос очереди слотов — свободные места на портале появляются и пропадают независимо от того, как быстро решена CAPTCHA.
На что обратить внимание при управлении сессией
Госпорталы жёстко следят за состоянием сессии:
| Требование | Как выполнить |
|---|---|
| Точно сохранять cookie | Используйте requests.Session() или постоянный контекст браузера |
| Не превышать лимит запросов | Добавляйте паузы между загрузками страниц (2–5 секунд) |
| Обрабатывать CSRF-токены | Извлекайте токен со страницы и передавайте в каждом POST |
| Соблюдать таймаут сессии | Укладывайте решение CAPTCHA и отправку формы в окно таймаута |
| Следовать редиректам | Разрешите автоматические редиректы в HTTP-клиенте |
Браузерная автоматизация: когда нужен JavaScript
Часть порталов рисует CAPTCHA на canvas или требует JS-рендеринг — в этом случае нужен полноценный браузер:
const puppeteer = require('puppeteer');
async function handleBLSPortal() {
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
await page.goto('https://portal.example.gov/appointment');
// Wait for CAPTCHA to load
await page.waitForSelector('img#captcha-image');
// Get CAPTCHA image as base64
const imgBase64 = await page.evaluate(() => {
const img = document.querySelector('img#captcha-image');
const canvas = document.createElement('canvas');
canvas.width = img.naturalWidth;
canvas.height = img.naturalHeight;
const ctx = canvas.getContext('2d');
ctx.drawImage(img, 0, 0);
return canvas.toDataURL('image/png').split(',')[1];
});
// Solve with CaptchaAI
const answer = await solveBLSCaptcha(imgBase64);
// Type the answer
await page.type('#captcha-input', answer);
// Submit
await page.click('#submit-button');
// Wait for result
await page.waitForNavigation();
}
Частые вопросы
Законно ли автоматизировать работу с BLS-порталом?
Сама по себе автоматизация формы не запрещена, но условия использования конкретного портала и местное законодательство могут ограничивать частоту обращений и объём собираемых данных. Агентствам и визовым консультантам, которые ведут заявки клиентов, стоит прописывать это в договоре и логировать только те данные, которые действительно нужны для заявления — принцип минимизации данных из 152-ФЗ «О персональных данных» и подхода GDPR здесь одинаково применим.
Сколько времени занимает решение BLS CAPTCHA через CaptchaAI?
Формат BLS CAPTCHA простой — изображение или локальная логическая задача, поэтому CaptchaAI обрабатывает такие задания меньше чем за секунду, с высокой долей успешных решений на поддерживаемых типах. Основная задержка в реальных сценариях — не решение CAPTCHA, а таймаут сессии портала, который нужно уложить в окно SESSION_TIMEOUT.
Что делать, если один и тот же портал выдаёт CAPTCHA разных форматов?
BLS-порталы могут чередовать искажённый текст, математические выражения и выбор изображений в рамках одной формы. Передавайте в CaptchaAI код instructions, который описывает конкретный тип задания, — сервис применит соответствующую логику обработки для каждого запроса отдельно.
Нужен ли прокси для автоматизации BLS-портала?
Не всегда. Если сценарий работает от одного аккаунта из одной сети, прокси не обязателен. Он имеет смысл как обычная инфраструктурная мера для распределения нагрузки при легитимном многопоточном тестировании — не как способ обойти лимиты конкретного портала.
HTTP-запросы или браузерная автоматизация — что выбрать?
Если портал отдаёт CAPTCHA обычным изображением без сложного JS-рендеринга, requests.Session() быстрее и проще в поддержке. Браузерная автоматизация нужна только там, где изображение собирается на canvas или есть сложная клиентская валидация — как в примере с headless-режимом выше.