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.