BLS CAPTCHA là thử thách trên cổng đặt lịch hẹn visa và dịch vụ công — ảnh chữ biến dạng, toán học hoặc chọn ảnh theo yêu cầu, kèm mã instructions báo worker cách xử lý. CaptchaAI giải qua endpoint bls với tỷ lệ thành công cao; cái khó nằm ở giữ phiên và form nhiều bước sống sót tới lúc gửi.
Quản lý phiên: những điều bắt buộc trước khi chạy tutorial
Cổng chính phủ rất khắt khe về trạng thái phiên:
- Giữ đúng cookie — dùng
requests.Session()hoặc persistent context trình duyệt. - Không vượt giới hạn tần suất — chèn độ trễ giữa các lần tải (2–5 giây).
- Xử lý token CSRF — gửi kèm token CSRF trong mọi POST.
- Tôn trọng timeout phiên — hoàn tất luồng trong cửa sổ timeout.
- Theo dõi redirect — cho phép HTTP client tự động theo redirect.
Nhận diện các dạng thử thách BLS CAPTCHA
Không như CAPTCHA ảnh OCR chỉ có một dạng, BLS CAPTCHA có nhiều biến thể trên cùng một cổng:
- Chữ biến dạng trong ảnh
- Biểu thức toán học đơn giản (ví dụ: 7 + 3 = ?)
- Chọn ảnh theo yêu cầu tùy chỉnh (ví dụ: "chọn ảnh có xe đạp")
- Câu đố dạng văn bản
Thiếu hoặc sai instructions là nguyên nhân phổ biến nhất khiến kết quả không khớp thử thách.
BLS CAPTCHA xuất hiện ở đâu trên cổng dịch vụ công?
BLS CAPTCHA phổ biến trên các cổng thị thực và hồ sơ hành chính:
| Loại cổng thông tin | Vị trí CAPTCHA | Mục đích |
|---|---|---|
| Đặt lịch hẹn visa | Trước khi chọn khung giờ | Ngăn chiếm chỗ tự động bằng bot |
| Biểu mẫu tải tài liệu | Trước khi nộp | Xác minh thao tác người dùng |
| Tra cứu tình trạng hồ sơ | Trước khi hiển thị kết quả | Giới hạn tần suất truy vấn |
| Đơn đăng ký/khai báo | Trước khi gửi biểu mẫu | Ngăn gửi hàng loạt tự động |
Giải BLS CAPTCHA bằng CaptchaAI trong 3 bước
Bước 1: Lấy ảnh CAPTCHA và mã hướng dẫn
Tải trang cổng bằng một session dùng chung, rồi lấy phần tử ảnh CAPTCHA từ HTML:
import requests
from bs4 import BeautifulSoup
import base64
session = requests.Session()
# Load the portal page
page = session.get("https://portal.example.gov/appointment")
soup = BeautifulSoup(page.text, "html.parser")
# Find the CAPTCHA image
captcha_img = soup.select_one("img#captcha-image, img.captcha")
captcha_url = captcha_img["src"]
# Download the CAPTCHA image
if captcha_url.startswith("data:"):
# Base64 encoded inline image
img_data = captcha_url.split(",")[1]
else:
# URL-referenced image
img_response = session.get(captcha_url)
img_data = base64.b64encode(img_response.content).decode()
Ảnh có thể là base64 nhúng trong src hoặc một URL riêng — code trên xử lý cả hai.
Bước 2: Gửi tới CaptchaAI
Gửi ảnh base64 kèm instructions tới in.php, rồi polling res.php tới khi có kết quả:
import time
def solve_bls_captcha(image_base64, instructions=""):
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": "YOUR_API_KEY",
"method": "base64",
"body": image_base64,
"instructions": instructions,
"json": 1
})
task_id = resp.json()["request"]
for _ in range(30):
time.sleep(3)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": "YOUR_API_KEY",
"action": "get",
"id": task_id,
"json": 1
})
data = result.json()
if data["status"] == 1:
return data["request"]
raise TimeoutError("BLS solve timed out")
# Solve
captcha_answer = solve_bls_captcha(img_data)
Vòng lặp này chờ tối đa 90 giây — dư nhiều so với tốc độ giải BLS thực tế (dưới 1 giây), phần dư là để chừa độ trễ mạng.
Bước 3: Gửi biểu mẫu
Điền kết quả CAPTCHA vào form, gửi bằng cùng session để giữ cookie:
# Find form fields
form_data = {
"captcha_response": captcha_answer,
"appointment_type": "visa",
"location": "embassy-city",
# ... other form fields
}
# Submit with the same session (cookies preserved)
result = session.post(
"https://portal.example.gov/appointment/submit",
data=form_data
)
if "success" in result.text.lower():
print("Form submitted successfully")
Các mẫu quy trình thường gặp trên cổng chính phủ
Mẫu 1: Biểu mẫu nhiều bước
Cổng chính phủ thường chia form nhiều bước, CAPTCHA xuất hiện ở bước cuối:
# Step 1: Select service type
session.post(url, data={"service": "passport"})
# Step 2: Fill personal details
session.post(url, data={"name": "...", "dob": "..."})
# Step 3: Select appointment slot
session.post(url, data={"slot": "2026-04-10-09:00"})
# Step 4: Solve CAPTCHA and confirm
captcha_answer = solve_bls_captcha(get_captcha_image(session))
session.post(url, data={"captcha": captcha_answer, "confirm": "true"})
Mẫu 2: CAPTCHA làm mới khi trả lời sai
Nếu sai, cổng sinh CAPTCHA mới thay vì cho nhập lại:
max_attempts = 3
for attempt in range(max_attempts):
# Get fresh CAPTCHA for each attempt
captcha_image = get_captcha_image(session)
answer = solve_bls_captcha(captcha_image)
result = session.post(submit_url, data={"captcha": answer})
if "incorrect" not in result.text.lower():
break
print(f"Attempt {attempt + 1} — CAPTCHA refreshed, retrying")
Mẫu 3: Phiên có giới hạn thời gian
Đa số cổng tự hủy phiên sau một mốc thời gian cố định:
import time
session_start = time.time()
SESSION_TIMEOUT = 600 # 10 minutes typical
def check_session_valid():
elapsed = time.time() - session_start
if elapsed > SESSION_TIMEOUT - 60: # 1 min safety margin
print("Session expiring — refresh needed")
return False
return True
# Before CAPTCHA submission
if not check_session_valid():
# Start a fresh session
session = requests.Session()
session.get(portal_url)
session_start = time.time()
Xử lý các lỗi thường gặp
| Vấn đề | Nguyên nhân | Cách xử lý |
|---|---|---|
| "Phiên đã hết hạn" sau khi giải xong | Giải + gửi form mất quá lâu | Giải CAPTCHA ngay sát thời điểm gửi form |
| Ảnh CAPTCHA không tải được | Cổng cần header Referer cụ thể | Đặt Referer trỏ đúng URL trang cổng |
| Trả lời đúng nhưng form vẫn bị từ chối | Thiếu token CSRF hoặc trường ẩn | Trích xuất toàn bộ input ẩn từ form |
| Cổng chặn sau nhiều lần thử | Giới hạn tần suất (rate limit) | Giãn cách các lần thử, đổi IP nếu cần |
| Mỗi lần tải lại là một CAPTCHA khác | Cổng sinh CAPTCHA mới theo request | Lấy ảnh mới và giải lại |
Ứng dụng thực tế: đại lý dịch vụ visa tại Việt Nam
Các công ty dịch vụ visa ở TP.HCM và Hà Nội xử lý hàng chục hồ sơ Schengen/Anh mỗi tuần cho khách hàng đã ủy quyền, qua các cổng BLS. Thay vì cử nhân viên gõ CAPTCHA thủ công, họ đưa quy trình ở trên vào pipeline. Khối lượng nhỏ dùng BASIC ($15/tháng, 5 thread); agency chạy nhiều phiên song song nên cân nhắc ADVANCE ($90/tháng, 50 thread).
Lưu ý: giữ log theo
task_idcho từng phiên để tra soát khi khách hàng hỏi lại tiến độ.
Khi nào cần tự động hóa trình duyệt bằng JavaScript?
Nếu cổng bắt buộc JavaScript để hiển thị CAPTCHA hoặc kiểm tra client-side, dùng Puppeteer thay cho HTTP thuần:
const puppeteer = require('puppeteer');
async function handleBLSPortal() {
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
await page.goto('https://portal.example.gov/appointment');
// Wait for CAPTCHA to load
await page.waitForSelector('img#captcha-image');
// Get CAPTCHA image as base64
const imgBase64 = await page.evaluate(() => {
const img = document.querySelector('img#captcha-image');
const canvas = document.createElement('canvas');
canvas.width = img.naturalWidth;
canvas.height = img.naturalHeight;
const ctx = canvas.getContext('2d');
ctx.drawImage(img, 0, 0);
return canvas.toDataURL('image/png').split(',')[1];
});
// Solve with CaptchaAI
const answer = await solveBLSCaptcha(imgBase64);
// Type the answer
await page.type('#captcha-input', answer);
// Submit
await page.click('#submit-button');
// Wait for result
await page.waitForNavigation();
}
Chỉ dùng khi thật cần — trình duyệt headless tốn CPU và độ trễ hơn nhiều so với HTTP trực tiếp.
Câu hỏi thường gặp
BLS CAPTCHA khác gì CAPTCHA ảnh (OCR) thông thường?
BLS CAPTCHA đi kèm tham số instructions mô tả đúng dạng thử thách, còn CAPTCHA ảnh OCR chỉ có một dạng: đọc chữ. Truyền sai hoặc bỏ trống instructions là lý do phổ biến nhất khiến kết quả không khớp thử thách.
Giải BLS CAPTCHA với CaptchaAI mất bao lâu?
Dưới 1 giây theo số liệu chính thức. Thời gian thực tế cộng thêm độ trễ mạng và polling, nên tính cả phần dư đó vào ngân sách timeout của phiên.
Chi phí giải BLS CAPTCHA cho khối lượng lớn (agency visa) là bao nhiêu?
CaptchaAI tính phí theo thread, không theo lượt giải. BASIC ($15/tháng, 5 thread) đủ khối lượng nhỏ; nhiều hồ sơ cùng lúc thì lên ADVANCE ($90/tháng, 50 thread).
Vì sao phiên báo hết hạn dù CAPTCHA giải đúng?
Đây là lỗi thời gian, không phải lỗi CAPTCHA — cổng thường giới hạn phiên khoảng 10 phút, và tổng thời gian giải cộng nộp form có thể vượt mốc đó. Dùng check_session_valid() để làm mới phiên trước khi gọi.
Bài viết liên quan
- Hướng dẫn giải BLS CAPTCHA từng bước
- Giải BLS CAPTCHA bằng Node.js
- Cơ chế grid logic đằng sau BLS CAPTCHA
Các bước tiếp theo
Đưa việc giải BLS CAPTCHA trên cổng chính phủ vào pipeline đặt lịch hẹn của bạn — lấy API key CaptchaAI và chạy thử quy trình 3 bước ở trên với dữ liệu thật.