Устранение неполадок

Изображение CAPTCHA возвращает неправильный ответ: оптимизация качества

Если CaptchaAI возвращает неправильные ответы на CAPTCHA изображения, проблема почти всегда связана с отправляемым изображением, а не с решением. Вот как это диагностировать и исправить.


Распространенные причины неправильных ответов

Причина Частота Исправить
Изображение обрезано неправильно Очень часто Захватите полный элемент CAPTCHA
Низкое разрешение/сжатие Общий Отправить изображение более высокого качества
Неправильная кодировка изображения Общий Проверьте кодировку base64
Отсутствует язык/type Подсказка Случайный Добавьте language или textinstructions.
Устаревшее изображение/expired Случайный Прежде чем решать, сделайте свежее изображение.

Исправление 1: проверьте качество изображения перед отправкой

import base64
from io import BytesIO
from PIL import Image


def validate_captcha_image(image_path):
    """Check image quality before submitting to CaptchaAI."""
    img = Image.open(image_path)
    width, height = img.size
    issues = []

    # Minimum resolution
    if width < 50 or height < 20:
        issues.append(f"Too small: {width}x{height}px (min 50x20)")

    # Check if mostly blank
    pixels = list(img.getdata())
    if img.mode == "RGB":
        white_count = sum(1 for p in pixels if p[0] > 250 and p[1] > 250 and p[2] > 250)
    else:
        white_count = sum(1 for p in pixels if p > 250)

    blank_ratio = white_count / len(pixels)
    if blank_ratio > 0.95:
        issues.append(f"Image appears blank ({blank_ratio:.0%} white)")

    # File size check
    img_bytes = BytesIO()
    img.save(img_bytes, format="PNG")
    size_kb = img_bytes.tell() / 1024
    if size_kb < 1:
        issues.append(f"File too small ({size_kb:.1f} KB) — may be empty")
    if size_kb > 600:
        issues.append(f"File too large ({size_kb:.0f} KB) — submit under 600 KB")

    return issues


issues = validate_captcha_image("captcha.png")
if issues:
    for issue in issues:
        print(f"WARNING: {issue}")
else:
    print("Image quality OK")

Исправление 2: правильная кодировка Base64

import base64


def encode_captcha(image_path):
    """Properly encode a CAPTCHA image to base64."""
    with open(image_path, "rb") as f:
        raw = f.read()

    encoded = base64.b64encode(raw).decode("ascii")

    # Verify round-trip
    decoded = base64.b64decode(encoded)
    assert decoded == raw, "Base64 encoding corrupted the image"

    return encoded


# WRONG — encoding a file path string
bad = base64.b64encode(b"captcha.png").decode()  # Encodes filename, not image!

# CORRECT — encoding file contents
with open("captcha.png", "rb") as f:
    good = base64.b64encode(f.read()).decode()

Исправление 3: предварительная обработка изображения

from PIL import Image, ImageFilter, ImageEnhance
from io import BytesIO
import base64


def preprocess_captcha(image_path):
    """Improve image quality for better OCR accuracy."""
    img = Image.open(image_path)

    # Convert to RGB if needed
    if img.mode != "RGB":
        img = img.convert("RGB")

    # Upscale small images
    width, height = img.size
    if width < 200:
        scale = 200 / width
        img = img.resize(
            (int(width * scale), int(height * scale)),
            Image.LANCZOS,
        )

    # Increase contrast
    enhancer = ImageEnhance.Contrast(img)
    img = enhancer.enhance(1.5)

    # Sharpen
    img = img.filter(ImageFilter.SHARPEN)

    # Convert to PNG bytes
    buffer = BytesIO()
    img.save(buffer, format="PNG")
    return base64.b64encode(buffer.getvalue()).decode()

Исправление 4: добавьте подсказки по типу и языку

import requests


