Туториалы по API

Рекомендации по кодированию изображений CAPTCHA Base64

Правильное кодирование изображений CAPTCHA в base64 — первый шаг к надежному решению. Неправильная кодировка означает неправильные ответы или ошибки. В этом руководстве рассказывается, как правильно это сделать.


Формат отправки Base64

CaptchaAI принимает CAPTCHA изображений в формате base64 через параметр method=base64:

import requests
import base64
import os


def submit_image_captcha(image_base64):
    """Submit base64-encoded image to CaptchaAI."""
    resp = requests.post("https://ocr.captchaai.com/in.php", data={
        "key": os.environ["CAPTCHAAI_API_KEY"],
        "method": "base64",
        "body": image_base64,
        "json": 1,
    }, timeout=30)
    return resp.json()

Кодирование из файла

# from_file.py
import base64


def encode_from_file(filepath):
    """Read an image file and return base64 string."""
    with open(filepath, "rb") as f:
        raw = f.read()
    return base64.b64encode(raw).decode("ascii")


# Usage
b64 = encode_from_file("captcha.png")
print(f"Encoded length: {len(b64)} chars")

Кодирование из URL

# from_url.py
import requests
import base64


def encode_from_url(image_url):
    """Download image and return base64 string."""
    resp = requests.get(image_url, timeout=15)
    resp.raise_for_status()

    # Verify it's actually an image
    content_type = resp.headers.get("Content-Type", "")
    if not content_type.startswith("image/"):
        raise ValueError(f"Not an image: {content_type}")

    return base64.b64encode(resp.content).decode("ascii")


# Usage
b64 = encode_from_url("https://example.com/captcha.png")

Кодирование со снимка экрана Selenium

# from_selenium.py
import base64
from selenium.webdriver.common.by import By


def encode_from_element(driver, selector):
    """Screenshot a specific element and return base64."""
    element = driver.find_element(By.CSS_SELECTOR, selector)
    screenshot_b64 = element.screenshot_as_base64
    return screenshot_b64


def encode_from_page_crop(driver, selector):
    """Crop a specific region from the page screenshot."""
    from PIL import Image
    import io

    element = driver.find_element(By.CSS_SELECTOR, selector)
    location = element.location
    size = element.size

    # Full page screenshot
    png = driver.get_screenshot_as_png()
    img = Image.open(io.BytesIO(png))

    # Crop to element bounds
    left = location["x"]
    top = location["y"]
    right = left + size["width"]
    bottom = top + size["height"]
    cropped = img.crop((left, top, right, bottom))

    # Encode
    buffer = io.BytesIO()
    cropped.save(buffer, format="PNG")
    return base64.b64encode(buffer.getvalue()).decode("ascii")

Распространенные ошибки кодирования

Ошибка 1: включение префикса URI данных

# WRONG — includes data URI prefix
bad = "data:image/png;base64,iVBORw0KGgo..."

# RIGHT — raw base64 only
good = "iVBORw0KGgo..."

# Fix: Strip the prefix
def clean_base64(b64_string):
    if "," in b64_string:
        return b64_string.split(",", 1)[1]
    return b64_string

Ошибка 2: двойное кодирование

# WRONG — encoding an already-encoded string
already_b64 = element.screenshot_as_base64
double_encoded = base64.b64encode(already_b64.encode()).decode()  # BAD

# RIGHT — use as-is
correct = element.screenshot_as_base64  # Already base64

Ошибка 3: кодирование текста вместо байтов

# WRONG — reading as text
with open("captcha.png", "r") as f:  # Text mode
    content = f.read()  # Corrupted binary data

# RIGHT — reading as bytes
with open("captcha.png", "rb") as f:  # Binary mode
    content = f.read()
encoded = base64.b64encode(content).decode("ascii")

Проверка перед отправкой

# validate.py
import base64
import io


def validate_captcha_image(b64_string):
    """Validate base64 image before submitting to CaptchaAI."""
    errors = []

    # Check for data URI prefix
    if b64_string.startswith("data:"):
        errors.append("Contains data URI prefix — strip it")
        b64_string = b64_string.split(",", 1)[1]

    # Try decoding
    try:
        decoded = base64.b64decode(b64_string)
    except Exception as e:
        return {"valid": False, "errors": [f"Invalid base64: {e}"]}

    # Check size
    size_kb = len(decoded) / 1024
    if size_kb < 1:
        errors.append(f"Image too small ({size_kb:.1f} KB) — likely corrupt")
    if size_kb > 500:
        errors.append(f"Image large ({size_kb:.1f} KB) — consider resizing")

    # Check image format
    if decoded[:8] == b'\x89PNG\r\n\x1a\n':
        fmt = "PNG"
    elif decoded[:3] == b'\xff\xd8\xff':
        fmt = "JPEG"
    elif decoded[:4] == b'GIF8':
        fmt = "GIF"
    elif decoded[:4] == b'RIFF':
        fmt = "WEBP"
    else:
        errors.append("Unknown image format")
        fmt = "unknown"

    return {
        "valid": len(errors) == 0,
        "format": fmt,
        "size_kb": round(size_kb, 1),
        "errors": errors,
    }


# Usage
result = validate_captcha_image(b64_string)
if not result["valid"]:
    print(f"Issues: {result['errors']}")
else:
    print(f"Valid {result['format']}, {result['size_kb']} KB")

Рекомендации по формату изображения

Формат подходящий для Размер Качество
PNG Текстовые CAPTCHA, скриншоты Больше без потерь
JPEG CAPTCHA на основе фотографий Меньший С потерями (качество использования ≥ 85)
гифка Анимированные CAPTCHA Переменная Ограниченное количество цветов
ВЕБП Современные браузеры Самый маленький Хорошее качество

Рекомендация. Для текстовых CAPTCHA используйте PNG. Сжатие без потерь сохраняет края символов, повышая точность решения.


Поиск неисправностей

Проблема Причина Исправить
ERROR_WRONG_FILE_EXTENSION Неверные данные base64 Подтвердите с помощью validate_captcha_image()
ERROR_TOO_BIG_CAPTCHA_FILESIZE Изображение более 600 КБ Изменение размера или сжатие перед кодированием
ERROR_ZERO_CAPTCHA_FILESIZE Пустое или поврежденное изображение Проверьте, загрузка прошла успешно
Неправильный результат решения Чрезмерно сжатый JPEG Используйте качество PNG или JPEG — 85 ¥.

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

Какой максимальный размер изображения принимает CaptchaAI?

600 КБ для тела base64. Измените размер больших снимков экрана перед кодированием.

Должен ли я использовать PNG или JPEG для текстовых CAPTCHA?

PNG. Сжатие JPEG может размыть края символов, что снижает точность. PNG сохраняет точные пиксели.

Могу ли я отправлять изображения SVG?

Нет. Сначала преобразуйте SVG в PNG, используя такую ​​библиотеку, как Pillow или cairosvg.


Связанные руководства


Правильно кодируйте CAPTCHA —начни с CaptchaAI.

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