CAPTCHA hình ảnh phức tạp sử dụng các chữ cái được kết nối, các ký tự chồng chéo, phông chữ đa dạng và nhiễu để ngăn OCR. Đây là cách tiếp cận họ bằng CaptchaAI.
Các loại phức tạp phổ biến
| loại | Mô tả | độ khó |
|---|---|---|
| Làm sạch văn bản | Không bị biến dạng, phông chữ đồng đều | Dễ dàng |
| Văn bản bị biến dạng | Các chữ cái được xoay riêng lẻ/scaled | Trung bình |
| Các chữ cái được kết nối | Các ký tự chồng lên nhau hoặc chạm vào | Cứng |
| Đa phông chữ | Phông chữ khác nhau cho mỗi ký tự | Cứng |
| Tiếng ồn + dòng | Tiếng ồn nền, dòng gạch ngang | Trung bình |
| Biến đổi màu sắc | Màu sắc khác nhau cho mỗi nhân vật | Trung bình |
| biểu thức toán học | Số + toán tử, kết quả mong đợi | Trung bình |
Gửi CAPTCHA phức tạp
Đối với CAPTCHA nhiều ký tự tiêu chuẩn, hãy gửi qua base64 kèm theo gợi ý thích 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")
Chiến lược: Các chữ cái được kết nối
Các chữ cái được kết nối là khó nhất đối với OCR cơ bản nhưng không phải đối với CaptchaAI:
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,
})
Chiến lược: Trường hợp hỗn hợp có tiếng ồn
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",
})
Chiến lược: Văn bản nhiều phông chữ
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,
})
Xử lý sơ bộ hình ảnh để có kết quả tốt hơn
Xử lý trước khi gửi có thể cải thiện độ chính xác:
# 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")
Thử lại chiến lược với báo cáo
# 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)
Khắc phục sự cố
| Vấn đề | Nguyên nhân | Cách xử lý |
|---|---|---|
| Thiếu ký tự | Các chữ cái kết nối bị đọc sai | Thêm textinstructions về văn bản được kết nối |
| Ký tự phụ | Tiếng ồn được hiểu là văn bản | Tiền xử lý: loại bỏ tiếng ồn trước khi gửi |
| Trường hợp sai | Trường hợp không được bảo quản | Đặt regsense=1 |
| Kết quả toán trả về dưới dạng biểu thức | Thiếu calc=1 |
Bật chế độ calc cho CAPTCHA toán học |
| Liên tục sai trên trang web cụ thể | Phông chữ dành riêng cho trang web | Báo cáo câu trả lời xấu để cải thiện mô hình |
Câu hỏi thường gặp
Tôi có nên xử lý trước hình ảnh trước khi gửi không?
Chỉ khi bạn nhận được kết quả kém. CaptchaAI xử lý nguyên bản hầu hết các biến dạng. Quá trình xử lý trước giúp tạo ra những hình ảnh rất nhiễu hoặc có độ tương phản thấp.
Điều gì sẽ xảy ra nếu cùng một loại hình ảnh không thành công?
Báo cáo câu trả lời sai với reportbad để giúp cải thiện độ chính xác. Ngoài ra, hãy thử thêm textinstructions cụ thể mô tả các đặc điểm CAPTCHA.
Có giới hạn ký tự cho hình ảnh CAPTCHA không?
CaptchaAI có thể xử lý CAPTCHA tối đa khoảng 20 ký tự. Hầu hết là 4-8 ký tự.
Hướng dẫn liên quan
Giải CAPTCHA hình ảnh phức tạp —bắt đầu với CaptchaAI.