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ọngregsense=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/maxLenkhớ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ớ
textinstructions— mô tả đúng biến thể (dính liền, đa phông, nhiễu nền)minLen/maxLen— giới hạn độ dài chuỗi kỳ vọngregsense=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.