Hướng Dẫn API

Cách giải BLS CAPTCHA từng bước

Đặt lịch hẹn visa qua cổng BLS International thường vướng đúng một bước: một thử thách dạng ảnh yêu cầu chọn đúng các ô theo hướng dẫn văn bản, kiểu "Chọn tất cả ảnh có ô tô". Đây không phải reCAPTCHA hay Turnstile — BLS dùng một CAPTCHA tùy chỉnh riêng, nên các thư viện giải CAPTCHA thông thường không nhận diện được, và luồng xử lý phải đi qua API riêng của CaptchaAI với method=bls.

Tóm tắt 4 bước: trích xuất ảnh + hướng dẫn → gửi tới CaptchaAI → polling lấy kết quả → click đúng ảnh trên trang. Code Python và Node.js bên dưới chạy được ngay.


So sánh nhanh: BLS CAPTCHA và reCAPTCHA dạng lưới

Tiêu chí BLS CAPTCHA reCAPTCHA dạng lưới
Nguồn ảnh Ảnh riêng do BLS tạo, đổi theo phiên Bộ ảnh cố định của Google
Tham số gửi API Ảnh Base64 + văn bản hướng dẫn sitekey + pageurl
Nơi xuất hiện Cổng hẹn visa BLS International Nhiều website tích hợp reCAPTCHA

Vì BLS không dùng sitekey, script của bạn phải tự trích xuất ảnh và câu hướng dẫn từ DOM trước khi gửi đi — đây là điểm khác biệt lớn nhất so với các hướng dẫn reCAPTCHA khác. Xem thêm ở so sánh chi tiết BLS CAPTCHA và reCAPTCHA dạng lưới.


Bước 1: Trích xuất ảnh và hướng dẫn từ trang BLS

BLS CAPTCHA thường hiển thị 3–9 ảnh kèm một dòng hướng dẫn dạng "Chọn tất cả ảnh có ô tô". Lấy cả câu hướng dẫn và toàn bộ ảnh — đã là Base64 sẵn hoặc cần tải về rồi encode — trước khi gửi request.

Nếu bạn dùng Selenium:

from selenium import webdriver
from selenium.webdriver.common.by import By
import base64
import requests as req

driver = webdriver.Chrome()
driver.get("https://blsitalypakistan.com/appointment")

# Get instruction text
instruction = driver.find_element(By.CSS_SELECTOR, ".captcha-instruction").text
print(f"Instruction: {instruction}")

# Get all captcha images as base64
images = {}
captcha_imgs = driver.find_elements(By.CSS_SELECTOR, ".captcha-image img")
for i, img in enumerate(captcha_imgs, 1):
    src = img.get_attribute("src")
    if src.startswith("data:image"):
        # Already base64
        images[f"image_base64_{i}"] = src.split(",")[1]
    else:
        # Download and encode
        img_data = req.get(src).content
        images[f"image_base64_{i}"] = base64.b64encode(img_data).decode()

Nếu bạn dùng Puppeteer:

const puppeteer = require('puppeteer');

const browser = await puppeteer.launch({ headless: 'new' });
const page = await browser.newPage();
await page.goto('https://blsitalypakistan.com/appointment');

// Get instruction
const instruction = await page.$eval('.captcha-instruction', el => el.textContent);

// Get images as base64
const images = await page.$$eval('.captcha-image img', imgs =>
  imgs.map((img, i) => ({
    key: `image_base64_${i + 1}`,
    value: img.src.startsWith('data:') ? img.src.split(',')[1] : null
  }))
);

Bước 2: Gửi ảnh và hướng dẫn tới CaptchaAI

Gửi văn bản hướng dẫn cùng toàn bộ ảnh tới bộ giải BLS tại endpoint in.php.

Với Python:

import requests
import time

API_KEY = "YOUR_API_KEY"

payload = {
    "key": API_KEY,
    "method": "bls",
    "instructions": instruction,
    "json": 1
}

