Troubleshooting

Resim CAPTCHA Yanlış Cevap Döndürüyor: Kalite Optimizasyonu

API çağrınız status: 1 dönüyor, görev başarıyla tamamlanıyor, ama gelen çözüm hatalı. Bu, servisin CAPTCHA'yı çözemediği anlamına gelmez — çözücünün gördüğü görselin, sizin ekranda gördüğünüzden farklı olduğu anlamına gelir. Yanlış cevap alıyorsanız kusur neredeyse her zaman görsel iş akışında saklıdır: yakalama, kırpma, kodlama, çözünürlük veya eksik bir ipucu. Bu rehber teşhisi doğru sırayla yürütür ve her nedeni CaptchaAI ile nasıl düzelteceğinizi gösterir.


Yaygın nedenler: resim CAPTCHA neden yanlış cevap döndürür?

Yanlış bir cevap, çözücünün başarısız olduğu anlamına gelmez; çoğu zaman ona ilettiğiniz görselin beklediğinizden farklı olduğunu gösterir. Bu yüzden teşhise her zaman görselden başlayın, çözüm mantığından değil. Aşağıdaki tablo canlı iş akışlarında en sık görülen nedenleri sıklığına göre sıralar.

Neden Sıklık Çözüm
Görsel yanlış kırpılmış Çok sık CAPTCHA öğesinin tamamını yakalayın
Düşük çözünürlük / aşırı sıkıştırma Sık Daha yüksek kaliteli görsel gönderin
Hatalı base64 kodlaması Sık Kodlamayı gidiş-dönüş doğrulayın
Eksik dil / tür ipucu Ara sıra language veya textinstructions ekleyin
Süresi geçmiş görsel Ara sıra Çözümden hemen önce yeni görsel yakalayın

Sıralama tesadüfi değil: yukarıdan aşağıya ilerlemek, düzeltmelerin çoğunu birkaç dakikada elemenizi sağlar. Sonraki bölümler her nedeni tek tek ele alıyor.


Çözüm 1: Göndermeden önce resim kalitesini doğrulayın

İlk kontrol her zaman görselin kendisi olmalı. Çözücüye göndermeden önce boyut, çözünürlük ve dosya ağırlığını denetleyen küçük bir fonksiyon, hataların büyük kısmını daha ilk adımda yakalar. Aşağıdaki kod 50x20 pikselin altındaki, neredeyse tamamen boş veya 600 KB'ı aşan görselleri işaretler.

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")

Uyarı listesi boş dönmüyorsa görseli göndermeden önce kaynağındaki sorunu düzeltin. Bozuk bir girdiyi çözücüye iletmek yalnızca çözüm süresini ve bakiyenizi harcar.


Çözüm 2: Base64 kodlamasını doğru yapın

Tamamen anlamsız, alakasız bir cevap neredeyse her zaman base64 kodlamasının bozulduğunu gösterir. En yaygın hata, dosyanın içeriğini değil dosya yolunu (string) kodlamaktır. Kodladıktan sonra geri çözüp orijinalle karşılaştırın:

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()

assert satırı geçemezse görseliniz kodlama sırasında bozulmuştur. Yukarıdaki yanlış/doğru örnek, en sık yapılan hatayı — dosya adını kodlamayı — yan yana gösteriyor.


Çözüm 3: OCR doğruluğu için görseli ön işleyin

Görsel gerçekten düşük kaliteliyse, çözücüye göndermeden önce hafif bir ön işleme OCR doğruluğunu belirgin biçimde artırır. Amaç görseli "güzelleştirmek" değil, karakter kenarlarını netleştirmektir: küçük görselleri ölçekleyin, kontrastı yükseltin ve keskinleştirin.

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()

Ön işlemeyi varsayılan adım hâline getirmeyin. Temiz görsellerde gereksizdir; aşırı işleme, sonucu iyileştirmek yerine kötüleştirebilir. Yalnızca çok küçük, bulanık veya düşük kontrastlı görsellerde uç durum çözümü olarak kullanın.


Çözüm 4: Tür ve dil ipuçlarıyla doğruluğu artırın

Çözücüye ne beklediğinizi söylemek doğruluğu ciddi biçimde yükseltir. Yalnızca rakam bekliyorsanız numeric=1, yalnızca harf bekliyorsanız numeric=2 geçin; sabit uzunluk varsa min_len ve max_len ile sınırlayın. Latin alfabesi kullanan (Türkçe dâhil) CAPTCHA'larda language=2, çözücüyü doğru karakter kümesine yönlendirir.

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",
)

Dört ila altı haneli, yalnızca rakamdan oluşan bir kod için bu ipuçları hatalı karakter sayısını ve harf–rakam karışıklığını neredeyse tümüyle ortadan kaldırır. Büyük/küçük harf duyarlı bir CAPTCHA'da ise textinstructions ile harf durumunu açıkça belirtmek reddedilen çözümlerin önüne geçer.


Çözüm 5: Tam CAPTCHA öğesini yakalayın

Yanlış cevapların en sinsi nedeni yanlış kırpmadır. Tüm sayfayı yakalayıp CAPTCHA'yı kabaca kesmek yerine, doğrudan CAPTCHA öğesinin ekran görüntüsünü alın. Selenium'da screenshot_as_png tam olarak bunu yapar ve arka plandaki gürültüyü tamamen dışarıda bırakır.

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")

