Hồ sơ tòa án, bất động sản, đăng ký doanh nghiệp và hộ tịch tại Mỹ đều là dữ liệu công khai — nhưng gần như cổng tra cứu nào cũng chặn bằng CAPTCHA ảnh kiểu cũ, chứ không phải reCAPTCHA hay Turnstile hiện đại. Nhiều agency Việt Nam nhận dự án nghiên cứu pháp lý, thẩm định tài sản cho khách hàng Mỹ qua Upwork hay hợp đồng outsourcing, và việc đầu tiên khi build script tra cứu hàng loạt là xử lý lớp CAPTCHA này.
4 bước xử lý CAPTCHA khi tra cứu hồ sơ công khai
Luồng xử lý luôn theo 4 bước, bất kể cổng nào:
- Tải trang tìm kiếm, giữ cookie phiên bằng session cố định.
- Trích xuất URL ảnh CAPTCHA từ HTML trả về.
- Gửi ảnh sang CaptchaAI qua
in.php, pollingres.phptới khi có kết quả. - Submit lại form kèm giá trị CAPTCHA đã giải.
Các loại CAPTCHA thường gặp theo từng cổng tra cứu
| Nhóm cổng thông tin | CAPTCHA phổ biến | Ví dụ thử thách |
|---|---|---|
| Tra cứu vụ án tòa án | CAPTCHA văn bản tùy chỉnh | Chuỗi 5–6 ký tự chữ và số bị biến dạng |
| Hồ sơ bất động sản theo quận | CAPTCHA toán học | "4 + 7 bằng bao nhiêu?" |
| Tra cứu đăng ký doanh nghiệp | CAPTCHA văn bản dạng ảnh | Chữ cái méo lẫn nhiễu đường kẻ |
| Hồ sơ hộ tịch (vital records) | reCAPTCHA v2 | Chọn ảnh trong lưới |
| Giấy phép xây dựng | CAPTCHA văn bản đơn giản | Mã số 4 chữ số |
| Hồ sơ UCC | CAPTCHA OCR tùy chỉnh | Chữ hoa/thường lẫn nhiễu nền |
Quy trình giải CAPTCHA khi tra cứu hồ sơ tòa án
Code Python dưới đây tải trang tìm kiếm, giải CAPTCHA ảnh nếu có, rồi submit lại form:
import requests
import base64
import time
from urllib.parse import urljoin
class PublicRecordsSearcher:
def __init__(self, api_key):
self.api_key = api_key
self.session = requests.Session()
self.session.headers.update({
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
})
def search_court_records(self, portal_url, case_number):
"""Search court records, solving image CAPTCHAs as needed."""
# Load the search page
page = self.session.get(f"{portal_url}/search")
# Extract CAPTCHA image
captcha_img_url = self._extract_captcha_url(page.text, portal_url)
if not captcha_img_url:
# No CAPTCHA on this page
return self._submit_search(portal_url, case_number)
# Download and solve CAPTCHA
img_response = self.session.get(captcha_img_url)
captcha_text = self._solve_image_captcha(img_response.content)
# Submit search with solved CAPTCHA
return self._submit_search(portal_url, case_number, captcha_text)
def _extract_captcha_url(self, html, base_url):
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, "html.parser")
# Look for common CAPTCHA image patterns
captcha_img = (
soup.find("img", {"id": "captchaImage"}) or
soup.find("img", {"class": "captcha"}) or
soup.find("img", attrs={"src": lambda s: s and "captcha" in s.lower()})
)
if captcha_img and captcha_img.get("src"):
return urljoin(base_url, captcha_img["src"])
return None
def _solve_image_captcha(self, image_bytes):
img_base64 = base64.b64encode(image_bytes).decode("utf-8")
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": self.api_key,
"method": "base64",
"body": img_base64,
"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": self.api_key,
"action": "get",
"id": task_id,
"json": 1
})
data = result.json()
if data["status"] == 1:
return data["request"]
raise TimeoutError("CAPTCHA solve timed out")
def _submit_search(self, portal_url, case_number, captcha_text=None):
form_data = {"caseNumber": case_number}
if captcha_text:
form_data["captcha"] = captcha_text
response = self.session.post(
f"{portal_url}/search/results",
data=form_data
)
return response.text
# Usage
searcher = PublicRecordsSearcher("YOUR_API_KEY")
results = searcher.search_court_records(
"https://courts.example.gov",
"2024-CV-12345"
)
Giải CAPTCHA toán học trên cổng chính phủ
Một số cổng chỉ dùng CAPTCHA toán học kiểu "4 + 7 = ?". Thêm tham số textinstructions để CaptchaAI đọc đúng phép tính:
def solve_math_captcha(self, image_bytes):
"""Solve math CAPTCHAs like '4 + 7 = ?'"""
img_base64 = base64.b64encode(image_bytes).decode("utf-8")
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": self.api_key,
"method": "base64",
"body": img_base64,
"textinstructions": "solve the math equation and return only the number",
"json": 1
})
task_id = resp.json()["request"]
# Poll for result
for _ in range(30):
time.sleep(3)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": self.api_key,
"action": "get",
"id": task_id,
"json": 1
})
data = result.json()
if data["status"] == 1:
return data["request"]
raise TimeoutError("Math CAPTCHA solve timed out")
Tham số API cần biết khi giải CAPTCHA hồ sơ công khai
| Tham số | Giá trị | Khi nào dùng |
|---|---|---|
method |
base64 |
Ảnh được tải về dưới dạng byte |
method |
post |
Gửi trực tiếp file ảnh |
language |
0 |
CAPTCHA văn bản tiếng Anh/Latin |
numeric |
1 |
CAPTCHA chỉ gồm chữ số |
min_len / max_len |
Tùy trường hợp | Khi số ký tự có thể đoán trước |
textinstructions |
Prompt tùy chỉnh | CAPTCHA toán học hoặc định dạng đặc thù |
Lỗi thường gặp khi tra cứu hồ sơ công khai
| Vấn đề | Nguyên nhân | Cách xử lý |
|---|---|---|
| Ảnh CAPTCHA trả về 403 | Thiếu cookie phiên | Tải trang trước, rồi mới fetch ảnh |
| Trả lời CAPTCHA sai | Chất lượng ảnh thấp | Tiền xử lý (tăng tương phản, khử nhiễu) |
| CAPTCHA đổi mới khi submit | Token form hết hạn | Trích xuất field ẩn cùng lúc với CAPTCHA |
| Tìm kiếm trả về trống | POST bị mất cookie do redirect | Dùng allow_redirects=True, giữ nguyên session |
Ảnh nhiễu nặng, chữ méo? Xem hướng dẫn tiền xử lý ảnh.
Tra cứu song song nhiều cổng bằng JavaScript
Cần tìm cùng một tên trên nhiều cổng? Gộp logic giải CAPTCHA vào một hàm dùng chung rồi lặp qua danh sách cổng:
class RecordsAggregator {
constructor(apiKey) {
this.apiKey = apiKey;
}
async searchAcrossPortals(query, portals) {
const results = [];
for (const portal of portals) {
try {
const data = await this.searchPortal(portal, query);
results.push({ portal: portal.name, records: data });
} catch (error) {
results.push({ portal: portal.name, error: error.message });
}
}
return results;
}
async searchPortal(portal, query) {
const pageResponse = await fetch(portal.searchUrl);
const html = await pageResponse.text();
// Check for image CAPTCHA
const captchaMatch = html.match(/captcha[^"]*\.(?:png|jpg|gif)/i);
let captchaAnswer = null;
if (captchaMatch) {
const imgUrl = new URL(captchaMatch[0], portal.searchUrl).href;
const imgData = await fetch(imgUrl);
const buffer = await imgData.arrayBuffer();
const base64 = Buffer.from(buffer).toString('base64');
captchaAnswer = await this.solveImageCaptcha(base64);
}
// Submit search
const formData = new URLSearchParams({ q: query });
if (captchaAnswer) formData.append('captcha', captchaAnswer);
const response = await fetch(portal.searchUrl, {
method: 'POST',
body: formData
});
return response.text();
}
async solveImageCaptcha(base64Image) {
const submitResp = await fetch('https://ocr.captchaai.com/in.php', {
method: 'POST',
body: new URLSearchParams({
key: this.apiKey,
method: 'base64',
body: base64Image,
json: '1'
})
});
const { request: taskId } = await submitResp.json();
for (let i = 0; i < 30; i++) {
await new Promise(r => setTimeout(r, 3000));
const result = await fetch(
`https://ocr.captchaai.com/res.php?key=${this.apiKey}&action=get&id=${taskId}&json=1`
);
const data = await result.json();
if (data.status === 1) return data.request;
}
throw new Error('CAPTCHA solve timed out');
}
}
// Usage
const aggregator = new RecordsAggregator('YOUR_API_KEY');
const results = await aggregator.searchAcrossPortals('Smith LLC', [
{ name: 'State Business Registry', searchUrl: 'https://sos.example.gov/search' },
{ name: 'County Court Records', searchUrl: 'https://courts.example.gov/search' }
]);
Vì sao đây là công việc quen thuộc với agency Việt Nam
Đây là dạng data-collection quen thuộc trong outsourcing pháp lý và due diligence tại Việt Nam:
- Kiểm tra tiền án tiền sự, xác minh tài sản thế chấp, rà soát hồ sơ trước M&A.
- Cổng chính phủ Mỹ hiếm khi có API chính thức, nên script phải mô phỏng trình duyệt.
- Khối lượng càng lớn, giải CAPTCHA càng là nút thắt đầu tiên cần tự động hóa.
- Kết quả có thể chứa dữ liệu cá nhân, nên lưu log và giới hạn dữ liệu thu thập.
Câu hỏi thường gặp
Vì sao cổng hồ sơ công khai của Mỹ vẫn dùng CAPTCHA ảnh kiểu cũ?
Nhiều hệ thống chính phủ chạy phần mềm lâu năm, xây trước khi reCAPTCHA và Turnstile phổ biến, và IT khu vực công nâng cấp rất chậm.
CaptchaAI xử lý CAPTCHA toán học trên cổng chính phủ như thế nào?
CaptchaAI coi CAPTCHA toán học là nhận dạng văn bản — chỉ cần thêm tham số textinstructions, không cần endpoint riêng.
Vì sao kết quả tìm kiếm trả về trống dù CAPTCHA đã giải đúng?
Thường do request POST sau khi giải CAPTCHA bị mất cookie phiên vì redirect. Bật allow_redirects=True và tái dùng cùng một session.
CaptchaAI có giải được reCAPTCHA v2 dạng lưới ảnh như trên hồ sơ hộ tịch không?
Có. reCAPTCHA v2, kể cả dạng chọn ảnh trong lưới, CaptchaAI hỗ trợ đầy đủ — dùng chung luồng gửi task và nhận token như trong bài này.
Bước tiếp theo
Muốn tự động hóa tra cứu hồ sơ công khai? Lấy API key CaptchaAI của bạn và áp dụng luồng giải CAPTCHA ở trên.