Cas d'Usage

Gestion des CAPTCHA pour l'automatisation de la recherche dans les documents publics

Les portails d'archives publiques – systèmes judiciaires, évaluateurs de comté, dossiers du secrétaire d'État, bases de données d'état civil – s'appuient fortement sur les CAPTCHA d'images et d'OCR. Ces portails utilisent souvent des implémentations CAPTCHA plus anciennes avec du texte déformé, des problèmes mathématiques ou des défis d'image personnalisés. Voici comment les gérer dans différents types d'enregistrements.

Types CAPTCHA courants par portail

Catégorie du portail CAPTCHA typique Exemples de défis
Recherche de dossiers judiciaires CAPTCHA de texte personnalisé Distorsion de 5 à 6 caractères alphanumériques
Registres de propriété du comté CAPTCHA mathématique "Combien font 4 + 7 ?"
Recherche d'entité commerciale Texte de l'image CAPTCHA Lettres déformées avec bruit de ligne
Actes d'état civil reCAPTCHA v2 Sélection de la grille d'images
Permis de construire CAPTCHA de texte simple Code numérique à 4 chiffres
Dépôts UCC CAPTCHA OCR personnalisé Lettres majuscules mixtes avec bruit de fond

Recherche de documents publics avec la résolution de 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"
)

Gestion mathématique des CAPTCHA

Certains portails gouvernementaux utilisent de simples CAPTCHA mathématiques. CaptchaAI les gère comme une reconnaissance de texte :

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

Recherche multi-portails (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' }
]);

Paramètres CAPTCHA pour les portails gouvernementaux

Paramètre Valeur Quand utiliser
method base64 Image téléchargée en octets
method post Soumettre le fichier image directement
language 0 CAPTCHA de texte /Latin
numeric 1 CAPTCHA à chiffres uniquement
min_len / max_len Varie Quand le nombre de caractères est prévisible
textinstructions Invite personnalisée CAPTCHA mathématiques ou formats spécifiques

Dépannage

Problème Parce que Corriger
L'image CAPTCHA renvoie 403 Cookie de session manquant Chargez d'abord la page de recherche, puis récupérez l'image
Mauvaise réponse CAPTCHA Faible qualité d'image Prétraiter l'image (augmenter le contraste, supprimer le bruit)
CAPTCHA s'actualise lors de la soumission Le jeton de formulaire a expiré Extraire les champs de formulaire masqués avec CAPTCHA
La recherche revient vide après CAPTCHA POST redirige les cookies perdus Utilisez allow_redirects=True et persistez la session

FAQ

Pourquoi les portails gouvernementaux utilisent-ils encore des CAPTCHA d’images ?

De nombreux systèmes gouvernementaux exécutent des logiciels existants antérieurs à reCAPTCHA et Cloudflare Turnstile. Les CAPTCHA d'images personnalisées étaient la norme lors de la création de ces systèmes, et les mises à jour sont lentes dans l'informatique gouvernementale.

Quelle est la précision de CaptchaAI pour les CAPTCHA de texte déformé ?

CaptchaAI prend en charge plus de 27 500 types de CAPTCHA d’image avec une grande précision. Pour le texte fortement déformé, utilisez le paramètre textinstructions pour guider la reconnaissance – par exemple, "lettres et chiffres, pas d'espaces".

Dois-je prétraiter les images CAPTCHA avant de les soumettre ?

Le prétraitement (niveaux de gris, augmentation du contraste, suppression du bruit) peut améliorer la précision des images de très mauvaise qualité. Voir leguide de prétraitement d'imagepour les techniques.

Prochaines étapes

Automatisez les recherches dans les documents publics –récupérez votre clé API CaptchaAIet gérer les CAPTCHA du portail gouvernemental.


Étapes suivantes

  • Démarrage rapide CaptchaAI : votre première résolution de CAPTCHA en 5 minutes
  • Comment résoudre reCAPTCHA v2 via l'API : guide pas à pas
  • Comment résoudre Cloudflare Turnstile via l'API
  • Comment résoudre GeeTest v3 à l'aide de l'API
Les commentaires sont désactivés pour cet article.