Đa số lỗi khi tích hợp method=bls không nằm ở CaptchaAI mà nằm ở bước trích xuất ảnh trước khi gửi request — sai thứ tự, sai định dạng base64, hoặc gửi trễ khi captcha đã hết hạn. BLS CAPTCHA dùng bộ triển khai tùy chỉnh riêng (khác hẳn reCAPTCHA hay Turnstile), nên các lỗi thường gặp cũng đặc thù hơn. Bài này liệt kê từng mã lỗi và tình huống thực tế, kèm code sửa bạn có thể áp dụng ngay.
Đội QA tại TP.HCM, Hà Nội theo dõi lịch hẹn trên cổng visa BLS thường gặp đúng nhóm lỗi này — phần lớn ở bước lấy ảnh từ DOM, không phải ở CaptchaAI. Giữ luồng test trong phạm vi bạn được phép truy cập.
Checklist gỡ lỗi nhanh
instructionsđúng chưa? So với văn bản hiển thị trên trang.- Ảnh base64 hợp lệ? Lưu ra file để kiểm tra.
- Số lượng ảnh khớp? So payload với số ảnh hiển thị.
- Thứ tự ảnh đúng? Đối chiếu DOM với hiển thị.
- Tiền tố base64 đã bỏ? Xóa
data:image/...;base64,. - Định dạng kết quả đúng chuẩn? Chuỗi chỉ số phân tách dấu phẩy, bắt đầu từ 1.
- Đã trừ 1 khi truy cập mảng? Chuyển 1-based sang 0-based trước khi click.
Lỗi gửi request tới API
ERROR_BAD_PARAMETERS
Lỗi này xuất hiện khi thiếu tham số bắt buộc trong request — thường là instructions hoặc ảnh.
- Thêm
instructionsvà đảm bảo ảnh gửi kèm đúng keyimage_base64_N
# WRONG — missing instructions
response = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY, "method": "bls",
"image_base64_1": img1, "json": 1
})
# CORRECT — include instructions
response = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY, "method": "bls",
"instructions": "Select all images with a car",
"image_base64_1": img1, "json": 1
})
ERROR_WRONG_FILE_EXTENSION
Dữ liệu ảnh gửi lên không phải base64 hợp lệ, hoặc định dạng không được hỗ trợ.
- Đảm bảo ảnh được mã hóa base64 dưới dạng PNG hoặc JPEG
- Bỏ tiền tố
data:image/...;base64, - Kiểm tra chuỗi base64 không bị cắt ngắn giữa chừng
import base64
# Strip the data URI prefix
src = img_element.get_attribute("src")
if src.startswith("data:image"):
b64 = src.split(",")[1]
else:
# Download and encode
img_data = requests.get(src).content
b64 = base64.b64encode(img_data).decode()
ERROR_CAPTCHA_UNSOLVABLE
Ảnh chất lượng quá thấp, bị mờ, hoặc instructions không rõ nghĩa khiến hệ thống không xác định được đáp án.
- Chụp ảnh ở độ phân giải gốc, không nén thêm
- Kiểm tra lại văn bản
instructionsđược trích xuất có đúng như hiển thị không - Thử lại — một số thử thách BLS vốn khó hơn mức trung bình, kể cả với người giải thật
Lỗi trích xuất ảnh từ trang BLS
Ảnh tải động, chưa có trong DOM
Ảnh captcha chưa xuất hiện khi trang vừa load xong, khiến selector không tìm thấy phần tử.
- Đợi ảnh render đầy đủ, đặt timeout tối thiểu 10 giây thay vì trích xuất ngay
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# Wait for captcha images to load
WebDriverWait(driver, 10).until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".captcha-image img"))
)
Ảnh nằm trên <canvas>, không phải thẻ <img>
Một số trang BLS render ảnh captcha lên phần tử <canvas> thay vì <img>, nên src không tồn tại để lấy trực tiếp.
canvas_elements = driver.find_elements(By.CSS_SELECTOR, ".captcha-canvas")
for i, canvas in enumerate(canvas_elements, 1):
b64 = driver.execute_script(
"return arguments[0].toDataURL('image/png').split(',')[1];",
canvas
)
payload[f"image_base64_{i}"] = b64
Ảnh bị chặn hotlink, tải trực tiếp trả về 403
URL ảnh trả lỗi 403 khi requests.get() từ ngoài trình duyệt.
- Trích xuất ngay trong ngữ cảnh trình duyệt, không tải lại bằng request riêng
# Get image data from within the browser
b64 = driver.execute_script("""
var img = arguments[0];
var canvas = document.createElement('canvas');
canvas.width = img.naturalWidth;
canvas.height = img.naturalHeight;
canvas.getContext('2d').drawImage(img, 0, 0);
return canvas.toDataURL('image/png').split(',')[1];
""", img_element)
Áp dụng sai kết quả giải
Chọn nhầm ảnh dù đã nhận đúng kết quả
Thứ tự ảnh lúc trích xuất không khớp với thứ tự hiển thị trên trang.
- Trích xuất và đánh index ảnh đúng theo thứ tự DOM, không sắp xếp lại
# Ensure images are indexed in display order
captcha_imgs = driver.find_elements(By.CSS_SELECTOR, ".captcha-image img")
# The order of find_elements matches DOM order = display order
for i, img in enumerate(captcha_imgs, 1):
payload[f"image_base64_{i}"] = extract_base64(img)
Chỉ số kết quả lệch 1 so với mảng ảnh
CaptchaAI trả về chỉ số bắt đầu từ 1, nhưng mảng ảnh trong code của bạn bắt đầu từ 0.
solution = result["request"] # e.g., "1,3,5"
indices = [int(i) for i in solution.split(",")]
# Convert to 0-based for array access
for idx in indices:
captcha_imgs[idx - 1].click() # 1-based → 0-based
Gửi form thất bại dù đã chọn đúng ảnh
Trang BLS còn một trường ẩn hoặc token phụ phải gửi kèm captcha.
# Look for hidden captcha tokens
hidden_fields = driver.find_elements(By.CSS_SELECTOR, "input[type='hidden']")
for field in hidden_fields:
name = field.get_attribute("name")
value = field.get_attribute("value")
print(f"Hidden field: {name}={value}")
Lỗi timeout và hết hạn phiên
Captcha hết hạn trước khi giải xong
BLS CAPTCHA có thời gian hiệu lực ngắn hơn nhiều loại khác, nên độ trễ giữa trích xuất và gửi request ảnh hưởng trực tiếp tới tỷ lệ thành công.
- Trích xuất ảnh và gửi tới CaptchaAI ngay lập tức, không giữ lại
- Không trích xuất ảnh trước rồi mới đợi để gửi sau
- Nếu quá trình giải vượt quá 60 giây, khả năng cao captcha đã hết hạn — refresh trang và thử lại từ đầu
Polling mất quá lâu mới có kết quả
Kiểm tra lại vòng lặp polling có đúng chuẩn không:
# Standard polling pattern
for _ in range(30): # 30 attempts × 5 seconds = 150 seconds max
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get", "id": task_id, "json": 1
}).json()
if result.get("status") == 1:
return result["request"]
if result.get("request") == "ERROR_CAPTCHA_UNSOLVABLE":
# Don't keep polling — start over
raise Exception("Unsolvable")
Câu hỏi thường gặp
Nên gửi bao nhiêu ảnh trong một request BLS?
Gửi toàn bộ ảnh hiển thị trong captcha, thường 3–9 ảnh, dùng image_base64_1 đến image_base64_9. Thiếu ảnh là nguyên nhân phổ biến nhất của ERROR_BAD_PARAMETERS.
Vì sao đã chọn đúng ảnh mà form vẫn báo lỗi?
Kiểm tra các input ẩn trên form — nhiều trang BLS gắn thêm token phụ hoặc trường xác nhận phải gửi cùng lựa chọn ảnh. Chỉ đúng ảnh thôi chưa đủ nếu thiếu trường này.
BLS CAPTCHA hết hạn sau bao lâu?
Không có con số cố định công khai, nhưng thời gian hiệu lực ngắn hơn reCAPTCHA hay Turnstile. Nếu trích xuất + giải vượt 60 giây, coi như phiên đã hết hạn và refresh lại thay vì gửi kết quả cũ.
Có thể tái sử dụng ảnh captcha cho lần giải sau không?
Không. BLS sinh ảnh riêng cho từng phiên, phải trích xuất ảnh mới mỗi lần captcha xuất hiện.
Giải BLS CAPTCHA qua CaptchaAI tính phí theo cách nào?
Theo thread chạy song song, không theo từng lần giải — gói BASIC ($15/tháng, 5 thread) đã gồm số lần giải không giới hạn mỗi thread. Khối lượng lớn hơn thì cân nhắc ADVANCE ($90/tháng, 50 thread).