Ekran görüntüsü beklenmedik kadar küçük geliyorsa öğe henüz görünür değildir; görseli göndermeden önce yüklenmesini bekleyin. Öğe bazlı yakalama, sayfayı kesmeye kıyasla en çok kazandıran tek adımdır.


Çözüm 6: Dinamik / yenilenen CAPTCHA'ları anında çözün

Bazı CAPTCHA'lar birkaç saniyede yenilenir veya tek kullanımlıktır. Görseli yakalayıp saniyeler sonra göndermek, çözücünün artık ekranda olmayan bir CAPTCHA'yı çözmesine yol açar — teknik olarak doğru ama sitenin reddettiği bir cevap. Çözüm, yakalama ile göndermeyi arka arkaya yapmak ve sonucu hızla sorgulamaktır.

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")

Resim CAPTCHA'lar çok hızlı çözüldüğü için kısa aralıklı sorgulama yeterlidir; uzun sleep değerleri yalnızca gecikmeyi artırır ve görselin süresinin dolma riskini büyütür.


Sorun giderme kontrol listesi

Yanlış cevabın biçimi çoğu zaman nedeni doğrudan ele verir. Aşağıdaki tablo belirtiyi olası nedene ve düzeltmeye eşler:

Belirti Olası neden Çözüm
Cevap tamamen anlamsız Base64 bozuk Gidiş-dönüş kodlamasını doğrulayın
Cevap yakın ama birkaç karakter hatalı Düşük görsel kalitesi Ölçekleyin, keskinleştirin, kontrastı artırın
Karakter sayısı tutmuyor Uzunluk ipucu yok min_len / max_len ekleyin
Harf ve rakam karışıyor Tür ipucu yok numeric=1 (rakam) veya numeric=2 (harf) ekleyin
Boş yanıt dönüyor Boş / bozuk görsel Göndermeden önce görseli doğrulayın
Cevap doğru ama site reddediyor Büyük/küçük harf duyarlılığı textinstructions ile harf durumunu belirtin

Gerçek senaryo: e-ticaret QA akışında resim CAPTCHA

Türkiye'deki geliştiricilerin büyük kısmı e-ticaret ve ödeme entegrasyonları üzerinde çalışır; bu akışların otomatik QA testlerinde klasik resim/OCR CAPTCHA'lar hâlâ sık karşınıza çıkar — eski yönetim panelleri veya BLS tarzı form portalları bunun tipik örnekleridir. Kendi staging ortamınızda bir giriş veya ödeme formunu test ederken çözücü sürekli "yakın ama hatalı" cevap veriyorsa, neredeyse her zaman ekran görüntüsü ya çok küçüktür ya da form arka planıyla birlikte kırpılmıştır. Çözüm 5'teki öğe bazlı ekran görüntüsü bu sorunu tek başına ortadan kaldırır.

Bir not: test edilen veya kazınan veriler kişisel veri içeriyorsa KVKK kapsamına girer. CAPTCHA çözümünü yalnızca yetkili olduğunuz QA ve veri toplama iş akışlarında kullanın. CaptchaAI'nin thread tabanlı planları (BASIC $15/ay, 5 thread'den başlar) USD sabit fiyatlıdır; bu, TL dalgalanmasından etkilenmeyen öngörülebilir bir aylık maliyet anlamına gelir.


SSS

Resim CAPTCHA çözümü ne kadar sürer?

Resim/OCR CAPTCHA'lar CaptchaAI'nin en hızlı çözülen türlerindendir; tipik çözüm süresi saniyenin altındadır. Yanlış cevap alıyorsanız sorun hız değil, gönderilen görselin kalitesidir.

Base64 kodlamasının bozulmadığından nasıl emin olurum?

Kodladığınız veriyi tekrar çözüp orijinal dosyayla karşılaştırın (gidiş-dönüş testi). Çözüm 2'deki assert decoded == raw satırı tam olarak bunu yapar. En sık hata, dosya içeriğini değil dosya yolunu kodlamayı unutmaktır.

Yanlış gelen bir cevabı nasıl bildiririm?

Görev kimliğiyle reportbad uç noktasını çağırın. Bu, doğruluğun iyileşmesine katkı sağlar ve bazı durumlarda hesabınıza kredi olarak yansıyabilir.

Grid image CAPTCHA'da da aynı adımlar geçerli mi?

Büyük ölçüde evet: yakalama, kırpma ve kodlama kuralları aynıdır. Grid image ayrı bir yöntem (post) kullanır ama görsel kalitesi sonucu yine doğrudan etkiler.

Türkçe metin içeren resim CAPTCHA'larda doğruluk artırılabilir mi?

Evet. Latin alfabesi kullanan CAPTCHA'larda language=2 ipucunu geçmek çözücüyü doğru karakter kümesine yönlendirir. Türkçe'ye özgü karakterler içeren görsellerde net, yüksek kontrastlı yakalama farkı belirginleştirir.


İlgili Kılavuzlar


Resimlerinizi ilk denemede doğru çözün — CaptchaAI'yi ücretsiz deneyin.

Bu makale için yorumlar devre dışı bırakılmıştır.