# Add each image (up to 9)
for key, value in images.items():
    payload[key] = value

response = requests.post("https://ocr.captchaai.com/in.php", data=payload)
data = response.json()

if data.get("status") != 1:
    raise Exception(f"Submit error: {data.get('request')}")

task_id = data["request"]
print(f"Task submitted: {task_id}")

Với Node.js:

const axios = require('axios');
const FormData = require('form-data');

async function submitBLS(instruction, images) {
  const params = {
    key: 'YOUR_API_KEY',
    method: 'bls',
    instructions: instruction,
    json: 1,
    ...Object.fromEntries(images.map(img => [img.key, img.value]))
  };

  const { data } = await axios.post('https://ocr.captchaai.com/in.php', null, { params });
  if (data.status !== 1) throw new Error(data.request);
  return data.request;
}

Bước 3: Polling lấy kết quả

res.php trả về chỉ số của các ảnh đúng, cách nhau bằng dấu phẩy, sau khi task xử lý xong.

def get_bls_solution(task_id):
    for _ in range(30):
        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"]  # e.g., "1,3,5" (image indices)
        if result.get("request") != "CAPCHA_NOT_READY":
            raise Exception(f"Error: {result.get('request')}")

    raise Exception("Timeout")

solution = get_bls_solution(task_id)
print(f"Select images: {solution}")  # e.g., "1,3,5"

Bước 4: Click đúng ảnh trên trang

Dùng các chỉ số vừa nhận để click vào đúng ảnh tương ứng, rồi submit form:

# Parse the solution indices
selected = [int(i) for i in solution.split(",")]

# Click each correct image
captcha_imgs = driver.find_elements(By.CSS_SELECTOR, ".captcha-image img")
for idx in selected:
    captcha_imgs[idx - 1].click()  # Convert 1-based to 0-based
    time.sleep(0.3)  # Small delay between clicks

# Submit the form
driver.find_element(By.CSS_SELECTOR, ".captcha-submit").click()

Checklist trước khi chạy

  • API key CaptchaAI — lấy tại captchaai.com
  • Ảnh BLS CAPTCHA — mã hóa Base64 từ trang
  • Văn bản hướng dẫn — câu cho biết cần chọn ảnh nào
  • Môi trường — Python 3.7+ hoặc Node.js 14+

Ví dụ Python đầy đủ

Gộp cả 4 bước trên thành một script chạy từ đầu đến cuối:

import requests
import time
import base64
from selenium import webdriver
from selenium.webdriver.common.by import By

API_KEY = "YOUR_API_KEY"
driver = webdriver.Chrome()
driver.get("https://blsitalypakistan.com/appointment")

# 1. Extract instruction and images
instruction = driver.find_element(By.CSS_SELECTOR, ".captcha-instruction").text
captcha_imgs = driver.find_elements(By.CSS_SELECTOR, ".captcha-image img")

payload = {"key": API_KEY, "method": "bls", "instructions": instruction, "json": 1}
for i, img in enumerate(captcha_imgs, 1):
    src = img.get_attribute("src")
    if src.startswith("data:image"):
        payload[f"image_base64_{i}"] = src.split(",")[1]

# 2. Submit to CaptchaAI
resp = requests.post("https://ocr.captchaai.com/in.php", data=payload).json()
task_id = resp["request"]

# 3. Poll for solution
for _ in range(30):
    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:
        selected = [int(i) for i in result["request"].split(",")]
        break

# 4. Click correct images and submit
for idx in selected:
    captcha_imgs[idx - 1].click()
    time.sleep(0.3)
driver.find_element(By.CSS_SELECTOR, ".captcha-submit").click()

print("CAPTCHA solved!")
driver.quit()

Khắc phục sự cố

