Искажённый текст на картинке — самый старый тип CAPTCHA, но он всё ещё встречается на устаревших порталах, в личных кабинетах старых систем и в формах регистрации без современной защиты. Через API CaptchaAI такая CAPTCHA решается за секунды: вы отправляете изображение — файлом или строкой base64 — и получаете обратно распознанный текст, готовый для вставки в поле формы.
Схема работы одинакова для Python и Node.js и укладывается в четыре шага: получить картинку, отправить её в CaptchaAI, дождаться ответа и подставить текст в форму. Ниже — рабочий код для каждого шага, разбор необязательных параметров и полный пример целиком.
- Шаг 1 — сделать скриншот CAPTCHA или скачать её по прямой ссылке.
- Шаг 2 — отправить изображение в
/in.phpфайлом или base64. - Шаг 3 — опросить
res.phpи получить распознанный текст. - Шаг 4 — вставить текст в поле формы и отправить её.
Когда подходит этот способ
Метод post (Normal/Image OCR) годится для классической CAPTCHA — набора искажённых символов на статичной картинке, без перетаскивания элементов и без JS-виджета. Если на странице стоит reCAPTCHA, Cloudflare Turnstile или GeeTest, они решаются другими методами API — ссылки на соответствующие руководства ниже, в разделе «Похожие материалы».
- Классическая текстовая CAPTCHA на формах логина и регистрации — подходит.
- Устаревшие государственные и визовые порталы с картинкой вместо капчи — подходит; у CaptchaAI есть и отдельный специализированный метод
blsименно для BLS CAPTCHA, если сайт использует её. - Капча-выражение вида «3 + 7» — подходит, с параметром
calc=1(см. ниже). - Виджеты reCAPTCHA / Turnstile / GeeTest — не подходит, для них другой API-метод.
Что понадобится
- API-ключ CaptchaAI — получите на captchaai.com.
- Изображение CAPTCHA — файл (PNG/JPEG) или строка base64.
- Рантайм — Python 3.7+ или Node.js 14+.
Шаг 1. Получите изображение CAPTCHA
Если элемент с капчей отрисован прямо на странице, проще всего сделать скриншот именно этого элемента через Selenium — так в файл попадёт чистая картинка без остального интерфейса.
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://example.com/register")
captcha_el = driver.find_element(By.CSS_SELECTOR, "#captcha-image")
captcha_el.screenshot("captcha.png")
Если же сайт отдаёт капчу отдельным URL-эндпоинтом (частый случай на старых порталах), быстрее скачать файл напрямую и сразу перевести его в base64 — эта строка пригодится на следующем шаге.
import requests
import base64
img_url = "https://example.com/captcha/generate"
img_data = requests.get(img_url).content
# Save to file
with open("captcha.png", "wb") as f:
f.write(img_data)
# Or convert to base64
img_b64 = base64.b64encode(img_data).decode()
Шаг 2. Отправьте изображение в CaptchaAI
У /in.php два способа передать изображение — файлом (multipart/form-data) или строкой base64.
import requests
import time
API_KEY = "YOUR_API_KEY"
with open("captcha.png", "rb") as f:
response = requests.post("https://ocr.captchaai.com/in.php",
data={"key": API_KEY, "method": "post", "json": 1},
files={"file": ("captcha.png", f, "image/png")}
)
data = response.json()
task_id = data["request"]
print(f"Task: {task_id}")
Для сценариев на Selenium обычно удобнее base64 — скриншот и так уже лежит в памяти как байты, конвертировать его в отдельный файл лишний шаг.
response = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "base64",
"body": img_b64,
"json": 1
})
task_id = response.json()["request"]
На Node.js та же логика через axios:
const axios = require('axios');
const fs = require('fs');
async function submitImageCaptcha(imagePath) {
const imageB64 = fs.readFileSync(imagePath).toString('base64');
const { data } = await axios.post('https://ocr.captchaai.com/in.php', null, {
params: {
key: 'YOUR_API_KEY',
method: 'base64',
body: imageB64,
json: 1
}
});
return data.request;
}
Шаг 3. Опросите res.php и получите текст
Опрашивать res.php чаще раза в 5 секунд смысла нет: обычно текстовая CAPTCHA решается за 5–15 секунд. Пока задача не готова, поле request содержит CAPCHA_NOT_READY; любое другое значение при status != 1 — код ошибки, который стоит залогировать.
def get_text_solution(task_id):
for _ in range(30):
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"] # The recognized text
if result.get("request") != "CAPCHA_NOT_READY":
raise Exception(f"Error: {result['request']}")
raise Exception("Timeout")
text = get_text_solution(task_id)
print(f"CAPTCHA text: {text}")
async function getSolution(taskId) {
for (let i = 0; i < 30; i++) {
await new Promise(r => setTimeout(r, 5000));
const { data } = await axios.get('https://ocr.captchaai.com/res.php', {
params: { key: 'YOUR_API_KEY', action: 'get', id: taskId, json: 1 }
});
if (data.status === 1) return data.request;
if (data.request !== 'CAPCHA_NOT_READY') throw new Error(data.request);
}
throw new Error('Timeout');
}
Шаг 4. Подставьте текст в форму
Дальше — обычная работа с DOM: очистите поле, впишите распознанный текст и отправьте форму тем же драйвером, которым делали скриншот.
# Type the solved text into the CAPTCHA input
captcha_input = driver.find_element(By.CSS_SELECTOR, "#captcha-input")
captcha_input.clear()
captcha_input.send_keys(text)
# Submit the form
driver.find_element(By.CSS_SELECTOR, "form").submit()
Необязательные параметры для точного распознавания
Параметры-подсказки не меняют сам алгоритм, но резко снижают шум. Если вы точно знаете, что перед вами четырёхзначный код из цифр, задайте numeric=1, min_len=4, max_len=4 — и решатель не спутает похожие символы вроде 0 и O.
numeric—1ограничивает набор только цифрами,2— только буквами.min_len/max_len— минимальная и максимальная длина текста (целое число).language—0любой алфавит,1кириллица,2латиница.calc—1, если CAPTCHA — математическое выражение («3 + 7» вернёт «10»).phrase—1, если в тексте CAPTCHA есть пробелы.regsense—1, если важен регистр букв.
response = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "base64",
"body": img_b64,
"numeric": 1, # Digits only
"min_len": 4, # At least 4 characters
"max_len": 6, # At most 6 characters
"json": 1
})
Типичные ошибки при распознавании
- Не заданы параметры-подсказки. Без
numeric/min_len/max_lenрешатель перебирает весь алфавит и чаще путает похожие символы — задавайте их всегда, когда формат текста известен заранее. - Слишком частый опрос
res.php. Опрос раз в секунду не ускоряет решение, а только тратит лимит запросов; 5 секунд между попытками — разумный шаг. - Регистр теряется. Без
regsense=1решатель по умолчанию может вернуть текст в нижнем регистре, даже если на картинке были заглавные буквы. - Скриншот с лишним фоном. Если захватывать не сам элемент капчи, а весь блок формы, в кадр попадает интерфейс — это снижает точность распознавания.
Полный пример на Python
Ниже — весь цикл целиком: захват скриншота, отправка в CaptchaAI, опрос результата и подстановка текста в форму.
import requests
import time
import base64
from selenium import webdriver
from selenium.webdriver.common.by import By
API_KEY = "YOUR_API_KEY"
# 1. Get the page and capture captcha
driver = webdriver.Chrome()
driver.get("https://example.com/register")
captcha_el = driver.find_element(By.CSS_SELECTOR, "#captcha-image")
captcha_el.screenshot("captcha.png")
# 2. Submit to CaptchaAI
with open("captcha.png", "rb") as f:
img_b64 = base64.b64encode(f.read()).decode()
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY, "method": "base64", "body": img_b64, "json": 1
}).json()
task_id = resp["request"]
# 3. Get solution
for _ in range(30):
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:
text = result["request"]
break
# 4. Type and submit
driver.find_element(By.CSS_SELECTOR, "#captcha-input").send_keys(text)
driver.find_element(By.CSS_SELECTOR, "form").submit()
print(f"Solved: {text}")
driver.quit()
Готовый проект на GitHub
Нужен полноценный рабочий проект — с настройкой окружения, повторными попытками и обработкой ошибок? Полный работоспособный пример см. на GitHub →.
Частые вопросы
Где сегодня ещё встречается такая CAPTCHA?
На устаревших государственных и визовых порталах, в личных кабинетах старых CMS и в формах регистрации, которые не обновлялись годами, — там до сих пор стоит классический искажённый текст вместо reCAPTCHA или Turnstile. Логика решения та же: захватите изображение, отправьте в /in.php, подставьте распознанный текст в поле.
Обязательно ли использовать Selenium, чтобы получить изображение?
Нет. Selenium нужен только если капча — элемент внутри уже отрисованной страницы и её нельзя скачать напрямую. Если сайт отдаёт изображение по отдельному URL, достаточно обычного requests.get() — см. второй способ в шаге 1.
Сколько потоков нужно для обработки большого объёма изображений?
Один поток обрабатывает одну задачу за раз, а типичное время решения (5–15 секунд) определяет, сколько изображений в час пройдёт через каждый поток:
- BASIC ($15/мес, 5 потоков) — для нескольких сотен запросов в час.
- STANDARD ($30/мес, 15 потоков) — для более плотного потока задач.
- ADVANCE ($90/мес, 50 потоков) и выше — для промышленных объёмов; полный список тарифов смотрите на сайте CaptchaAI.
Что делать, если текст CAPTCHA чувствителен к регистру?
Установите regsense=1 — так решатель сохранит исходный регистр букв. Без этого параметра результат может прийти в нижнем регистре, даже если на картинке были заглавные буквы.
Как сообщить о неправильном решении?
Отправьте запрос на https://ocr.captchaai.com/res.php?key=KEY&action=reportbad&id=TASK_ID. Это помогает CaptchaAI повышать точность распознавания и может вернуть списанные средства за конкретную задачу.
Итоги
Решение CAPTCHA изображений через API CaptchaAI — это четыре простых шага: захват картинки, отправка в /in.php, опрос res.php и подстановка текста в форму. Параметры-подсказки (numeric, min_len, regsense и другие) стоит задавать всегда, когда формат текста известен заранее, — это заметно снижает число ошибок распознавания.
Похожие материалы
- Как устроено распознавание текстовых CAPTCHA (OCR)
- Частые ошибки OCR-распознавания и как их избежать
- Что такое Solve Media CAPTCHA