Comparisons

BLS CAPTCHA и reCAPTCHA Grid — сравнение

Короткий ответ: если перед вами BLS CAPTCHA, изображения придётся вытаскивать из DOM и решать напрямую через method=bls; если это reCAPTCHA Grid — сетку решает токен, и браузер вообще не обязателен (method=userrecaptcha). Обе капчи показывают картинки под текстовую подсказку, поэтому визуально их легко перепутать. Но BLS CAPTCHA — это собственная реализация BLS International, встроенная только в визовые системы записи, а reCAPTCHA — глобальный продукт Google. Отсюда и расходятся способ решения, объём интеграции и методы API в CaptchaAI.

Ключевые различия

Три вещи определяют всю интеграцию:

  • Формат. BLS отдаёт набор отдельных изображений (3–9 штук); reCAPTCHA — одну картинку, разбитую на сетку 3×3 или 4×4.
  • Способ решения. BLS решается по индексам изображений, reCAPTCHA — через строку токена.
  • Нужен ли браузер. BLS привязан к сессии страницы, поэтому браузер обязателен; reCAPTCHA Grid работает и по чистому HTTP.

Полная картина — ниже.

Характеристика BLS CAPTCHA reCAPTCHA Grid
Поставщик BLS International (собственная разработка) Google
Формат Отдельные изображения (3–9 штук) Одна картинка в сетке (3×3 или 4×4)
Динамические плитки Нет — фиксированный набор Да — плитки проявляются после клика
Поведенческий анализ Минимальный Развитый (мышь, тайминг, IP)
Оценка риска Нет Анализ риска на каждый запрос
Метод API method=bls method=userrecaptcha
Нужные параметры instructions, image_base64_1..9 googlekey, pageurl
Формат ответа Индексы изображений (например, 1,3,5) Строка токена
Решение через токен Нет — изображения решаются напрямую Да — метод токена обрабатывает сетку сам
Нужен ли браузер Да (изображения берутся из DOM) Необязательно
Где встречается Только порталы записи на визу BLS Миллионы сайтов по миру
Типичное время решения 5–15 секунд 10–30 секунд

Насколько сложна интеграция

Разница — в объёме работы на вашей стороне: для BLS вы сами извлекаете, кодируете и кликаете, а reCAPTCHA возвращает токен.

Аспект BLS reCAPTCHA Grid
Извлечение изображений Каждое достаётся из DOM вручную Не нужно — метод токена делает сам
Работа с инструкцией Нужно снять текст подсказки Не нужно
Кодирование в Base64 Обязательно для каждого изображения Не нужно
Применение решения Клик по индексам в нужном порядке Подстановка токена или HTTP POST
Автоматизация браузера Обязательна — headless-альтернативы нет Необязательна
Восстановление после ошибки Повторно извлечь изображения Повторно запросить токен
Параллельное решение Ограниченно — привязка к сессии браузера Легко — запросы токена без состояния
Строк кода (типично) 40–60 15–25

Итог: интеграция BLS обычно втрое длиннее.

Как решить BLS CAPTCHA через CaptchaAI

Для BLS нужно достать каждое изображение со страницы, закодировать его в base64 и отправить вместе с текстом инструкции.

Python:

import requests
import base64
import time
from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://example-bls-site.com/appointment")

# Step 1: Extract instruction text
instruction = driver.find_element(By.CSS_SELECTOR, ".captcha-instruction").text
# Example: "Select all images with a motorcycle"

# Step 2: Extract and encode each image
images = driver.find_elements(By.CSS_SELECTOR, ".captcha-image img")
image_data = {}
for i, img in enumerate(images, 1):
    # Get image source and convert to base64
    src = img.get_attribute("src")
    if src.startswith("data:image"):
        b64 = src.split(",")[1]
    else:
        img_bytes = requests.get(src).content
        b64 = base64.b64encode(img_bytes).decode()
    image_data[f"image_base64_{i}"] = b64

# Step 3: Submit to CaptchaAI
payload = {
    "key": "YOUR_API_KEY",
    "method": "bls",
    "instructions": instruction,
    **image_data
}
resp = requests.post("https://ocr.captchaai.com/in.php", data=payload)
task_id = resp.text.split("|")[1]

