Hướng Dẫn API

Chiến lược giải CAPTCHA hình ảnh nhiều ký tự

CAPTCHA hình ảnh với chữ cái dính liền, nhiều phông chữ trộn lẫn hoặc nhiễu nền vẫn giải chính xác được qua CaptchaAI — điều kiện là bạn gửi đúng hint (textinstructions, minLen/maxLen, regsense) cho từng biến thể.

Bài này liệt kê 7 dạng phức tạp thường gặp, chiến lược xử lý cho từng dạng, và code Python chạy được ngay qua in.php / res.php.


7 dạng CAPTCHA hình ảnh phức tạp thường gặp

Dạng Mô tả Độ khó
Văn bản sạch Không biến dạng, phông chữ đồng nhất Dễ
Văn bản biến dạng Từng chữ bị xoay/co giãn riêng lẻ Trung bình
Chữ cái dính liền Ký tự chồng lên nhau hoặc chạm vào nhau Khó
Đa phông chữ Mỗi ký tự dùng một phông khác nhau Khó
Nhiễu nền + gạch ngang Nhiễu nền, đường kẻ chồng lên chữ Trung bình
Biến đổi màu sắc Mỗi ký tự một màu khác nhau Trung bình
Biểu thức toán học Số + phép toán, trả về kết quả Trung bình

Cách gửi CAPTCHA nhiều ký tự tới CaptchaAI

Với CAPTCHA nhiều ký tự dạng chuẩn, gửi ảnh dưới dạng base64 kèm hint phù hợp:

import requests
import base64
import time
import os

API_KEY = os.environ["CAPTCHAAI_API_KEY"]

def solve_complex_image(image_b64, hints=None):
    """Solve a complex multi-character image CAPTCHA."""
    payload = {
        "key": API_KEY,
        "method": "base64",
        "body": image_b64,
        "json": 1,
    }

    if hints:
        payload.update(hints)

    resp = requests.post(
        "https://ocr.captchaai.com/in.php",
        data=payload,
        timeout=30,
    )
    result = resp.json()

    if result.get("status") != 1:
        raise RuntimeError(f"Submit failed: {result.get('request')}")

    task_id = result["request"]

    time.sleep(8)
    for _ in range(24):
        resp = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY,
            "action": "get",
            "id": task_id,
            "json": 1,
        }, timeout=15)
        data = resp.json()
        if data.get("status") == 1:
            return data["request"]
        if data["request"] != "CAPCHA_NOT_READY":
            raise RuntimeError(data["request"])
        time.sleep(5)

    raise TimeoutError("Solve timeout")

3 hint quan trọng nhất cần khai báo

Ba tham số quyết định độ chính xác trên CAPTCHA phức tạp:

  • textinstructions: mô tả ngắn gọn đặc điểm ảnh (chữ dính, nhiều phông, nhiễu nền)
  • minLen / maxLen: giới hạn độ dài chuỗi kỳ vọng
  • regsense=1: bắt buộc khi CAPTCHA phân biệt hoa/thường

Ví dụ thực tế: theo dõi giá trên sàn TMĐT gặp CAPTCHA dính chữ

Tình huống quen thuộc với đội scraping/QA tại TP.HCM hay Hà Nội: hệ thống theo dõi giá công khai trên sàn TMĐT (Shopee, Tiki, Lazada) đổi sang CAPTCHA ảnh chữ dính liền, nhiễu nền.

Chỉ cần thêm đúng textinstructions mô tả biến thể — không cần viết riêng OCR pipeline.

Chỉ theo dõi giá trên dữ liệu công khai bạn có quyền truy cập.


Chữ cái dính liền: thêm hint mô tả rõ đặc điểm

Chữ cái dính liền là dạng khó nhất với OCR thông thường, nhưng CaptchaAI xử lý tốt nếu bạn khai báo rõ trong textinstructions:

