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

Автоматизация правительственного портала с помощью решения CAPTCHA

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


Государственные CAPTCHA по категориям

Категория портала Общая капча Примеры сайтов Вариант использования
Виза/иммиграция БЛС, reCAPTCHA v2 Порталы BLS, USCIS Бронирование встреч
ДМВ / автотранспортные средства reCAPTCHA v2, изображение Государственные сайты DMV Продление регистрации
Судебные протоколы reCAPTCHA v2 PACER, суды штатов Поиск дел
Разрешения/лицензии Капча изображения Порталы городских разрешений Подача заявки
Налоговые порталы reCAPTCHA v2 IRS, государственные налоговые сайты Проверка статуса подачи
Публичные записи Изображение CAPTCHA, reCAPTCHA Записи округа Поиск Property/deed

Автоматизация записи на визу BLS

Порталы BLS используют собственную систему CAPTCHA. CaptchaAI поддерживает BLS CAPTCHA со 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"),
        }

Поиск судебных протоколов

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

Изображение CAPTCHA на порталах разрешений

Многие городские и окружные порталы используют простые графические CAPTCHA:

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

Пакетный поиск в публичных записях

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

Советы по управлению сеансами

Правительственные порталы часто имеют короткие таймауты сеансов:

Тип портала Тайм-аут сеанса Рекомендация
Визовые порталы 5-10 мин. Завершите поток быстро
Сайты DMV 15 мин. Обновить файл cookie сеанса на полпути
Судебные протоколы 20-30 мин. Пакетный поиск в группах
Налоговые порталы 10-15 мин. Использовать авторизованный сетевой выход с тем же IP
Разрешить приложения 30 мин. Сохраняйте прогресс на каждом этапе

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

Проблема Причина Исправить
Изображение CAPTCHA не загружается Срок действия файла cookie сеанса истек Начать новую сессию
«Сессия истекла» во время формы Решение заняло слишком много времени предварительная QA-проверка или использование более быстрого решения
Неправильный ответ на CAPTCHA Искаженное изображение Сообщить о плохом изображении через API
Автоматизация блоков портала Обнаружение IP/UA Используйте авторизованный сетевой выход + настоящий UA
Ошибка проверки формы после CAPTCHA Срок действия токена на стороне сервера истек Решите CAPTCHA непосредственно перед отправкой

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

Законна ли автоматизация государственных порталов?

Автоматизация собственных форм и поиска данных обычно разрешена. Тестирование качества приложений гражданских технологий является распространенным законным применением. Всегда проверяйте условия обслуживания конкретного портала.

Какой тип CAPTCHA наиболее распространен на правительственных сайтах?

Изображение CAPTCHA и reCAPTCHA v2. Правительственные сайты часто отстают в технологии CAPTCHA, что упрощает их решение.

Может ли CaptchaAI решить задачу BLS CAPTCHA?

Да — CaptchaAI поддерживает BLS CAPTCHA со 100% точностью, используя параметр method=bls для прямого решения или method=base64 для решения на основе изображений.

Как мне работать с многоэтапными формами правительства?

Используйте авторизованный сетевой выход-сессии, чтобы поддерживать один и тот же IP-адрес во всей форме. Правительственные порталы часто проверяют согласованность IP-адресов между страницами форм.


Связанные руководства



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

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