应用场景

公共记录搜索自动化的验证码处理

公共记录门户(法院系统、县评估员、国务卿备案、重要记录数据库)严重依赖图像和 OCR 验证码。这些门户通常使用较旧的验证码实现,其中包含扭曲的文本、数学问题或自定义图像挑战。以下是如何跨不同记录类型处理它们。

门户常见的验证码类型

门户类 典型验证码 挑战示例
法庭案件搜索 自定义文本验证码 扭曲的 5-6 个字符的字母数字
县财产记录 数学验证码 “4+7是多少?”
商业实体搜索 图片文字验证码 带有线条噪音的扭曲字母
重要记录 reCAPTCHA v2 图像网格选择
建筑许可证 简单文本验证码 4 位数字代码
UCC 备案 自定义 OCR 验证码 带有背景噪音的混合大小写字母

使用验证码解决公共记录搜索

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"
)

数学验证码处理

一些政府门户网站使用简单的数学验证码。 CaptchaAI 将这些处理为文本识别:

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")

多门户搜索 (JavaScript)

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' }
]);

政府门户验证码参数

范围 价值 何时使用
method base64 以字节形式下载图像
method post 直接提交图片文件
language 0 英文/Latin 文字验证码
numeric 1 纯数字验证码
min_len / max_len 各不相同 当字符数可预测时
textinstructions 自定义提示 数学验证码或特定格式

故障排除

问题 原因 处理方式
验证码图像返回 403 会话 cookie 丢失 先加载搜索页面,然后获取图像
验证码答案错误 图像质量低 预处理图像(增加对比度,去除噪声)
提交时验证码刷新 表单令牌已过期 使用验证码提取隐藏的表单字段
验证码后搜索返回空 POST 重定向丢失 cookie 使用 allow_redirects=True 并保持会话

常问问题

为什么政府门户网站仍然使用图像验证码?

许多政府系统运行早于 reCAPTCHA 和 Cloudflare Turnstile 的遗留软件。自定义图像验证码是这些系统构建时的标准,而政府 IT 的更新速度很慢。

CaptchaAI 对于扭曲文本验证码的准确度如何?

CaptchaAI 支持超过 27,500 种高精度图像验证码类型。对于严重扭曲的文本,请使用 textinstructions 参数来指导识别 - 例如,“字母和数字,没有空格”。

我应该在提交之前对验证码图像进行预处理吗?

预处理(灰度、对比度增强、噪声消除)可以提高极低质量图像的准确性。请参阅图像预处理指南对于技术。

下一步

自动执行公共记录搜索 -获取您的 CaptchaAI API 密钥并处理政府门户验证码。


后续阅读

该文章已禁用评论。