def solve_connected_letters(image_path):
    """Solve CAPTCHA with connected/overlapping characters."""
    with open(image_path, "rb") as f:
        b64 = base64.b64encode(f.read()).decode("ascii")

    return solve_complex_image(b64, hints={
        "textinstructions": "Characters may be connected or overlapping",
        "minLen": 4,
        "maxLen": 8,
    })

Vì sao OCR thông thường đọc sai chữ dính liền

OCR truyền thống tách ký tự theo đường viền riêng biệt nên dễ gộp hoặc bỏ sót ký tự chạm nhau. CaptchaAI nhận dạng theo ngữ cảnh toàn chuỗi thay vì tách từng ký tự.


Ảnh nhiễu nền và phân biệt hoa thường

def solve_noisy_mixed(image_path):
    """Solve CAPTCHA with background noise and mixed case."""
    with open(image_path, "rb") as f:
        b64 = base64.b64encode(f.read()).decode("ascii")

    return solve_complex_image(b64, hints={
        "regsense": 1,         # Case-sensitive
        "language": 2,         # Latin characters
        "textinstructions": "Ignore background lines and noise",
    })

Khi nào bắt buộc dùng regsense=1

  • CAPTCHA có cả chữ hoa và chữ thường mang nghĩa khác nhau
  • Trang đích trả lỗi khi gửi sai case dù đúng ký tự
  • Biểu mẫu đăng nhập/thanh toán yêu cầu khớp chính xác từng ký tự

Văn bản nhiều phông chữ trong cùng một ảnh

def solve_multi_font(image_path):
    """Solve CAPTCHA using multiple fonts per character."""
    with open(image_path, "rb") as f:
        b64 = base64.b64encode(f.read()).decode("ascii")

    return solve_complex_image(b64, hints={
        "textinstructions": "Each character may use a different font or style",
        "minLen": 5,
        "maxLen": 7,
    })

Multi-font gây sai kết quả ở đâu nhiều nhất

Multi-font phổ biến trên CAPTCHA của cổng đặt vé và cổng thị thực — mỗi ký tự cố tình dùng phông riêng để chống OCR hàng loạt.


Khi nào cần tiền xử lý ảnh trước khi gửi

Phần lớn trường hợp không cần tiền xử lý — CaptchaAI xử lý tốt hầu hết biến dạng ngay trên ảnh gốc.

Tiền xử lý chỉ đáng làm khi ảnh quá nhiễu hoặc độ tương phản thấp:

# preprocess.py
from PIL import Image, ImageFilter, ImageEnhance
import io
import base64

def preprocess_for_ocr(image_path):
    """Preprocess image to improve OCR accuracy."""
    img = Image.open(image_path)

    # Convert to grayscale
    img = img.convert("L")

    # Increase contrast
    enhancer = ImageEnhance.Contrast(img)
    img = enhancer.enhance(2.0)

    # Sharpen
    img = img.filter(ImageFilter.SHARPEN)

    # Binarize (threshold)
    threshold = 128
    img = img.point(lambda p: 255 if p > threshold else 0)

    # Encode back to base64
    buffer = io.BytesIO()
    img.save(buffer, format="PNG")
    return base64.b64encode(buffer.getvalue()).decode("ascii")

Dấu hiệu ảnh cần tiền xử lý

  • Độ tương phản thấp, chữ mờ nhòe vào nền
  • Ảnh chụp màn hình bị nén JPEG nặng, nhiễu hạt
  • Tỷ lệ giải sai liên tục cao hơn 20% trên cùng một nguồn ảnh

Chiến lược thử lại và báo cáo kết quả sai

Khi một hint cụ thể không giải được, đổi chiến lược thay vì gửi lại y nguyên:

# retry_strategy.py

