Khác biệt lớn nhất giữa BLS CAPTCHA và reCAPTCHA grid không nằm ở những hình ảnh bạn nhìn thấy, mà ở cách bạn giải chúng. Với reCAPTCHA grid, CaptchaAI trả về một token và bạn chỉ cần gắn token đó vào form — không cần mở trình duyệt. Với BLS CAPTCHA, bạn phải tự trích xuất từng ảnh từ DOM, mã hóa base64, gửi lên rồi click đúng ô theo chỉ số trả về.
Ba khác biệt quyết định cách bạn tích hợp:
- Nhà cung cấp & phạm vi: BLS là CAPTCHA tùy chỉnh chỉ có trên hệ thống đặt lịch visa của BLS International; reCAPTCHA là sản phẩm Google phủ khắp hàng triệu trang.
- Định dạng: BLS gồm nhiều ảnh rời; reCAPTCHA grid là một ảnh chia lưới 3×3 hoặc 4×4.
- Cách tích hợp: BLS phải mở trình duyệt và xử lý ảnh; reCAPTCHA grid giải bằng token qua request HTTP.
Bảng so sánh nhanh
| Tiêu chí | BLS CAPTCHA | reCAPTCHA grid |
|---|---|---|
| Nhà cung cấp | BLS International (tùy chỉnh) | |
| Định dạng | Nhiều ảnh riêng biệt (3–9 ảnh) | Một ảnh chia thành lưới (3×3 hoặc 4×4) |
| Ô động | Không — bộ ảnh cố định | Có — ô mới mờ dần hiện ra sau khi chọn |
| Phân tích hành vi | Tối thiểu | Nhiều (chuột, thời gian, IP) |
| Chấm điểm rủi ro | Không có | Phân tích rủi ro theo từng request |
| Phương thức API | method=bls |
method=userrecaptcha |
| Tham số cần gửi | instructions, image_base64_1..9 |
googlekey, pageurl |
| Định dạng kết quả | Chỉ số các ô (ví dụ 1,3,5) |
Chuỗi token |
| Giải bằng token | Không — phải giải trực tiếp trên ảnh | Có — phương thức token xử lý lưới nội bộ |
| Cần trình duyệt | Có (phải trích xuất ảnh từ DOM) | Tùy chọn (phương thức token chạy không cần trình duyệt) |
| Nơi xuất hiện | Chỉ cổng đặt lịch visa BLS | Hàng triệu trang trên toàn cầu |
| Thời gian giải điển hình | 5–15 giây | 10–30 giây |
Bạn gặp BLS CAPTCHA ở đâu
Với lập trình viên Việt Nam, BLS CAPTCHA gần như luôn xuất hiện trên cổng đặt lịch hẹn nộp hồ sơ visa của BLS International — nơi xử lý visa Schengen và một số quốc gia khác cho người nộp tại Việt Nam. Đây là loại CAPTCHA rất cụ thể: bạn chỉ gặp nó khi thao tác trên chính luồng đặt lịch mà bạn có quyền sử dụng. reCAPTCHA thì ngược lại — bạn gặp nó ở khắp nơi, từ form đăng ký, đăng nhập cho tới trang thương mại điện tử.
Sự khác biệt về phạm vi này quyết định luôn cách bạn tích hợp: BLS bắt bạn xử lý ảnh trực tiếp trên trang, còn reCAPTCHA có thể giải hoàn toàn qua API bằng token. Hai phần code dưới đây cho thấy khoảng cách đó rõ nhất.
Giải BLS CAPTCHA bằng CaptchaAI
BLS bắt bạn làm việc trực tiếp với ảnh. Luồng gồm năm bước:
- Đọc chuỗi hướng dẫn hiển thị trên trang.
- Trích xuất từng ảnh và mã hóa base64.
- Gửi task kèm
instructionslên CaptchaAI. - Polling
res.phpcho đến khi có kết quả. - Click đúng ô theo chỉ số trả về.
Python:
import requests
import base64
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://example-bls-site.com/appointment")
# Step 1: Extract instruction text
instruction = driver.find_element(By.CSS_SELECTOR, ".captcha-instruction").text
# Example: "Select all images with a motorcycle"
# Step 2: Extract and encode each image
images = driver.find_elements(By.CSS_SELECTOR, ".captcha-image img")
image_data = {}
for i, img in enumerate(images, 1):
# Get image source and convert to base64
src = img.get_attribute("src")
if src.startswith("data:image"):
b64 = src.split(",")[1]
else:
img_bytes = requests.get(src).content
b64 = base64.b64encode(img_bytes).decode()
image_data[f"image_base64_{i}"] = b64
# Step 3: Submit to CaptchaAI
payload = {
"key": "YOUR_API_KEY",
"method": "bls",
"instructions": instruction,
**image_data
}
resp = requests.post("https://ocr.captchaai.com/in.php", data=payload)
task_id = resp.text.split("|")[1]
# Step 4: Poll for result
for _ in range(30):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": "YOUR_API_KEY", "action": "get", "id": task_id
})
if result.text.startswith("OK|"):
indices = result.text.split("|")[1] # e.g., "1,3,5"
break
# Step 5: Click the correct images
for idx in indices.split(","):
images[int(idx) - 1].click()
time.sleep(0.3) # Small delay between clicks
Node.js:
const axios = require("axios");
const puppeteer = require("puppeteer");
(async () => {
const browser = await puppeteer.launch({ headless: "new" });
const page = await browser.newPage();
await page.goto("https://example-bls-site.com/appointment");
// Extract instruction text
const instruction = await page.$eval(
".captcha-instruction",
(el) => el.textContent,
);
// Extract images as base64
const imageElements = await page.$$(".captcha-image img");
const imageData = {};
for (let i = 0; i < imageElements.length; i++) {
const src = await imageElements[i].evaluate((el) => el.src);
let b64;
if (src.startsWith("data:image")) {
b64 = src.split(",")[1];
} else {
const resp = await axios.get(src, { responseType: "arraybuffer" });
b64 = Buffer.from(resp.data).toString("base64");
}
imageData[`image_base64_${i + 1}`] = b64;
}
// Submit to CaptchaAI
const formData = new URLSearchParams({
key: "YOUR_API_KEY",
method: "bls",
instructions: instruction,
...imageData,
});
const submitResp = await axios.post(
"https://ocr.captchaai.com/in.php",
formData.toString(),
);
const taskId = submitResp.data.split("|")[1];
// Poll for result
let indices;
for (let i = 0; i < 30; i++) {
await new Promise((r) => setTimeout(r, 5000));
const result = await axios.get("https://ocr.captchaai.com/res.php", {
params: { key: "YOUR_API_KEY", action: "get", id: taskId },
});
if (result.data.startsWith("OK|")) {
indices = result.data.split("|")[1];
break;
}
}
// Click correct images
for (const idx of indices.split(",")) {
await imageElements[parseInt(idx) - 1].click();
await new Promise((r) => setTimeout(r, 300));
}
await browser.close();
})();
Giải reCAPTCHA grid bằng CaptchaAI
reCAPTCHA dùng phương thức dựa trên token nên nhẹ hơn hẳn — bạn không đụng đến ảnh. Luồng chỉ có ba bước, chạy được hoàn toàn bằng request HTTP:
- Trích xuất
sitekeytừ trang. - Gửi
sitekeyvàpageurllên CaptchaAI rồi polling cho đến khi nhận token. - Gắn token vào form và gửi đi.
Python:
import requests
import time
# Step 1: Extract sitekey from page
# <div class="g-recaptcha" data-sitekey="6Le-wvkS..."></div>
sitekey = "6Le-wvkSAAAAAPBMRTvw..."
page_url = "https://example.com/form"
# Step 2: Submit to CaptchaAI
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": page_url
})
task_id = resp.text.split("|")[1]
# Step 3: Poll for token
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": "YOUR_API_KEY", "action": "get", "id": task_id
})
if result.text.startswith("OK|"):
token = result.text.split("|")[1]
break
# Step 4: Inject token (no clicking needed)
# Option A: Hidden field injection
driver.execute_script(
f'document.getElementById("g-recaptcha-response").value = "{token}";'
)
# Option B: Pure HTTP submission
requests.post(page_url, data={"g-recaptcha-response": token, "other_field": "value"})
Node.js:
const axios = require("axios");
async function solveRecaptchaGrid(sitekey, pageUrl) {
// Submit
const submitResp = await axios.get("https://ocr.captchaai.com/in.php", {
params: {
key: "YOUR_API_KEY",
method: "userrecaptcha",
googlekey: sitekey,
pageurl: pageUrl,
},
});
const taskId = submitResp.data.split("|")[1];
// Poll for token
for (let i = 0; i < 60; i++) {
await new Promise((r) => setTimeout(r, 5000));
const result = await axios.get("https://ocr.captchaai.com/res.php", {
params: { key: "YOUR_API_KEY", action: "get", id: taskId },
});
if (result.data.startsWith("OK|")) {
return result.data.split("|")[1];
}
}
throw new Error("Solve timed out");
}
So sánh công sức tích hợp
Bảng dưới cho thấy vì sao BLS thường tốn gấp đôi số dòng code so với reCAPTCHA grid — toàn bộ khối lượng nằm ở khâu xử lý ảnh mà reCAPTCHA không có.
| Khía cạnh | BLS | reCAPTCHA grid |
|---|---|---|
| Trích xuất ảnh | Phải tự lấy từng ảnh từ DOM | Không cần — phương thức token xử lý nội bộ |
| Xử lý hướng dẫn | Phải đọc chuỗi hướng dẫn từ trang | Không cần |
| Mã hóa base64 | Bắt buộc cho mọi ảnh | Không cần |
| Áp dụng kết quả | Click từng ảnh theo chỉ số trả về | Gắn token vào trường ẩn hoặc HTTP POST |
| Tự động hóa trình duyệt | Bắt buộc — không có phương án bỏ trình duyệt | Tùy chọn — có thể dùng request HTTP thuần |
| Khôi phục khi lỗi | Trích xuất lại ảnh và giải lại | Xin lại token |
| Giải đồng thời | Hạn chế — ảnh gắn với phiên trình duyệt | Dễ — request token không trạng thái |
| Số dòng code điển hình | 40–60 dòng | 15–25 dòng |
Chọn phương thức nào cho từng trường hợp
| Trường hợp | Phương thức nên dùng |
|---|---|
| Đặt lịch hẹn visa BLS | method=bls kèm trích xuất ảnh |
| Trang bất kỳ có reCAPTCHA | method=userrecaptcha kèm sitekey |
| Trang BLS có nhúng reCAPTCHA | Kiểm tra loại nào đang chặn thao tác — trang BLS đôi khi dùng cả hai |
| CAPTCHA ảnh chưa rõ loại | Kiểm tra có mang nhãn BLS không; nếu không, thử phương thức reCAPTCHA hoặc OCR |
Xử lý các lỗi thường gặp
| Vấn đề | Cách xử lý cho BLS | Cách xử lý cho reCAPTCHA |
|---|---|---|
| Kết quả trả về sai | Kiểm tra chuỗi hướng dẫn khớp với nội dung trang hiển thị | Xác minh sitekey và pageurl chính xác |
| Ảnh không tải được | Thêm User-Agent và cookie khi tải URL ảnh |
Không áp dụng — không có ảnh để tải |
| Token bị từ chối | Click các ô đúng thứ tự trên trang | Gắn vào g-recaptcha-response và chạy cả callback |
| Giải quá chậm | Giảm số ảnh gửi lên — chỉ gửi ảnh đang hiển thị | Dùng proxy có vị trí gần máy chủ đích để giảm độ trễ |
Câu hỏi thường gặp
Làm sao biết một trang đang dùng BLS CAPTCHA hay reCAPTCHA?
Kiểm tra HTML của trang, dựa vào hai dấu hiệu:
- reCAPTCHA: có phần tử
g-recaptchakèm thuộc tínhdata-sitekey— nếu thấy, dùngmethod=userrecaptcha. - BLS CAPTCHA: một bộ ảnh riêng lẻ kèm chuỗi hướng dẫn, thường mang nhãn hiệu BLS và chỉ xuất hiện trên cổng đặt lịch visa BLS.
Giải BLS CAPTCHA có bắt buộc dùng trình duyệt không?
Có, với BLS thì bắt buộc. Bạn phải mở trang trong trình duyệt (Selenium hoặc Puppeteer) để trích xuất ảnh và click đúng ô theo chỉ số trả về. reCAPTCHA thì ngược lại — phương thức token chạy hoàn toàn qua request HTTP, không cần trình duyệt.
CaptchaAI tính phí thế nào khi giải hai loại CAPTCHA này?
CaptchaAI tính phí theo thread (luồng giải đồng thời), không tính theo từng lần giải. Mọi gói — từ BASIC ($15/tháng, 5 thread) trở lên — đều giải không giới hạn số lượng trong tháng. Khác biệt chi phí thực tế nằm ở chỗ mỗi thread bị chiếm bao lâu: request token của reCAPTCHA không trạng thái nên thread được giải phóng nhanh, còn BLS giữ một phiên trình duyệt cho mỗi lần giải nên throughput trên mỗi thread thấp hơn.
Loại nào dễ mở rộng cho khối lượng lớn hơn?
reCAPTCHA grid dễ mở rộng hơn. Vì request token không trạng thái, bạn có thể chạy song song nhiều request trên cùng số thread mà không cần mở trình duyệt. BLS thì mỗi lần giải cần một phiên trình duyệt riêng để trích xuất và click ảnh, nên khó chạy đồng thời khi khối lượng tăng.
Một trang BLS có thể vừa dùng CAPTCHA riêng vừa dùng reCAPTCHA không?
Có. Một số cổng BLS dùng CAPTCHA riêng của họ cho bước xác minh ban đầu và reCAPTCHA cho bước gửi biểu mẫu. Hãy phát hiện từng loại riêng và gọi đúng phương thức CaptchaAI cho mỗi loại.
Hướng dẫn liên quan
- Hướng dẫn giải BLS CAPTCHA từng bước — quy trình tích hợp BLS đầy đủ
- Cách giải reCAPTCHA v2 bằng API — hướng dẫn reCAPTCHA v2 chi tiết
- Thử thách lưới reCAPTCHA hoạt động thế nào — giải thích cơ chế lưới
- Các lỗi BLS CAPTCHA và cách khắc phục — sửa lỗi riêng cho BLS