Сложные изображения CAPTCHA используют связанные буквы, перекрывающиеся символы, различные шрифты и шум для предотвращения распознавания текста. Вот как можно подойти к ним с помощью CaptchaAI.
Распространенные типы сложности
| Тип | Описание | Сложность |
|---|---|---|
| Чистый текст | Без искажений, равномерный шрифт | Легкий |
| Искаженный текст | Буквы повернуты по отдельности/scaled | Середина |
| Связанные буквы | Персонажи перекрываются или соприкасаются | Жесткий |
| Мультишрифт | Разные шрифты для каждого символа | Жесткий |
| Шум + линии | Фоновый шум, зачеркнутые линии | Середина |
| Цветовая вариация | Разные цвета для каждого персонажа | Середина |
| Математическое выражение | Числа + операторы, ожидаемый результат | Середина |
Отправка сложных CAPTCHA
Для стандартных многосимвольных CAPTCHA отправьте их через base64 с соответствующими подсказками:
import requests
import base64
import time
import os
API_KEY = os.environ["CAPTCHAAI_API_KEY"]
def solve_complex_image(image_b64, hints=None):
"""Solve a complex multi-character image CAPTCHA."""
payload = {
"key": API_KEY,
"method": "base64",
"body": image_b64,
"json": 1,
}
if hints:
payload.update(hints)
resp = requests.post(
"https://ocr.captchaai.com/in.php",
data=payload,
timeout=30,
)
result = resp.json()
if result.get("status") != 1:
raise RuntimeError(f"Submit failed: {result.get('request')}")
task_id = result["request"]
time.sleep(8)
for _ in range(24):
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(5)
raise TimeoutError("Solve timeout")
Стратегия: связанные буквы
Связанные буквы сложны для базового распознавания текста, но не для CaptchaAI:
def solve_connected_letters(image_path):
"""Solve CAPTCHA with connected/overlapping characters."""
with open(image_path, "rb") as f:
b64 = base64.b64encode(f.read()).decode("ascii")
return solve_complex_image(b64, hints={
"textinstructions": "Characters may be connected or overlapping",
"minLen": 4,
"maxLen": 8,
})
Стратегия: смешанный случай с шумом
def solve_noisy_mixed(image_path):
"""Solve CAPTCHA with background noise and mixed case."""
with open(image_path, "rb") as f:
b64 = base64.b64encode(f.read()).decode("ascii")
return solve_complex_image(b64, hints={
"regsense": 1, # Case-sensitive
"language": 2, # Latin characters
"textinstructions": "Ignore background lines and noise",
})
Стратегия: многошрифтный текст
def solve_multi_font(image_path):
"""Solve CAPTCHA using multiple fonts per character."""
with open(image_path, "rb") as f:
b64 = base64.b64encode(f.read()).decode("ascii")
return solve_complex_image(b64, hints={
"textinstructions": "Each character may use a different font or style",
"minLen": 5,
"maxLen": 7,
})
Предварительная обработка изображений для подходящий результатов
Предварительная обработка перед отправкой может повысить точность:
# preprocess.py
from PIL import Image, ImageFilter, ImageEnhance
import io
import base64
def preprocess_for_ocr(image_path):
"""Preprocess image to improve OCR accuracy."""
img = Image.open(image_path)
# Convert to grayscale
img = img.convert("L")
# Increase contrast
enhancer = ImageEnhance.Contrast(img)
img = enhancer.enhance(2.0)
# Sharpen
img = img.filter(ImageFilter.SHARPEN)
# Binarize (threshold)
threshold = 128
img = img.point(lambda p: 255 if p > threshold else 0)
# Encode back to base64
buffer = io.BytesIO()
img.save(buffer, format="PNG")
return base64.b64encode(buffer.getvalue()).decode("ascii")
Стратегия повторных попыток с отчетами
# retry_strategy.py
def solve_with_retry(image_b64, hints, max_retries=3):
"""Retry solving with fallback strategies."""
strategies = [
hints, # Original hints
{**hints, "textinstructions": ""}, # Without instructions
{**hints, "numeric": 0, "regsense": 0}, # Relaxed constraints
]
for i, strategy in enumerate(strategies[:max_retries]):
try:
result = solve_complex_image(image_b64, strategy)
return {"text": result, "strategy": i, "success": True}
except RuntimeError:
continue
return {"text": None, "strategy": -1, "success": False}
def report_bad_answer(task_id):
"""Report incorrect answer for quality feedback."""
requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY,
"action": "reportbad",
"id": task_id,
}, timeout=10)
Поиск неисправностей
| Проблема | Причина | Исправить |
|---|---|---|
| Отсутствующие символы | Связанные буквы неправильно читаются | Добавьте textinstructions о связанном тексте. |
| Дополнительные символы | Шум интерпретируется как текст | Предварительная обработка: удаление шума перед отправкой |
| Неправильный случай | Дело не сохранилось | Установить regsense=1 |
| Математический результат возвращается в виде выражения | Отсутствует calc=1 |
Включить режим расчета для математических CAPTCHA |
| Постоянно неверно на конкретном сайте | Шрифт, специфичный для сайта | Сообщите о плохих ответах, чтобы улучшить модель |
Часто задаваемые вопросы
Нужно ли предварительно обрабатывать изображения перед отправкой?
Только если вы получаете плохие результаты. CaptchaAI изначально обрабатывает большинство искажений. Предварительная обработка помогает при обработке очень шумных или низкоконтрастных изображений.
Что, если тот же тип изображения продолжает давать сбой?
Сообщайте о неправильных ответах с помощью reportbad, чтобы повысить точность. Также попробуйте добавить конкретный textinstructions, описывающий характеристики CAPTCHA.
Существует ли ограничение на количество символов для изображений CAPTCHA?
CaptchaAI может обрабатывать CAPTCHA длиной до 20 символов. Большинство из них состоят из 4–8 символов.
Связанные руководства
- Настройки точности оптического распознавания символов
- Руководство по предварительной обработке изображений
Решение сложных изображений CAPTCHA —начни с CaptchaAI.