def solve_with_retry(image_b64, hints, max_retries=3):
    """Retry solving with fallback strategies."""
    strategies = [
        hints,                                          # Original hints
        {**hints, "textinstructions": ""},              # Without instructions
        {**hints, "numeric": 0, "regsense": 0},        # Relaxed constraints
    ]

    for i, strategy in enumerate(strategies[:max_retries]):
        try:
            result = solve_complex_image(image_b64, strategy)
            return {"text": result, "strategy": i, "success": True}
        except RuntimeError:
            continue

    return {"text": None, "strategy": -1, "success": False}

def report_bad_answer(task_id):
    """Report incorrect answer for quality feedback."""
    requests.get("https://ocr.captchaai.com/res.php", params={
        "key": API_KEY,
        "action": "reportbad",
        "id": task_id,
    }, timeout=10)

Khi nào nên gọi reportbad thay vì retry

Nếu cùng một dạng CAPTCHA sai liên tục dù đã đổi hint, retry không giải quyết gốc rễ — gọi reportbad để phản hồi mẫu sai cho lần giải sau.


Khắc phục sự cố thường gặp

Kiểm tra nhanh checklist dưới trước khi báo lỗi lên CaptchaAI:

  • Đã thử gửi lại ảnh gốc, không qua tiền xử lý thêm lần nữa
  • Đã kiểm tra regsense, minLen/maxLen khớp với đặc điểm ảnh thực tế
  • Đã xem log res.php để phân biệt lỗi hint và lỗi hệ thống
Vấn đề Nguyên nhân Cách xử lý
Thiếu ký tự trong kết quả Chữ dính liền bị đọc gộp Thêm textinstructions mô tả ký tự dính liền
Dư ký tự trong kết quả Nhiễu nền bị hiểu nhầm là chữ Tiền xử lý loại bỏ nhiễu trước khi gửi
Sai hoa/thường Không giữ đúng case Đặt regsense=1
Kết quả toán trả về dạng biểu thức thay vì số Thiếu tham số calc=1 Bật calc=1 cho CAPTCHA toán học
Liên tục sai trên cùng một trang Phông chữ đặc thù của trang đó Gửi reportbad để cải thiện mô hình

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

CaptchaAI có giải được CAPTCHA chữ cái dính liền hoặc chồng lên nhau không?

Có. Đây là trường hợp CaptchaAI xử lý tốt hơn OCR thông thường — thêm textinstructions mô tả "characters may be connected or overlapping" cùng minLen/maxLen để tăng độ chính xác.

CAPTCHA dạng biểu thức toán học (ví dụ 2+3=?) gửi thế nào?

Bật tham số calc=1 trong request để CaptchaAI trả về kết quả phép tính thay vì đọc lại biểu thức dưới dạng chữ.

Có cần tiền xử lý ảnh (grayscale, tăng contrast) trước khi gửi không?

Không bắt buộc — CaptchaAI xử lý tốt phần lớn ảnh gốc. Tiền xử lý chỉ hữu ích khi ảnh quá nhiễu hoặc độ tương phản thấp.

Giới hạn ký tự tối đa cho CAPTCHA hình ảnh là bao nhiêu?

CaptchaAI xử lý được CAPTCHA tối đa khoảng 20 ký tự, phần lớn thực tế rơi vào khoảng 4-8 ký tự.

CaptchaAI có phân biệt được ký tự dễ nhầm như 0/O hay 1/I/l không?

Có, nếu bạn mô tả rõ trong textinstructions bộ ký tự cho phép. Không khai báo, tỷ lệ nhầm lẫn tăng trên phông chữ hẹp.


Tóm tắt nhanh: 3 hint cần nhớ

  1. textinstructions — mô tả đúng biến thể (dính liền, đa phông, nhiễu nền)
  2. minLen / maxLen — giới hạn độ dài chuỗi kỳ vọng
  3. regsense=1 — bắt buộc khi phân biệt hoa/thường

Hướng dẫn liên quan


Giải CAPTCHA hình ảnh nhiều ký tự ngay hôm nay — lấy API key CaptchaAI và chạy thử đoạn code Python ở trên.

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