API Tutorials

Решение CAPTCHA изображений с помощью API

Искажённый текст на картинке — самый старый тип 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.

  • numeric1 ограничивает набор только цифрами, 2 — только буквами.
  • min_len / max_len — минимальная и максимальная длина текста (целое число).
  • language0 любой алфавит, 1 кириллица, 2 латиница.
  • calc1, если CAPTCHA — математическое выражение («3 + 7» вернёт «10»).
  • phrase1, если в тексте CAPTCHA есть пробелы.
  • regsense1, если важен регистр букв.
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 и другие) стоит задавать всегда, когда формат текста известен заранее, — это заметно снижает число ошибок распознавания.


Похожие материалы

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