# Step 4: Poll for result
for _ in range(30):
    time.sleep(5)
    result = requests.get("https://ocr.captchaai.com/res.php", params={
        "key": "YOUR_API_KEY", "action": "get", "id": task_id
    })
    if result.text.startswith("OK|"):
        indices = result.text.split("|")[1]  # e.g., "1,3,5"
        break

# Step 5: Click the correct images
for idx in indices.split(","):
    images[int(idx) - 1].click()
    time.sleep(0.3)  # Small delay between clicks

Node.js:

const axios = require("axios");
const puppeteer = require("puppeteer");

(async () => {
  const browser = await puppeteer.launch({ headless: "new" });
  const page = await browser.newPage();
  await page.goto("https://example-bls-site.com/appointment");

  // Extract instruction text
  const instruction = await page.$eval(
    ".captcha-instruction",
    (el) => el.textContent,
  );

  // Extract images as base64
  const imageElements = await page.$$(".captcha-image img");
  const imageData = {};
  for (let i = 0; i < imageElements.length; i++) {
    const src = await imageElements[i].evaluate((el) => el.src);
    let b64;
    if (src.startsWith("data:image")) {
      b64 = src.split(",")[1];
    } else {
      const resp = await axios.get(src, { responseType: "arraybuffer" });
      b64 = Buffer.from(resp.data).toString("base64");
    }
    imageData[`image_base64_${i + 1}`] = b64;
  }

  // Submit to CaptchaAI
  const formData = new URLSearchParams({
    key: "YOUR_API_KEY",
    method: "bls",
    instructions: instruction,
    ...imageData,
  });
  const submitResp = await axios.post(
    "https://ocr.captchaai.com/in.php",
    formData.toString(),
  );
  const taskId = submitResp.data.split("|")[1];

  // Poll for result
  let indices;
  for (let i = 0; i < 30; i++) {
    await new Promise((r) => setTimeout(r, 5000));
    const result = await axios.get("https://ocr.captchaai.com/res.php", {
      params: { key: "YOUR_API_KEY", action: "get", id: taskId },
    });
    if (result.data.startsWith("OK|")) {
      indices = result.data.split("|")[1];
      break;
    }
  }

  // Click correct images
  for (const idx of indices.split(",")) {
    await imageElements[parseInt(idx) - 1].click();
    await new Promise((r) => setTimeout(r, 300));
  }

  await browser.close();
})();

Как решить reCAPTCHA Grid через CaptchaAI

Здесь подход основан на токене — извлекать изображения не нужно.

Python:

import requests
import time

# Step 1: Extract sitekey from page
# <div class="g-recaptcha" data-sitekey="6Le-wvkS..."></div>
sitekey = "6Le-wvkSAAAAAPBMRTvw..."
page_url = "https://example.com/form"

# Step 2: Submit to CaptchaAI
resp = requests.get("https://ocr.captchaai.com/in.php", params={
    "key": "YOUR_API_KEY",
    "method": "userrecaptcha",
    "googlekey": sitekey,
    "pageurl": page_url
})
task_id = resp.text.split("|")[1]

# Step 3: Poll for token
for _ in range(60):
    time.sleep(5)
    result = requests.get("https://ocr.captchaai.com/res.php", params={
        "key": "YOUR_API_KEY", "action": "get", "id": task_id
    })
    if result.text.startswith("OK|"):
        token = result.text.split("|")[1]
        break

# Step 4: Inject token (no clicking needed)
# Option A: Hidden field injection
driver.execute_script(
    f'document.getElementById("g-recaptcha-response").value = "{token}";'
)
# Option B: Pure HTTP submission
requests.post(page_url, data={"g-recaptcha-response": token, "other_field": "value"})

Node.js:

const axios = require("axios");

