Оба представляют изображения, которые пользователи должны выбрать на основе текстовой подсказки. Но BLS CAPTCHA — это индивидуальная реализация, используемая исключительно в визовых системах BLS International, а reCAPTCHA — это глобальное решение Google. Подходы к решению, требования к интеграции и методы API CaptchaAI существенно различаются.
Параллельное сравнение
| Особенность | BLS CAPTCHA | Сетка reCAPTCHA |
|---|---|---|
| Поставщик | BLS International (по индивидуальному заказу) | |
| Формат | Отдельные отдельные изображения (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 CAPTCHA с помощью CaptchaAI
BLS требует извлечь каждое изображение со страницы, закодировать его в base64 и отправить вместе с текстом инструкции.
Питон:
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 с помощью CaptchaAI
reCAPTCHA использует подход на основе токенов — извлечение изображений не требуется.
Питон:
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");
}
Сравнение сложности интеграции
| Аспект | БЛС | Сетка reCAPTCHA |
|---|---|---|
| Извлечение изображения | Необходимо вручную извлечь каждое изображение из DOM. | Не требуется — метод токена обрабатывается внутри |
| Обработка инструкций | Необходимо извлечь текстовую инструкцию со страницы | Не требуется |
| Кодировка Base64 | Требуется для каждого изображения | Не требуется |
| Применение решения | Щелкните отдельные изображения по возвращаемым индексам. | Внедрить токен в скрытое поле или HTTP POST |
| Автоматизация браузера | Требуется — нет headless альтернативы | Необязательно — можно использовать чистые HTTP-запросы. |
| Восстановление ошибок | Повторное извлечение изображений в случае сбоя | Повторный запрос токена в случае неудачи |
| Параллельное решение | Limited — изображения привязаны к сеансу браузера. | Легко — запросы токенов не имеют состояния. |
| Строки кода (типично) | 40-60 строк | 15-25 строк |
Когда использовать какой решатель
| Сценарий | Рекомендуемый подход |
|---|---|
| Запись на визу BLS | Используйте method=bls для извлечения изображений. |
| Любой сайт с reCAPTCHA | Используйте method=userrecaptcha с ключом сайта. |
| Сайт BLS со встроенной reCAPTCHA | Проверьте, какой из них охраняет действие — сайты BLS иногда используют оба |
| Неизвестная капча изображения | Сначала проверьте, имеет ли он бренд BLS; если нет, попробуйте методы reCAPTCHA или OCR. |
Поиск неисправностей
| Проблема | исправление BLS | исправление reCAPTCHA |
|---|---|---|
| Вернулся неправильный ответ | Проверьте, соответствует ли текст инструкции тому, что показано на странице. | Убедитесь, что ключ сайта и URL-адрес страницы указаны правильно. |
| Изображения не загружаются | Добавьте User-Agent и файлы cookie при получении URL-адресов изображений. |
Неприменимо – нет изображений для загрузки. |
| Токен отклонен | Щелкните индексы в правильном порядке на странице. | Внедрить в g-recaptcha-response И выполнить обратный вызов |
| Решайте слишком медленно | Уменьшите количество изображений — отправляйте только видимые изображения | Использовать прокси рядом с целевым сайтом |
Часто задаваемые вопросы
Что сложнее решить?
BLS требует дополнительной работы по интеграции (извлечение изображений, анализ инструкций и щелчки по индексам), но изображения обычно более четкие и простые. reCAPTCHA легче интегрировать (метод токенов), но проблемы Google могут быть более сложными при использовании динамических плиток.
Могу ли я использовать метод токена reCAPTCHA для BLS?
Нет. BLS не является реализацией reCAPTCHA. Вы должны использовать method=bls с отдельными изображениями в кодировке Base64 и текстом инструкций.
Оба используют технологии Google?
Нет. BLS CAPTCHA — это специальная собственная реализация, созданная для международных визовых служб BLS. reCAPTCHA — это продукт Google, используемый во всем мире на миллионах веб-сайтов.
Что более рентабельно решать в масштабе?
Решения с использованием токенов reCAPTCHA, как правило, более рентабельны для больших объемов операций, поскольку интеграция проще (нет затрат на извлечение изображений) и вы можете выполнять одновременные запросы без отслеживания состояния. Решение BLS требует сеанса браузера для каждого решения.
Могу ли я решить оба типа на одной странице?
Да. Некоторые сайты BLS используют собственную CAPTCHA для первоначальной проверки и reCAPTCHA для отправки формы. Определите каждый тип отдельно и используйте для каждого соответствующий метод CaptchaAI.
Связанные руководства
- Как решить BLS CAPTCHA шаг за шагом— полное пошаговое руководство по интеграции BLS
- Как решить reCAPTCHA v2 с помощью API— полное руководство по reCAPTCHA v2
- Объяснение проблемы сетки reCAPTCHA— как работают задачи сетки
- Ошибки BLS Captcha и их устранение— Исправлены ошибки, связанные с BLS.