Tutoriales de API

Imagen CAPTCHA Base64 Mejores prácticas de codificación

Codificar correctamente imágenes CAPTCHA en base64 es el primer paso para una resolución confiable. Una codificación incorrecta significa respuestas incorrectas o errores. Esta guía cubre la forma correcta de hacerlo.


El formato de envío Base64

CaptchaAI acepta CAPTCHA de imágenes en formato base64 a través del parámetro 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()

Codificación desde archivo

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

Codificación desde 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")

Codificación de captura de pantalla de 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")

Errores de codificación comunes

Error 1: incluir el prefijo URI de datos

# 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

Error 2: doble codificación

# 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

Error 3: codificar texto en lugar de bytes

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

Validación antes del envío

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

Recomendaciones de formato de imagen

Formato Mejor para Tamaño Calidad
PNG CAPTCHA de texto, capturas de pantalla Más grande Sin pérdidas
JPEG CAPTCHA basados en fotografías Más pequeño Con pérdida (use calidad ≥ 85)
GIF CAPTCHA animados variable Colores limitados
WEBP Navegadores modernos Más pequeño Buena calidad

Recomendación: Utilice PNG para CAPTCHA de texto. La compresión sin pérdidas preserva los bordes de los caracteres, mejorando la precisión de la resolución.


Solución de problemas

Problema causa Solución
ERROR_WRONG_FILE_EXTENSION Datos base64 no válidos Validar con validate_captcha_image()
ERROR_TOO_BIG_CAPTCHA_FILESIZE Imagen de más de 600 KB Cambiar el tamaño o comprimir antes de codificar
ERROR_ZERO_CAPTCHA_FILESIZE Imagen vacía o corrupta Verificar descarga exitosa
Resultado de resolución incorrecto JPEG sobrecomprimido Utilice calidad PNG o JPEG ≥ 85

Preguntas frecuentes

¿Cuál es el tamaño máximo de imagen que acepta CaptchaAI?

600 KB para cuerpo base64. Cambie el tamaño de capturas de pantalla grandes antes de codificar.

¿Debo usar PNG o JPEG para CAPTCHA de texto?

PNG. La compresión JPEG puede difuminar los bordes de los caracteres, lo que reduce la precisión. PNG conserva los píxeles exactos.

¿Puedo enviar imágenes SVG?

No. Primero convierta SVG a PNG usando una biblioteca como Pillow o cairosvg.


Guías relacionadas


Codifique los CAPTCHA correctamente:empezar con CaptchaAI.

Los comentarios están deshabilitados para este artículo.