OCR CAPTCHA trả sai ký tự thường không phải vì bộ giải kém, mà vì thiếu tham số gợi ý hoặc ảnh đầu vào có vấn đề. Một team QA ở TP.HCM theo dõi giá Shopee từng gặp tỷ lệ sai ký tự cao bất thường — hoá ra chỉ vì quên gửi numeric=1 cho CAPTCHA toàn chữ số. Dưới đây là từng lỗi Image/text CAPTCHA kèm nguyên nhân và cách sửa.
Tra cứu nhanh: tham số nào sửa lỗi nào
Tham số hay dùng khi gửi task tới in.php:
| Tham số | Khi nào dùng | Tác dụng |
|---|---|---|
numeric=1 |
CAPTCHA chỉ gồm chữ số | Loại bỏ nhầm lẫn chữ/số |
numeric=2 |
CAPTCHA chỉ gồm chữ cái | Loại bỏ nhầm lẫn chữ/số |
min_len / max_len |
Biết trước độ dài đáp án | Ngăn ký tự bị thừa/thiếu |
regsense=1 |
Cần phân biệt hoa/thường | Giữ nguyên hoa/thường trong kết quả |
calc=1 |
Ảnh chứa phép tính | Trả về đáp án đã tính, không phải chuỗi đề bài |
phrase=1 |
Đáp án có khoảng trắng | Cho phép câu trả lời nhiều từ |
language=1 |
Văn bản Cyrillic | Dùng đúng bộ ký tự |
language=2 |
Văn bản Latin | Dùng đúng bộ ký tự |
Lỗi khi gửi request
Xảy ra trước khi CaptchaAI đọc được ảnh, thường do định dạng hoặc dung lượng file.
ERROR_WRONG_FILE_EXTENSION: ảnh sai định dạng hoặc base64 hỏng
Nguyên nhân: ảnh sai định dạng, hoặc chuỗi base64 vẫn còn dính tiền tố data:image/.... Cách sửa: mã hoá lại đúng chuẩn và bỏ tiền tố trước khi gửi:
import base64
# Ensure proper encoding
with open("captcha.png", "rb") as f:
b64 = base64.b64encode(f.read()).decode()
# Don't include the data URI prefix
# WRONG: "data:image/png;base64,iVBOR..."
# RIGHT: "iVBOR..."
ERROR_ZERO_CAPTCHA_FILESIZE: file ảnh rỗng
Nguyên nhân: file ảnh trống, hoặc bước tải ảnh đã thất bại trước khi gửi lên. Cách sửa: kiểm tra dung lượng file trước khi submit:
import os
# Check file size before submitting
if os.path.getsize("captcha.png") == 0:
print("Image file is empty — re-download")
# Re-capture the captcha
ERROR_TOO_BIG_CAPTCHA_FILESIZE: ảnh vượt giới hạn dung lượng
Nguyên nhân: ảnh vượt quá dung lượng tối đa (~600KB). Cách sửa: nén lại mà không làm mất độ nét của ký tự:
from PIL import Image
import io
img = Image.open("captcha.png")
# Reduce quality without losing text clarity
buffer = io.BytesIO()
img.save(buffer, format="PNG", optimize=True)
Kết quả OCR trả về sai ký tự
Request được chấp nhận bình thường nhưng văn bản trả về không khớp ảnh gốc.
Nhầm ký tự giống nhau (0/O, 1/l/I, 5/S)
Nguyên nhân: bộ giải nhầm các ký tự hình dạng gần giống nhau. Cách sửa: dùng tham số gợi ý để thu hẹp tập ký tự có thể xảy ra:
# If captcha is digits only
response = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY, "method": "base64", "body": b64,
"numeric": 1, # 1 = digits only
"json": 1
})
# If captcha is letters only
response = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY, "method": "base64", "body": b64,
"numeric": 2, # 2 = letters only
"json": 1
})
Sai hoa/thường
Nguyên nhân: mặc định bộ giải trả kết quả chữ thường. Cách sửa: bật regsense=1 để phân biệt hoa/thường:
response = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY, "method": "base64", "body": b64,
"regsense": 1, # Case-sensitive
"json": 1
})
Thừa hoặc thiếu ký tự
Nguyên nhân: nhiễu ảnh bị đọc nhầm thành ký tự, hoặc hai ký tự dính liền bị gộp một. Cách sửa: khai báo độ dài đáp án cố định:
# If you know the CAPTCHA is always 6 characters
response = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY, "method": "base64", "body": b64,
"min_len": 6,
"max_len": 6,
"json": 1
})
Không tính được biểu thức toán học
Nguyên nhân: bộ giải đọc đúng chuỗi "3+7" nhưng trả nguyên văn thay vì kết quả "10". Cách sửa: bật calc=1:
response = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY, "method": "base64", "body": b64,
"calc": 1, # Compute the math expression
"json": 1
})
Ảnh CAPTCHA chất lượng kém
Ba dạng ảnh sau gây lỗi OCR dù tham số đã đúng.
Ảnh quá nhỏ
Vấn đề: ảnh có chiều cao dưới 50px làm mất chi tiết ký tự. Cách sửa: chụp ở kích thước lớn nhất hiện có; nếu trang nhúng ảnh nhỏ, kiểm tra URL nguồn có bản độ phân giải cao hơn:
# Check for higher-res version
img_src = captcha_el.get_attribute("src")
# Some sites use ?size=small — try removing or changing the parameter
high_res_src = img_src.replace("size=small", "size=large")
CAPTCHA dạng ảnh động (GIF)
Vấn đề: một số CAPTCHA dùng GIF động, văn bản chỉ hiện rõ ở vài khung hình nhất định. Cách sửa: tách từng khung hình và chọn khung có chữ:
from PIL import Image
gif = Image.open("captcha.gif")
# Extract each frame and find the one with text
for i in range(gif.n_frames):
gif.seek(i)
gif.save(f"frame_{i}.png")
Nền ảnh trong suốt
Vấn đề: PNG nền trong suốt có thể khiến OCR đọc sai. Cách sửa: thêm nền trắng trước khi gửi:
from PIL import Image
img = Image.open("captcha.png").convert("RGBA")
background = Image.new("RGBA", img.size, (255, 255, 255, 255))
background.paste(img, mask=img)
background.convert("RGB").save("captcha_white_bg.png")
Báo lỗi kết quả sai để CaptchaAI cải thiện độ chính xác
CaptchaAI trả sai? Báo lỗi thay vì tự sửa tay — dữ liệu này giúp cải thiện độ chính xác và có thể được hoàn phí giải đó:
# Report bad answer
requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY,
"action": "reportbad",
"id": task_id
})
Câu hỏi thường gặp
Vì sao kết quả OCR luôn sai đúng một ký tự?
Gần như luôn do thiếu min_len/max_len — nhiễu ảnh bị đọc nhầm thành ký tự thừa, hoặc hai ký tự dính liền bị gộp. Khai báo độ dài cố định trước khi kiểm tra chất lượng ảnh.
CaptchaAI có giải được CAPTCHA âm thanh không?
Không. Quy trình OCR này chỉ áp dụng cho CAPTCHA dạng ảnh/văn bản; CAPTCHA âm thanh cần luồng xử lý khác — xem tài liệu API CaptchaAI.
Tỷ lệ lỗi OCR bình thường là bao nhiêu?
Không có con số cố định. Sai vượt quá vài phần trăm trên cùng một loại CAPTCHA gần như luôn là thiếu tham số (numeric, regsense, min_len), không phải lỗi bộ giải.
Có cần bật calc=1 cho mọi CAPTCHA dạng phép tính không?
Có. Nếu không, bộ giải trả nguyên chuỗi "3+7" thay vì "10" — không dùng được để điền form.
CAPTCHA có dấu tiếng Việt thì xử lý thế nào?
Hiếm gặp trên các trang phổ biến. Bộ ký tự tiếng Việt vẫn là Latin, nên thử language=2 trước; nếu vẫn sai, bỏ tham số language để bộ giải tự nhận diện.