Сценарии использования

Обработка CAPTCHA для автоматизации поиска в публичных записях

Порталы публичных записей — судебные системы, окружные заседатели, документы государственного секретаря, базы данных записей актов гражданского состояния — в значительной степени полагаются на изображения и OCR CAPTCHA. На этих порталах часто используются старые реализации CAPTCHA с искаженным текстом, математическими задачами или пользовательскими изображениями. Вот как их обрабатывать в разных типах записей.

Распространенные типы CAPTCHA на портале

Категория портала Типичная капча Примеры задач
Поиск судебного дела Пользовательский текстовый CAPTCHA Искаженные буквы и цифры длиной 5–6 символов.
Записи об имуществе округа Математическая капча «Сколько будет 4 + 7?»
Поиск субъекта хозяйствования Текст изображения CAPTCHA Искаженные буквы с линейным шумом
Записи актов гражданского состояния reCAPTCHA v2 Выбор сетки изображений
Разрешения на строительство Простая текстовая капча 4-значный цифровой код
Документы UCC Пользовательская OCR CAPTCHA Буквы смешанного регистра с фоновым шумом

Поиск в публичных записях с решением CAPTCHA

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

Обработка математической капчи

Некоторые правительственные порталы используют простые математические CAPTCHA. 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' }
]);

Параметры CAPTCHA для государственных порталов

Параметр Ценить Когда использовать
method base64 Изображение загружено в байтах
method post Отправьте файл изображения напрямую
language 0 Russian/Latin текст CAPTCHA
numeric 1 CAPTCHA, состоящая только из цифр
min_len / max_len Варьируется Когда количество символов предсказуемо
textinstructions Пользовательское приглашение Математические CAPTCHA или определенные форматы

Поиск неисправностей

Проблема Причина Исправить
Изображение CAPTCHA возвращает 403 Файл cookie сеанса отсутствует Сначала загрузите страницу поиска, затем получите изображение
Неправильный ответ на CAPTCHA Низкое качество изображения Предварительная обработка изображения (увеличение контрастности, удаление шума)
CAPTCHA обновляется при отправке Срок действия токена формы истек Извлекайте скрытые поля формы с помощью CAPTCHA
Поиск возвращается пустым после CAPTCHA POST-перенаправление потерянных файлов cookie Используйте allow_redirects=True и сохраните сеанс.

Часто задаваемые вопросы

Почему правительственные порталы до сих пор используют графические CAPTCHA?

Многие правительственные системы используют устаревшее программное обеспечение, созданное до reCAPTCHA и Cloudflare Turnstile. На момент создания этих систем пользовательские изображения CAPTCHA были стандартом, а обновления в государственных ИТ-отделах происходят медленно.

Насколько точен CaptchaAI для искаженных текстовых CAPTCHA?

CaptchaAI поддерживает более 27 500 типов изображений CAPTCHA с высокой точностью. Для сильно искаженного текста используйте параметр textinstructions для распознавания — например, «буквы и цифры, без пробелов».

Должен ли я предварительно обрабатывать изображения CAPTCHA перед отправкой?

Предварительная обработка (оттенки серого, усиление контрастности, удаление шума) может повысить точность изображений очень низкого качества. См.руководство по предварительной обработке изображенийдля техник.

Следующие шаги

Автоматизируйте поиск в публичных записях —получите свой API-ключ CaptchaAIи обрабатывать CAPTCHA правительственного портала.


Следующие шаги

  • CaptchaAI Quickstart: ваше первое решение CAPTCHA за 5 минут
  • Как решить reCAPTCHA v2 через API: пошаговое руководство
  • Как решить Cloudflare Turnstile через API
  • Как решить GeeTest v3 с помощью API
Комментарии для этой статьи отключены.