Trường Hợp Sử Dụng

Xử lý CAPTCHA để tự động hóa tìm kiếm hồ sơ công cộng

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:

  1. Tải trang tìm kiếm, giữ cookie phiên bằng session cố định.
  2. Trích xuất URL ảnh CAPTCHA từ HTML trả về.
  3. Gửi ảnh sang CaptchaAI qua in.php, polling res.php tới khi có kết quả.
  4. 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.


Đọc thêm

  1. CaptchaAI Quickstart: Lần Giải CAPTCHA Đầu Tiên Của Bạn Trong 5 Phút
  2. Cách Giải reCAPTCHA v2 Bằng API: Hướng Dẫn Từng Bước
  3. Cách giải Cloudflare Turnstile bằng API
  4. Cách giải quyết GeeTest v3 bằng API
Os comentários estão desativados para este artigo.