Cas d'Usage

Automatisation du portail gouvernemental avec la résolution de CAPTCHA

Les sites Web gouvernementaux utilisent des CAPTCHA pour protéger les formulaires, les systèmes de prise de rendez-vous et les portails d'archives publiques. Les équipes d'assurance qualité, les développeurs de technologies civiques et les professionnels du droit ont besoin d'un accès automatisé pour tester et exploiter efficacement ces flux de travail.


CAPTCHA gouvernementaux par catégorie

Catégorie de portail CAPTCHA commun Exemples de sites Cas d'utilisation
Visas/immigration BLS, reCAPTCHA v2 Portails BLS, USCIS Prise de rendez-vous
DMV / véhicules à moteur reCAPTCHA v2, image Sites DMV d'État Renouvellement d'inscription
Dossiers judiciaires reCAPTCHA v2 PACER, tribunaux d'État Recherche de cas
Permis/licences Image CAPTCHA Portails de permis de ville Dépôt de candidature
Portails fiscaux reCAPTCHA v2 IRS, sites fiscaux d'État Vérifications de l'état du dépôt
Archives publiques Image CAPTCHA, reCAPTCHA Registres du comté Propriété/deed recherche

Automatisation des rendez-vous pour les visas BLS

Les portails BLS utilisent leur propre système CAPTCHA. CaptchaAI prend en charge les BLS CAPTCHA avec une précision de 100 % :

import requests
import time
import base64

CAPTCHAAI_KEY = "YOUR_API_KEY"
CAPTCHAAI_URL = "https://ocr.captchaai.com"


def solve_bls_captcha(captcha_image_url, session):
    """Solve BLS-specific CAPTCHA."""
    # Download CAPTCHA image
    img_resp = session.get(captcha_image_url)
    img_b64 = base64.b64encode(img_resp.content).decode()

    resp = requests.post(f"{CAPTCHAAI_URL}/in.php", data={
        "key": CAPTCHAAI_KEY,
        "method": "base64",
        "body": img_b64,
        "json": 1,
    })
    task_id = resp.json()["request"]

    for _ in range(30):
        time.sleep(3)
        result = requests.get(f"{CAPTCHAAI_URL}/res.php", params={
            "key": CAPTCHAAI_KEY, "action": "get",
            "id": task_id, "json": 1,
        })
        data = result.json()
        if data["request"] != "CAPCHA_NOT_READY":
            return data["request"]

    raise TimeoutError("BLS CAPTCHA timeout")


class BLSAppointmentBooker:
    def __init__(self):
        self.session = requests.Session()
        self.session.headers.update({
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
            "AppleWebKit/537.36 Chrome/126.0.0.0 Safari/537.36",
        })

    def login(self, portal_url, email, password):
        """Login to BLS portal with CAPTCHA."""
        resp = self.session.get(portal_url)

        # Extract CAPTCHA image URL from page
        import re
        match = re.search(r'src="(/captcha[^"]+)"', resp.text)
        if match:
            captcha_url = portal_url.rstrip("/") + match.group(1)
            captcha_text = solve_bls_captcha(captcha_url, self.session)
        else:
            captcha_text = ""

        login_resp = self.session.post(portal_url, data={
            "email": email,
            "password": password,
            "captcha": captcha_text,
        })
        return login_resp.status_code == 200

    def check_appointment_slots(self, slots_url):
        """Check available appointment slots."""
        resp = self.session.get(slots_url)
        if resp.status_code == 200:
            return resp.json().get("available_slots", [])
        return []

    def book_slot(self, booking_url, slot_id, applicant_data):
        """Book an appointment slot, handling any CAPTCHA."""
        resp = self.session.get(booking_url)

        # Check for CAPTCHA on booking page
        import re
        match = re.search(r'src="(/captcha[^"]+)"', resp.text)
        if match:
            captcha_url = booking_url.rstrip("/") + match.group(1)
            captcha_text = solve_bls_captcha(captcha_url, self.session)
        else:
            captcha_text = ""

        resp = self.session.post(booking_url, data={
            "slot_id": slot_id,
            "captcha": captcha_text,
            **applicant_data,
        })

        return {
            "success": resp.status_code == 200,
            "confirmation": resp.json().get("confirmation_number"),
        }

Recherche de dossiers judiciaires

def solve_recaptcha(sitekey, pageurl):
    resp = requests.post(f"{CAPTCHAAI_URL}/in.php", data={
        "key": CAPTCHAAI_KEY,
        "method": "userrecaptcha",
        "googlekey": sitekey,
        "pageurl": pageurl,
        "json": 1,
    })
    task_id = resp.json()["request"]

    for _ in range(60):
        time.sleep(5)
        result = requests.get(f"{CAPTCHAAI_URL}/res.php", params={
            "key": CAPTCHAAI_KEY, "action": "get",
            "id": task_id, "json": 1,
        })
        data = result.json()
        if data["request"] != "CAPCHA_NOT_READY":
            return data["request"]
    raise TimeoutError("Timeout")