async function solveRecaptchaGrid(sitekey, pageUrl) {
  // Submit
  const submitResp = await axios.get("https://ocr.captchaai.com/in.php", {
    params: {
      key: "YOUR_API_KEY",
      method: "userrecaptcha",
      googlekey: sitekey,
      pageurl: pageUrl,
    },
  });
  const taskId = submitResp.data.split("|")[1];

  // Poll for token
  for (let i = 0; i < 60; i++) {
    await new Promise((r) => setTimeout(r, 5000));
    const result = await axios.get("https://ocr.captchaai.com/res.php", {
      params: { key: "YOUR_API_KEY", action: "get", id: taskId },
    });
    if (result.data.startsWith("OK|")) {
      return result.data.split("|")[1];
    }
  }
  throw new Error("Solve timed out");
}

Какой метод выбирать под задачу

Отталкивайтесь от того, кто выдал капчу и что она защищает:

  • Запись на визу через портал BLSmethod=bls с извлечением изображений.
  • Любой сайт с reCAPTCHAmethod=userrecaptcha с sitekey.
  • Портал BLS со встроенной reCAPTCHA — проверьте, что именно защищает действие: на сайтах BLS иногда стоят обе капчи.
  • Неизвестная капча из картинок — сначала ищите фирменную вёрстку BLS; если её нет, пробуйте reCAPTCHA или OCR.

Пример: стоимость при параллельном тестировании

Представьте агентство: оно прогоняет QA по нескольким staging-копиям визовых порталов и тестирует формы с reCAPTCHA Grid. Тарификация CaptchaAI считается по потокам, а не по числу решений: тариф BASIC ($15/мес, 5 потоков) даёт пять одновременных решений, а число решений на поток внутри месяца не ограничено. Токены reCAPTCHA не имеют состояния и занимают потоки пачками, тогда как BLS держит поток дольше. Под ощутимый параллельный BLS-трафик разумнее взять STANDARD ($30/мес, 15 потоков) — отдельной платы за решение здесь нет. Цены указаны в долларах.

Диагностика частых проблем

Проблема Что делать с BLS Что делать с reCAPTCHA
Вернулся неверный ответ Сверьте текст инструкции с тем, что показано на странице Проверьте, что sitekey и pageurl верны
Изображения не грузятся Передайте User-Agent и cookie при загрузке URL картинок Неприменимо — изображений для загрузки нет
Токен отклонён Кликайте по индексам в правильном порядке Подставьте токен в g-recaptcha-response и выполните обратный вызов
Решение идёт слишком медленно Отправляйте только видимые изображения Возьмите прокси ближе к целевому сайту

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

Короткие ответы на частые вопросы по выбору метода.

Поддерживает ли CaptchaAI и BLS CAPTCHA, и reCAPTCHA Grid?

Да. Обе — общедоступные типы: BLS решается методом bls, а сетка reCAPTCHA — методом userrecaptcha. Методы и параметры разные, но оба доступны по одному API-ключу.

Почему BLS требует браузер, а reCAPTCHA Grid — нет?

BLS отдаёт сами изображения, привязанные к сессии страницы: их нужно достать из DOM и кликнуть по индексам. reCAPTCHA работает через токен — вы отправляете googlekey и pageurl, получаете строку и подставляете её, так что браузер не обязателен.

Сколько потоков нужно для параллельного решения?

Один поток — это одно решение «в полёте». Токены reCAPTCHA освобождают поток быстро, поэтому пяти потоков BASIC часто хватает; BLS держит поток дольше из-за сессии браузера, так что под BLS-нагрузку берите тариф с большим числом потоков.

Как понять, какая капча стоит на странице портала BLS?

Смотрите разметку: у BLS обычно свой контейнер .captcha-image с отдельными тегами img, а у reCAPTCHA — блок g-recaptcha с data-sitekey. Порталы BLS иногда ставят капчу на входе и reCAPTCHA при отправке формы — проверяйте оба этапа.

Что делать, если решение BLS возвращает неверные индексы?

Чаще всего расходится текст инструкции: убедитесь, что сняли ровно ту подсказку, которую видит пользователь, и что порядок изображений в DOM совпадает с порядком отправки. Отправляйте только видимые изображения и кликайте строго по возвращённым индексам.

Связанные материалы

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