API Tutorials

Resim CAPTCHA Base64 Kodlama En İyi Uygulamaları

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 dizeler data: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


Base64'ü doğru kodlayın, ilk resim CAPTCHA'nızı gönderin —CaptchaAI ile başlayın.

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