class CourtRecordSearcher:
    def __init__(self, proxy=None):
        self.session = requests.Session()
        if proxy:
            self.session.proxies = {"http": proxy, "https": proxy}
        self.session.headers.update({
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
            "AppleWebKit/537.36 Chrome/126.0.0.0 Safari/537.36",
        })

    def search_cases(self, court_url, search_params, sitekey):
        """Search court records with reCAPTCHA handling."""
        # Load search page
        self.session.get(court_url)

        # Solve CAPTCHA
        token = solve_recaptcha(sitekey, court_url)

        # Submit search with token
        resp = self.session.post(court_url, data={
            **search_params,
            "g-recaptcha-response": token,
        })

        if resp.status_code == 200:
            return self._parse_results(resp.text)
        return []

    def _parse_results(self, html):
        from bs4 import BeautifulSoup
        soup = BeautifulSoup(html, "html.parser")
        cases = []
        for row in soup.select("table.results tr")[1:]:
            cols = row.select("td")
            if len(cols) >= 4:
                cases.append({
                    "case_number": cols[0].get_text(strip=True),
                    "parties": cols[1].get_text(strip=True),
                    "date": cols[2].get_text(strip=True),
                    "status": cols[3].get_text(strip=True),
                })
        return cases

Image CAPTCHA sur les portails de permis

De nombreux portails de villes et de comtés utilisent de simples CAPTCHA d’images :

def solve_image_captcha(image_url, session):
    """Solve image-based CAPTCHA common on local government sites."""
    img = session.get(image_url)
    img_b64 = base64.b64encode(img.content).decode()

    resp = requests.post(f"{CAPTCHAAI_URL}/in.php", data={
        "key": CAPTCHAAI_KEY,
        "method": "base64",
        "body": img_b64,
        "json": 1,
    })
    task_id = resp.json()["request"]

    for _ in range(20):
        time.sleep(3)
        result = requests.get(f"{CAPTCHAAI_URL}/res.php", params={
            "key": CAPTCHAAI_KEY, "action": "get",
            "id": task_id, "json": 1,
        })
        data = result.json()
        if data["request"] != "CAPCHA_NOT_READY":
            return data["request"]

    raise TimeoutError("Image CAPTCHA timeout")

Recherche par lots de documents publics

import csv


def batch_property_lookup(addresses, portal_url, sitekey, output_file):
    """Look up multiple property records, solving CAPTCHA per batch."""
    session = requests.Session()
    session.headers.update({
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
        "AppleWebKit/537.36 Chrome/126.0.0.0 Safari/537.36",
    })

    results = []
    for i, address in enumerate(addresses):
        try:
            # Solve CAPTCHA every 5th request (or when required)
            if i % 5 == 0:
                token = solve_recaptcha(sitekey, portal_url)

            resp = session.post(portal_url, data={
                "address": address,
                "g-recaptcha-response": token,
            })

            if resp.status_code == 200:
                results.append({
                    "address": address,
                    "data": resp.json(),
                })

            time.sleep(3)  # Be respectful

        except Exception as e:
            results.append({"address": address, "error": str(e)})

    # Save results
    with open(output_file, "w", newline="") as f:
        writer = csv.DictWriter(f, fieldnames=["address", "data", "error"])
        writer.writeheader()
        writer.writerows(results)

    return results

Conseils de gestion de session

Les portails gouvernementaux ont souvent des délais d'attente de session courts :

Type de portail Expiration de la session Recommandation
Portails de visa 5-10 minutes Terminer le flux rapidement
Sites DMV 15 minutes Actualiser le cookie de session à mi-chemin
Dossiers judiciaires 20-30 minutes Recherches par lots dans des groupes
Portails fiscaux 10-15 minutes Utiliser un proxy collant, même IP
Autoriser les applications 30 minutes Enregistrez la progression à chaque étape

Dépannage

Problème Parce que Corriger
L'image CAPTCHA ne se charge pas Le cookie de session a expiré Commencer une nouvelle session
"Session expirée" pendant le formulaire Cela a pris trop de temps à résoudre Pré-résoudre ou utiliser une résolution plus rapide
Mauvaise réponse CAPTCHA Image déformée Signaler une mauvaise image via l'API
Automatisation des blocs de portail Détection IP/UA Utiliser un proxy résidentiel + un UA réel
Erreur de validation du formulaire après CAPTCHA Le jeton côté serveur a expiré Résolvez CAPTCHA immédiatement avant de soumettre

FAQ

L’automatisation des portails gouvernementaux est-elle légale ?

L'automatisation de vos propres formulaires et recherches de données est généralement autorisée. Les tests d’assurance qualité pour les applications de technologie civique sont une utilisation légitime courante. Vérifiez toujours les conditions de service du portail spécifique.

Quel type de CAPTCHA est le plus courant sur les sites gouvernementaux ?

Image CAPTCHA et reCAPTCHA v2. Les sites gouvernementaux sont souvent à la traîne en matière de technologie CAPTCHA, ce qui les rend plus simples à résoudre.

CaptchaAI peut-il résoudre les BLS CAPTCHA ?

Oui : CaptchaAI prend en charge les BLS CAPTCHA avec un taux de précision de 100 % en utilisant le paramètre method=bls pour la résolution directe, ou method=base64 pour la résolution basée sur l'image.

Comment gérer les formulaires gouvernementaux en plusieurs étapes ?

Utilisez des sessions proxy persistantes pour conserver la même adresse IP tout au long du formulaire. Les portails gouvernementaux valident souvent la cohérence IP entre les pages de formulaire.


Guides connexes



É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.