Cả hai đều hiển thị hình ảnh mà người dùng phải chọn dựa trên lời nhắc văn bản. Nhưng BLS CAPTCHA là triển khai tùy chỉnh được sử dụng riêng trên hệ thống thị thực quốc tế BLS, trong khi reCAPTCHA là giải pháp được Google triển khai trên toàn cầu. Các phương pháp giải quyết, yêu cầu tích hợp và phương pháp API CaptchaAI khác nhau đáng kể.
So sánh song song
| tính năng | BLS CAPTCHA | Lưới reCAPTCHA |
|---|---|---|
| nhà cung cấp | BLS quốc tế (tùy chỉnh) | |
| định dạng | Tách các hình ảnh riêng biệt (3-9) | Hình ảnh đơn được chia thành lưới (3×3 hoặc 4×4) |
| Gạch động | Không - bộ hình ảnh cố định | Có - các ô mới mờ dần sau khi chọn |
| Phân tích hành vi | Tối thiểu | Mở rộng (chuột, thời gian, IP) |
| Hệ thống tính điểm | không có | Phân tích rủi ro theo mọi yêu cầu |
| phương pháp API | method=bls |
method=userrecaptcha |
| Các thông số cần thiết | instructions, image_base64_1..9 |
googlekey, pageurl |
| Định dạng phản hồi | Chỉ số hình ảnh (ví dụ: 1,3,5) |
Chuỗi mã thông báo |
| Giải quyết dựa trên mã thông báo | Không - phải giải quyết trực tiếp bằng hình ảnh | Có - phương thức mã thông báo xử lý lưới nội bộ |
| Cần có trình duyệt | Có (phải trích xuất hình ảnh từ DOM) | Tùy chọn (phương thức mã thông báo hoạt động mà không cần trình duyệt) |
| Nơi sử dụng | Chỉ các địa điểm hẹn phỏng vấn xin thị thực BLS | Hàng triệu trang web trên toàn cầu |
| Thời gian giải quyết điển hình | 5-15 giây | 10-30 giây |
Giải BLS CAPTCHA bằng CaptchaAI
BLS yêu cầu trích xuất từng hình ảnh từ trang, mã hóa chúng dưới dạng base64 và gửi chúng cùng với văn bản hướng dẫn.
Trăn:
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 lưới reCAPTCHA bằng CaptchaAI
reCAPTCHA sử dụng phương pháp tiếp cận dựa trên mã thông báo — không cần trích xuất hình ảnh.
Trăn:
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 độ phức tạp tích hợp
| Khía cạnh | BLS | Lưới reCAPTCHA |
|---|---|---|
| Trích xuất hình ảnh | Phải trích xuất từng hình ảnh từ DOM theo cách thủ công | Không cần thiết - phương thức mã thông báo xử lý nội bộ |
| Xử lý hướng dẫn | Phải trích xuất hướng dẫn văn bản từ trang | Không cần thiết |
| Mã hóa Base64 | Bắt buộc đối với mọi hình ảnh | Không cần thiết |
| Ứng dụng giải pháp | Nhấp vào từng hình ảnh theo chỉ số được trả về | Tiêm mã thông báo vào trường ẩn hoặc HTTP POST |
| Tự động hóa trình duyệt | Bắt buộc - không có giải pháp thay thế headless | Tùy chọn - có thể sử dụng các yêu cầu HTTP thuần túy |
| Khôi phục lỗi | Trích xuất lại hình ảnh khi thất bại | Yêu cầu lại mã thông báo khi thất bại |
| Giải quyết đồng thời | Bị giới hạn - hình ảnh được gắn với phiên trình duyệt | Dễ dàng — yêu cầu mã thông báo không có trạng thái |
| Dòng mã (điển hình) | 40-60 dòng | 15-25 dòng |
Khi nào nên sử dụng bộ giải nào
| Kịch bản | Cách tiếp cận được đề xuất |
|---|---|
| Đặt lịch hẹn xin visa BLS | Sử dụng method=bls với tính năng trích xuất hình ảnh |
| Bất kỳ trang web nào có reCAPTCHA | Sử dụng method=userrecaptcha với khóa trang web |
| Trang web BLS có nhúng reCAPTCHA | Kiểm tra xem cái nào bảo vệ hành động - các trang BLS đôi khi sử dụng cả hai |
| Hình ảnh xác thực không xác định | Trước tiên hãy kiểm tra xem nó có mang nhãn hiệu BLS hay không; nếu không, hãy thử phương pháp reCAPTCHA hoặc OCR |
Khắc phục sự cố
| vấn đề | sửa lỗi BLS | sửa lỗi reCAPTCHA |
|---|---|---|
| Trả lời sai trả về | Kiểm tra văn bản hướng dẫn khớp với nội dung trang hiển thị | Xác minh sitekey và pageurl là chính xác |
| Hình ảnh không tải | Thêm User-Agent và cookie khi tìm nạp URL hình ảnh |
Không áp dụng - không có hình ảnh để tìm nạp |
| Mã thông báo bị từ chối | Bấm vào các chỉ mục theo đúng thứ tự trên trang | Đưa vào g-recaptcha-response VÀ thực hiện gọi lại |
| Giải quyết quá chậm | Giảm số lượng hình ảnh - chỉ gửi hình ảnh hiển thị | Sử dụng proxy gần trang đích |
Câu hỏi thường gặp
Cái nào khó giải quyết hơn?
BLS yêu cầu nhiều công việc tích hợp hơn (trích xuất hình ảnh, phân tích lệnh và nhấp chuột dựa trên chỉ mục) nhưng hình ảnh thường rõ ràng và đơn giản hơn. reCAPTCHA dễ tích hợp hơn (phương pháp mã thông báo) nhưng các thách thức của Google có thể phức tạp hơn với các ô động.
Tôi có thể sử dụng phương thức mã thông báo reCAPTCHA cho BLS không?
Không. BLS không phải là triển khai reCAPTCHA. Bạn phải sử dụng method=bls với các hình ảnh được mã hóa base64 riêng lẻ và văn bản hướng dẫn.
Cả hai đều sử dụng công nghệ của Google phải không?
Không. BLS CAPTCHA là một triển khai tùy chỉnh, độc quyền được xây dựng cho các dịch vụ thị thực quốc tế BLS. reCAPTCHA là sản phẩm của Google được sử dụng trên hàng triệu trang web trên toàn cầu.
Giải pháp nào hiệu quả hơn về mặt chi phí ở quy mô lớn?
Việc giải quyết mã thông báo reCAPTCHA thường tiết kiệm chi phí hơn cho các hoạt động có khối lượng lớn vì việc tích hợp đơn giản hơn (không cần trích xuất hình ảnh) và bạn có thể chạy đồng thời các yêu cầu không trạng thái. Việc giải BLS yêu cầu một phiên trình duyệt cho mỗi lần giải.
Tôi có thể giải quyết cả hai loại trên cùng một trang không?
Vâng. Một số trang web BLS sử dụng CAPTCHA tùy chỉnh của họ để xác minh ban đầu và reCAPTCHA để gửi biểu mẫu. Phát hiện từng loại riêng biệt và sử dụng phương pháp CaptchaAI thích hợp cho từng loại.
Hướng dẫn liên quan
- Cách giải BLS CAPTCHA từng bước- hướng dẫn tích hợp BLS đầy đủ
- Cách giải reCAPTCHA v2 bằng API- hoàn thành hướng dẫn reCAPTCHA v2
- Giải thích về thử thách lưới reCAPTCHA— các thách thức về lưới điện hoạt động như thế nào
- Lỗi Captcha BLS và cách khắc phục sự cố- Sửa lỗi dành riêng cho BLS