公共记录门户(法院系统、县评估员、国务卿备案、重要记录数据库)严重依赖图像和 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 密钥并处理政府门户验证码。