Lỗi Nguyên nhân Cách xử lý
ERROR_BAD_PARAMETERS Thiếu hướng dẫn hoặc ảnh Gửi kèm cả văn bản hướng dẫn và ít nhất một ảnh
ERROR_CAPTCHA_UNSOLVABLE Ảnh quá mờ hoặc không nhận dạng được Chụp ảnh chất lượng cao hơn; kiểm tra lại việc mã hóa base64
Chọn sai ảnh Thứ tự ảnh không khớp Đảm bảo ảnh được đánh số đúng theo thứ tự hiển thị trên trang
Giải pháp bị từ chối Ảnh đã đổi sau khi trích xuất Trích xuất và gửi ảnh ngay lập tức, không cache lại

Áp dụng vào quy trình đặt lịch hẹn visa thực tế

Nhiều đại lý dịch vụ visa tại Hà Nội và TP.HCM xử lý hàng chục hồ sơ mỗi tuần trên cùng một cổng BLS, và cổng này thường giới hạn số lần thử cùng thời gian phiên khá ngắn. Khi tự động hóa bước giải CAPTCHA cho quy trình nội bộ đó, ba điểm sau đáng lưu ý:

  1. Chỉ chạy script trên các hồ sơ/tài khoản mà đội của bạn được khách hàng ủy quyền quản lý — đây là vận hành và kiểm thử quy trình đặt lịch hợp pháp, không phải giành chỗ tự động hàng loạt.
  2. Trích xuất và gửi ảnh ngay sau khi trang tải xong; như bảng lỗi phía trên, ảnh CAPTCHA đổi theo phiên nên chờ lâu sẽ khiến giải pháp bị từ chối.
  3. Ghi log task_id và thời điểm gửi để đối chiếu khi một hồ sơ bị BLS từ chối, thay vì đoán mò nguyên nhân.

Ví dụ chạy được đầy đủ

Cần một dự án hoàn chỉnh với thiết lập môi trường, polling, retry và xử lý lỗi sẵn có? Xem ví dụ chạy được đầy đủ trên GitHub →


Câu hỏi thường gặp

Giải BLS CAPTCHA qua CaptchaAI tốn bao nhiêu?

CaptchaAI tính phí theo thread chứ không theo từng lần giải, nên giải nhiều BLS CAPTCHA không phát sinh phụ phí ngoài gói. Gói BASIC ($15/tháng, 5 thread) đủ cho khối lượng nhỏ; nếu xử lý nhiều hồ sơ visa song song, cân nhắc STANDARD ($30/tháng, 15 thread) trở lên.

BLS CAPTCHA có giống nhau trên mọi cổng BLS International (Ý, Pakistan, Hàn Quốc...) không?

Về cơ chế thì có — cùng là ảnh tùy chỉnh kèm hướng dẫn văn bản, cùng gửi qua method=bls. Selector CSS trong ví dụ trên có thể cần chỉnh lại theo từng cổng cụ thể, nhưng luồng gửi và nhận kết quả từ CaptchaAI giữ nguyên.

Giải BLS CAPTCHA mất bao lâu?

Thường 15–30 giây. Thử thách nhận dạng ảnh mất nhiều thời gian hơn CAPTCHA dạng văn bản do phải xử lý nhiều ảnh cùng lúc.

Có thể giải BLS CAPTCHA mà không cần Selenium không?

Có. Chỉ cần trích xuất được ảnh và hướng dẫn qua request HTTP thông thường là đủ — API CaptchaAI chỉ yêu cầu ảnh base64 và văn bản hướng dẫn, không phụ thuộc vào công cụ trình duyệt cụ thể nào.

Vì sao CaptchaAI trả kết quả nhưng BLS vẫn từ chối giải pháp?

Nguyên nhân phổ biến nhất là ảnh đã thay đổi giữa lúc trích xuất và lúc gửi, hoặc thứ tự đánh số ảnh trong code không khớp thứ tự hiển thị thực tế trên trang. Trích xuất và gửi ngay trong cùng một lượt, không tái sử dụng ảnh từ phiên trước.


Hướng dẫn liên quan

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