CaptchaAI'ye gönderdiğiniz resim CAPTCHA'sı ERROR_ZERO_CAPTCHA_FILESIZE mi döndürüyor ya da yanlış çözüm mü dönüyor? Sorunların çoğu çözücüde değil, base64 kodlamasında başlar. method=base64 ile gönderdiğiniz gövde tam beklenen biçimde olmalı: data: öneki yok, çift kodlama yok, bozuk bayt yok. Bu rehber; resim CAPTCHA'sını dosyadan, URL'den ve Selenium'dan doğru kodlamayı, göndermeden önce doğrulamayı ve en sık üç kodlama hatasını gösterir.
Base64 kodlaması neden yanlış sonuç üretir?
method=base64 gönderiminde çözücü, gövdedeki metni olduğu gibi çözüp görüntüye çevirir. Gövde beklenenden tek bir bayt bile farklıysa görüntü ya hiç oluşmaz ya da bozuk piksellerle oluşur; her iki durumda da çözüm yanlış döner ya da bir hata kodu alırsınız. Pratikte, üretimde karşılaşılan gönderim hatalarının neredeyse tamamı şu üç noktada toplanır:
data:URI öneki: Tarayıcıdan veya HTML kaynağından kopyalanan dizelerdata:image/png;base64,ile başlar; bu önek gövdeyi geçersiz kılar.- Çift kodlama: Zaten base64 olan bir değeri (örneğin
screenshot_as_base64) ikinci kez kodlamak, çözücünün okuyamayacağı bozuk bir dize üretir. - Metin modunda okuma: Görüntü dosyasını ikili yerine metin modunda açmak, karakter kodlaması yüzünden baytları sessizce bozar.
Üçünü de aşağıda kod örnekleriyle tek tek ele alıyoruz. Önce doğru gönderim biçimine bakalım.
method=base64 ile gönderim formatı
CaptchaAI, resim (OCR) CAPTCHA'larını method=base64 parametresiyle kabul eder. Görüntüyü ham base64 dizesine çevirip ocr.captchaai.com/in.php uç noktasına gönderirsiniz:
import requests
import base64
import os
def submit_image_captcha(image_base64):
"""Submit base64-encoded image to CaptchaAI."""
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": os.environ["CAPTCHAAI_API_KEY"],
"method": "base64",
"body": image_base64,
"json": 1,
}, timeout=30)
return resp.json()
in.php size bir görev kimliği döndürür; çözülen metni ardından res.php uç noktasından action=get ile sorgulayarak alırsınız. Bu rehber uçtan uca akışı değil, gönderim gövdesinin doğruluğunu ele alır — kodlama katmanı temizse geri kalan sorgulama akışı sorunsuz işler. Bir sonraki adım, bu gövdeyi kaynağa göre doğru üretmektir.
Dosyadan base64'e kodlama
Diskteki bir görüntüyü mutlaka "rb" (ikili) modunda okuyun — aksi halde bayt bozulur:
# from_file.py
import base64
def encode_from_file(filepath):
"""Read an image file and return base64 string."""
with open(filepath, "rb") as f:
raw = f.read()
return base64.b64encode(raw).decode("ascii")
# Usage
b64 = encode_from_file("captcha.png")
print(f"Encoded length: {len(b64)} chars")
URL'den doğrudan kodlama
Görseli diske yazmadan bellekte kodlayın; içeriğin gerçekten görüntü olduğunu Content-Type başlığından doğrulayın:
# from_url.py
import requests
import base64
def encode_from_url(image_url):
"""Download image and return base64 string."""
resp = requests.get(image_url, timeout=15)
resp.raise_for_status()
# Verify it's actually an image
content_type = resp.headers.get("Content-Type", "")
if not content_type.startswith("image/"):
raise ValueError(f"Not an image: {content_type}")
return base64.b64encode(resp.content).decode("ascii")
# Usage
b64 = encode_from_url("https://example.com/captcha.png")
Selenium ekran görüntüsünden kodlama
Görsel sayfaya gömülüyse öğenin ekran görüntüsünü alırsınız. element.screenshot_as_base64 zaten base64 döndürür — tekrar kodlamayın. Örneğin tr-TR diliyle açılan bir e-ticaret ödeme akışını QA ortamında test ederken CAPTCHA görseli forma gömülü gelir; onu doğrudan öğe ekran görüntüsünden almak tüm sayfayı kırpmaktan daha güvenilirdir.
# from_selenium.py
import base64
from selenium.webdriver.common.by import By
def encode_from_element(driver, selector):
"""Screenshot a specific element and return base64."""
element = driver.find_element(By.CSS_SELECTOR, selector)
screenshot_b64 = element.screenshot_as_base64
return screenshot_b64
def encode_from_page_crop(driver, selector):
"""Crop a specific region from the page screenshot."""
from PIL import Image
import io
element = driver.find_element(By.CSS_SELECTOR, selector)
location = element.location
size = element.size
# Full page screenshot
png = driver.get_screenshot_as_png()
img = Image.open(io.BytesIO(png))
# Crop to element bounds
left = location["x"]
top = location["y"]
right = left + size["width"]
bottom = top + size["height"]
cropped = img.crop((left, top, right, bottom))
# Encode
buffer = io.BytesIO()
cropped.save(buffer, format="PNG")
return base64.b64encode(buffer.getvalue()).decode("ascii")
En sık yapılan üç kodlama hatası
Bu üç hata, base64 ilk bakışta geçerli görünse bile yanlış sonuç ya da hata kodu üretir.
Hata 1: data: URI önekini dahil etmek
# WRONG — includes data URI prefix
bad = "data:image/png;base64,iVBORw0KGgo..."
# RIGHT — raw base64 only
good = "iVBORw0KGgo..."
# Fix: Strip the prefix
def clean_base64(b64_string):
if "," in b64_string:
return b64_string.split(",", 1)[1]
return b64_string
Hata 2: Zaten kodlanmış veriyi yeniden kodlamak
# WRONG — encoding an already-encoded string
already_b64 = element.screenshot_as_base64
double_encoded = base64.b64encode(already_b64.encode()).decode() # BAD
# RIGHT — use as-is
correct = element.screenshot_as_base64 # Already base64
Hata 3: Baytları değil metni okumak
# WRONG — reading as text
with open("captcha.png", "r") as f: # Text mode
content = f.read() # Corrupted binary data
# RIGHT — reading as bytes
with open("captcha.png", "rb") as f: # Binary mode
content = f.read()
encoded = base64.b64encode(content).decode("ascii")
Göndermeden önce doğrulama
Önek, boyut ve format kontrollerini tek fonksiyonda toplayın; hataları in.php'ye gitmeden yakalarsınız:
# validate.py
import base64
import io
def validate_captcha_image(b64_string):
"""Validate base64 image before submitting to CaptchaAI."""
errors = []
# Check for data URI prefix
if b64_string.startswith("data:"):
errors.append("Contains data URI prefix — strip it")
b64_string = b64_string.split(",", 1)[1]
# Try decoding
try:
decoded = base64.b64decode(b64_string)
except Exception as e:
return {"valid": False, "errors": [f"Invalid base64: {e}"]}
# Check size
size_kb = len(decoded) / 1024
if size_kb < 1:
errors.append(f"Image too small ({size_kb:.1f} KB) — likely corrupt")
if size_kb > 500:
errors.append(f"Image large ({size_kb:.1f} KB) — consider resizing")
# Check image format
if decoded[:8] == b'\x89PNG\r\n\x1a\n':
fmt = "PNG"
elif decoded[:3] == b'\xff\xd8\xff':
fmt = "JPEG"
elif decoded[:4] == b'GIF8':
fmt = "GIF"
elif decoded[:4] == b'RIFF':
fmt = "WEBP"
else:
errors.append("Unknown image format")
fmt = "unknown"
return {
"valid": len(errors) == 0,
"format": fmt,
"size_kb": round(size_kb, 1),
"errors": errors,
}
# Usage
result = validate_captcha_image(b64_string)
if not result["valid"]:
print(f"Issues: {result['errors']}")
else:
print(f"Valid {result['format']}, {result['size_kb']} KB")
Gönderim öncesi kontrol listesi
Otomasyonunuzu üretime almadan önce her gönderimde şu dört noktayı doğrulayın; ekip arkadaşlarınızın kod incelemesinde de bu liste hızlı bir referans olur:
- Gövde
data:önekiyle başlamıyor. - Dize yalnızca bir kez kodlandı (çift kodlama yok).
- Dosya
"rb"ikili modunda okundu. - Çözülen görüntü 600 KB sınırının altında ve bilinen bir formatta (PNG, JPEG, GIF, WEBP).
Bu kontrolleri tek bir validate_captcha_image() çağrısında topladığınızda, hatalı gövdeler in.php'ye hiç ulaşmadan yakalanır ve boşa istek harcamazsınız.
Hangi görüntü formatını seçmelisiniz?
| Biçim | En İyisi | Boyut | Kalite |
|---|---|---|---|
| PNG | Metin CAPTCHA'ları, ekran görüntüleri | Daha büyük | Kayıpsız |
| JPEG | Fotoğraf tabanlı CAPTCHA'lar | Daha küçük | Kayıplı (kullanım kalitesi ≥ 85) |
| GIF | Animasyonlu CAPTCHA'lar | Değişken | Sınırlı renkler |
| WEBP | Modern tarayıcılar | En küçük | Kaliteli |
Kısaca: Metin tabanlı CAPTCHA'larda PNG tercih edin; kayıpsız sıkıştırma karakter kenarlarını koruyup doğruluğu yükseltir.
Boyut sınırını aşmamak
CaptchaAI, base64 gövdesi için 600 KB üst sınır uygular. Kritik ayrıntı şudur: base64 kodlaması ham baytları yaklaşık %33 büyütür, yani diskte 450 KB olan bir PNG gövdede zaten ~600 KB'a yaklaşır. Bu yüzden ham dosya boyutuna değil, kodlanmış dizenin uzunluğuna bakın. Yüksek çözünürlüklü ekran görüntülerini kodlamadan önce yeniden boyutlandırın; çoğu metin CAPTCHA'sında görüntüyü yalnızca CAPTCHA kutusunun sınırlarına kırpmak boyutu ziyadesiyle düşürür ve okunabilirliği koruduğu için doğruluğu da artırır.
Sorun giderme
| Sorun | Sebep | Düzeltme |
|---|---|---|
ERROR_WRONG_FILE_EXTENSION |
Base64 verisi geçersiz | validate_captcha_image() ile doğrulayın |
ERROR_TOO_BIG_CAPTCHA_FILESIZE |
Görüntü 600 KB'ı aşıyor | Kodlamadan önce yeniden boyutlandırın veya sıkıştırın |
ERROR_ZERO_CAPTCHA_FILESIZE |
Boş ya da bozuk görüntü | İndirmenin başarılı olduğunu doğrulayın |
| Yanlış çözüm sonucu | Aşırı sıkıştırılmış JPEG | PNG'ye geçin ya da JPEG kalitesini ≥ 85 yapın |
Sık sorulan sorular
Base64 gövdesine data:image/png;base64, önekini eklemeli miyim?
Hayır. CaptchaAI ham base64 bekler; data: öneki gövdeyi geçersiz kılar. Öneki ilk virgülden ayırıp atın.
Resim CAPTCHA'sını hangi uç noktaya, hangi method ile gönderirim?
ocr.captchaai.com/in.php uç noktasına method=base64 ile POST edersiniz; ham base64 dizesi body alanına gelir.
Base64 geçerli görünüyor ama çözüm neden yanlış dönüyor?
En yaygın neden çift kodlamadır: screenshot_as_base64 gibi zaten base64 olan bir değeri tekrar kodlarsanız çözücü bozuk veri alır. Aşırı sıkıştırılmış JPEG de aynı etkiyi yapar.
Metin CAPTCHA'ları için PNG mi JPEG mi kullanmalıyım?
PNG. Kayıpsız sıkıştırma tam pikselleri koruyup karakter kenarlarını net tutar; JPEG sıkıştırması doğruluğu düşürebilir.
Görüntüyü diske kaydetmeden gönderebilir miyim?
Evet. encode_from_url yaklaşımıyla görüntüyü bellekte indirip doğrudan base64'e çevirebilirsiniz; geçici dosya yazmanız gerekmez. Bu, yüksek hacimli iş akışlarında disk G/Ç yükünü de azaltır.
İlgili kılavuzlar
- OCR CAPTCHA doğruluğunu artıran CaptchaAI ayarları
- Daha iyi çözüm oranları için CAPTCHA görüntü ön işleme
Base64'ü doğru kodlayın, ilk resim CAPTCHA'nızı gönderin —CaptchaAI ile başlayın.