Если 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 с идентификатором задачи, чтобы сообщить о неправильных ответах. Это помогает повысить точность и может пополнить ваш счет.
Связанные руководства
- Диагностика снижения уровня успеха
- Проверка запроса неверных параметров
- Точно решайте изображения —попробуй CaptchaAI.*