Hướng Dẫn API

Hình ảnh Các phương pháp mã hóa CAPTCHA Base64 tốt nhất

Mã hóa chính xác hình ảnh CAPTCHA trong base64 là bước đầu tiên để giải quyết một cách đáng tin cậy. Mã hóa sai có nghĩa là câu trả lời sai hoặc sai sót. Hướng dẫn này bao gồm cách đúng đắn để làm điều đó.


Định dạng gửi Base64

CaptchaAI chấp nhận CAPTCHA hình ảnh ở định dạng base64 thông qua tham số 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()

Mã hóa từ tập tin

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

Mã hóa từ 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")

Mã hóa từ Ảnh chụp màn hình 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")

Các lỗi mã hóa phổ biến

Sai lầm 1: Bao gồm Tiền tố URI dữ liệu

# 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

Sai lầm 2: Mã hóa kép

# 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

Sai lầm 3: Mã hóa văn bản thay vì byte

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

Xác thực trước khi gửi

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

Đề xuất định dạng hình ảnh

định dạng Tốt nhất cho Kích thước chất lượng
PNG Viết CAPTCHA, ảnh chụp màn hình lớn hơn không mất dữ liệu
JPEG CAPTCHA dựa trên ảnh Nhỏ hơn Mất mát (chất lượng sử dụng ≥ 85)
GIF CAPTCHA hoạt hình Biến Màu sắc hạn chế
WEBP Trình duyệt hiện đại Nhỏ nhất chất lượng tốt

Khuyến nghị: Sử dụng PNG cho CAPTCHA văn bản. Việc nén không mất dữ liệu sẽ bảo tồn các cạnh ký tự, cải thiện độ chính xác của việc giải.


Khắc phục sự cố

Vấn đề Nguyên nhân Cách xử lý
ERROR_WRONG_FILE_EXTENSION Dữ liệu base64 không hợp lệ Xác thực bằng validate_captcha_image()
ERROR_TOO_BIG_CAPTCHA_FILESIZE Hình ảnh trên 600 KB Thay đổi kích thước hoặc nén trước khi mã hóa
ERROR_ZERO_CAPTCHA_FILESIZE Hình ảnh trống hoặc bị hỏng Kiểm tra tải xuống thành công
Kết quả giải sai JPEG bị nén quá mức Sử dụng chất lượng PNG hoặc JPEG ≥ 85

Câu hỏi thường gặp

Kích thước hình ảnh tối đa mà CaptchaAI chấp nhận là bao nhiêu?

600 KB cho phần thân base64. Thay đổi kích thước ảnh chụp màn hình lớn trước khi mã hóa.

Tôi nên sử dụng PNG hay JPEG cho CAPTCHA văn bản?

PNG. Nén JPEG có thể làm mờ các cạnh ký tự, làm giảm độ chính xác. PNG bảo tồn các pixel chính xác.

Tôi có thể gửi hình ảnh SVG không?

Không. Trước tiên, hãy chuyển đổi SVG sang PNG bằng thư viện như Pillow hoặc cairosvg.


Hướng dẫn liên quan


Mã hóa CAPTCHA một cách chính xác —bắt đầu với CaptchaAI.

Os comentários estão desativados para este artigo.