def solve_image(api_key, image_base64, **hints):
    """Submit image CAPTCHA with quality hints."""
    data = {
        "key": api_key,
        "method": "base64",
        "body": image_base64,
        "json": 1,
    }

    # Add optional hints for better accuracy
    if "language" in hints:
        data["language"] = hints["language"]  # 0=default, 1=Cyrillic, 2=Latin
    if "textinstructions" in hints:
        data["textinstructions"] = hints["textinstructions"]
    if "numeric" in hints:
        data["numeric"] = hints["numeric"]  # 1=digits only, 2=letters only
    if "min_len" in hints:
        data["min_len"] = hints["min_len"]
    if "max_len" in hints:
        data["max_len"] = hints["max_len"]

    resp = requests.post("https://ocr.captchaai.com/in.php", data=data, timeout=30)
    return resp.json()


# Example: Digits-only CAPTCHA, 4-6 characters
result = solve_image(
    "YOUR_API_KEY",
    encoded_image,
    numeric=1,
    min_len=4,
    max_len=6,
)

# Example: Case-sensitive text
result = solve_image(
    "YOUR_API_KEY",
    encoded_image,
    textinstructions="Case-sensitive, enter exactly as shown",
)

Исправление 5. Захват полного элемента CAPTCHA

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


def capture_captcha_element(driver, selector):
    """Screenshot only the CAPTCHA element, not the full page."""
    element = driver.find_element(By.CSS_SELECTOR, selector)

    # Element screenshot (better than page crop)
    png_bytes = element.screenshot_as_png

    # Verify it's not empty
    if len(png_bytes) < 500:
        raise ValueError("Screenshot too small — element may not be visible")

    return base64.b64encode(png_bytes).decode()


# Usage
driver = webdriver.Chrome()
driver.get("https://example.com")
image_b64 = capture_captcha_element(driver, "img#captchaImage")

Исправление 6. Обработка динамических капч /Rotating

import time


def solve_with_fresh_image(driver, api_key, captcha_selector):
    """Capture and solve CAPTCHA immediately to avoid expiry."""
    # Wait for CAPTCHA to load fully
    time.sleep(2)

    # Capture fresh
    element = driver.find_element(By.CSS_SELECTOR, captcha_selector)
    png_bytes = element.screenshot_as_png
    body = base64.b64encode(png_bytes).decode()

    # Submit immediately
    resp = requests.post("https://ocr.captchaai.com/in.php", data={
        "key": api_key,
        "method": "base64",
        "body": body,
        "json": 1,
    }, timeout=30)
    result = resp.json()

    if result.get("status") != 1:
        raise RuntimeError(result.get("request"))

    task_id = result["request"]

    # Poll — image CAPTCHAs solve fast
    time.sleep(5)
    for _ in range(12):
        resp = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": api_key, "action": "get",
            "id": task_id, "json": 1,
        }, timeout=15)
        data = resp.json()

        if data.get("status") == 1:
            return data["request"]
        if data["request"] != "CAPCHA_NOT_READY":
            raise RuntimeError(data["request"])
        time.sleep(3)

    raise TimeoutError("Image solve timeout")

Контрольный список устранения неполадок

Симптом Диагностика Исправить
Ответ - бред Кодировка Base64 неправильная Проверка двусторонней кодировки
Ответ близок, но неверен Низкое качество изображения Предварительная обработка: повышение качества, резкость, контрастность
В ответе неправильное количество символов Отсутствуют подсказки по длине Добавьте параметры min_len/max_len
В ответе смешиваются буквы/digits Отсутствует подсказка типа Добавьте числовое значение=1 или числовое значение=2.
Возвратился пустой ответ Пустое изображение/corrupted Подтвердите изображение перед отправкой
Правильный ответ, но сайт отклоняет Чувствительность к регистру Добавить текстовые инструкции для случая

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

Насколько точен CaptchaAI для CAPTCHA изображений?

При правильно отправленных изображениях CaptchaAI поддерживает более 27 500 типов CAPTCHA с высокой точностью. Большинство сбоев связано с плохим качеством изображения или неправильными параметрами.

Нужно ли предварительно обрабатывать изображения перед отправкой?

Только если исходное изображение низкого качества. CaptchaAI хорошо обрабатывает стандартные изображения CAPTCHA без предварительной обработки. Масштабирование очень маленьких изображений и увеличение контрастности могут помочь в крайних случаях.

Могу ли я сообщить о неправильных ответах?

Да. Используйте конечную точку reportbad с идентификатором задачи, чтобы сообщить о неправильных ответах. Это помогает повысить точность и может пополнить ваш счет.


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


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