So Sánh

So sánh BLS CAPTCHA và reCAPTCHA grid

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) Google
Đị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:

  1. Đọc chuỗi hướng dẫn hiển thị trên trang.
  2. Trích xuất từng ảnh và mã hóa base64.
  3. Gửi task kèm instructions lên CaptchaAI.
  4. Polling res.php cho đến khi có kết quả.
  5. 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:

  1. Trích xuất sitekey từ trang.
  2. Gửi sitekeypageurl lên CaptchaAI rồi polling cho đến khi nhận token.
  3. 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 sitekeypageurl 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-recaptcha kèm thuộc tính data-sitekey — nếu thấy, dùng method=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

Os comentários estão desativados para este artigo.