Use Cases

BLS CAPTCHA на правительственных порталах: стратегии обработки

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-режимом выше.

Что читать дальше

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