Tutorial API

Praktik Terbaik Encoding Base64 untuk Image CAPTCHA

Meng-encode image CAPTCHA ke base64 dengan benar adalah langkah pertama menuju solve yang andal. Encoding yang salah berarti jawaban yang salah atau error. Panduan ini mencakup cara yang tepat untuk melakukannya.


Format Pengiriman Base64

CaptchaAI menerima CAPTCHA gambar dalam format base64 melalui parameter method=base64:

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

Pengkodean dari File

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

Pengkodean dari URL

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

Encoding dari Screenshot Selenium

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

Error Encoding yang Umum

Error 1: Menyertakan Prefix Data URI

# SALAH — menyertakan data URI prefix
bad = "data:image/png;base64,iVBORw0KGgo..."

# BENAR — raw base64 saja
good = "iVBORw0KGgo..."

# Fix: Hapus prefix-nya
def clean_base64(b64_string):
    if "," in b64_string:
        return b64_string.split(",", 1)[1]
    return b64_string

Error 2: Double Encoding

# SALAH — encode string yang sudah di-encode
already_b64 = element.screenshot_as_base64
double_encoded = base64.b64encode(already_b64.encode()).decode()  # SALAH

# BENAR — gunakan langsung
correct = element.screenshot_as_base64  # Sudah base64

Error 3: Encode Teks, Bukan Bytes

# SALAH — membaca sebagai teks
with open("captcha.png", "r") as f:  # Text mode
    content = f.read()  # Binary data rusak

# BENAR — membaca sebagai bytes
with open("captcha.png", "rb") as f:  # Binary mode
    content = f.read()
encoded = base64.b64encode(content).decode("ascii")

Validasi Sebelum Submit

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

Rekomendasi Format Gambar

Format Terbaik Untuk Ukuran Kualitas
PNG CAPTCHA teks, screenshot Lebih besar Lossless
JPEG CAPTCHA berbasis foto Lebih kecil Lossy (gunakan kualitas ≥ 85)
GIF CAPTCHA animasi Variabel Warna terbatas
WebP Browser modern Terkecil Kualitas baik

Rekomendasi: Gunakan PNG untuk CAPTCHA teks. Kompresi lossless mempertahankan tepian karakter, meningkatkan akurasi solve.


Pemecahan Masalah

Masalah Penyebab Solusi
ERROR_WRONG_FILE_EXTENSION Data base64 tidak valid Validasi dengan validate_captcha_image()
ERROR_TOO_BIG_CAPTCHA_FILESIZE Gambar melebihi 600 KB Resize atau compress sebelum encode
ERROR_ZERO_CAPTCHA_FILESIZE Gambar kosong atau rusak Periksa download berhasil
Hasil solve salah JPEG terlalu terkompresi Gunakan PNG atau JPEG kualitas ≥ 85

Pertanyaan Umum

Berapa ukuran gambar maksimum yang diterima CaptchaAI?

600 KB untuk body base64. Resize screenshot besar sebelum encode.

Haruskah saya menggunakan PNG atau JPEG untuk CAPTCHA teks?

PNG. Kompresi JPEG bisa mengaburkan tepian karakter sehingga mengurangi akurasi. PNG mempertahankan piksel secara tepat.

Bisakah saya submit gambar SVG?

Tidak. Konversi SVG ke PNG terlebih dahulu menggunakan library seperti Pillow atau cairosvg.


Panduan Terkait

Komentar dinonaktifkan untuk artikel ini.