Kasus Penggunaan

Otomatisasi Portal Pemerintah dengan CAPTCHA Solving

Situs web pemerintah menggunakan CAPTCHA untuk melindungi form, sistem booking janji temu, dan portal catatan publik. Tim QA, developer civic tech, dan profesional hukum memerlukan akses otomatis untuk menguji dan mengoperasikan alur kerja ini secara efisien.


CAPTCHA Pemerintah berdasarkan Kategori

Kategori Portal CAPTCHA Umum Contoh Situs Kasus Penggunaan
Visa/imigrasi BLS, reCAPTCHA v2 Portal BLS, USCIS Booking janji temu
DMV / kendaraan bermotor reCAPTCHA v2, image Situs DMV negara bagian Perpanjangan registrasi
Catatan pengadilan reCAPTCHA v2 PACER, pengadilan negara bagian Pencarian kasus
Izin/lisensi Image CAPTCHA Portal izin kota Submit aplikasi
Portal pajak reCAPTCHA v2 IRS, situs pajak negara bagian Cek status filing
Catatan publik Image CAPTCHA, reCAPTCHA Catatan county Pencarian properti/deed

Otomatisasi Pengangkatan Visa BLS

Portal BLS menggunakan sistem CAPTCHA mereka sendiri. CaptchaAI mendukung BLS CAPTCHA dengan akurasi 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"),
        }

Pencarian Catatan Pengadilan

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

Gambar CAPTCHA di Portal Izin

Banyak portal kota dan kabupaten menggunakan CAPTCHA gambar sederhana:

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

Pencarian Kumpulan Catatan Publik

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

Tip Manajemen Sesi

Portal pemerintah sering memiliki session timeout yang singkat:

Tipe Portal Timeout Sesi Rekomendasi
Portal visa 5–10 menit Selesaikan alur dengan cepat
Situs DMV 15 menit Refresh cookie sesi di tengah jalan
Catatan pengadilan 20–30 menit Batch pencarian dalam kelompok kecil
Portal pajak 10–15 menit Gunakan egress jaringan persisten yang diotorisasi, IP yang sama
Aplikasi izin 30 menit Simpan progress di setiap langkah

Pemecahan Masalah

Masalah Penyebab Solusi
Image CAPTCHA tidak dimuat Cookie sesi sudah expired Mulai sesi baru
"Session expired" di form Terlalu lama untuk solve validasi awal di staging atau gunakan solve yang lebih cepat
Jawaban CAPTCHA salah Gambar terdistorsi Laporkan gambar buruk via API
Portal memblokir otomasi Deteksi IP/UA Gunakan egress jaringan yang diotorisasi + UA asli
Error validasi form setelah CAPTCHA Token server-side sudah expired Solve CAPTCHA tepat sebelum submit

Pertanyaan Umum

Mengotomatiskan form dan pencarian data Anda sendiri umumnya diizinkan. Pengujian QA untuk aplikasi civic tech adalah penggunaan sah yang umum. Selalu periksa syarat layanan portal yang bersangkutan.

Tipe CAPTCHA apa yang paling umum di situs pemerintah?

Image CAPTCHA dan reCAPTCHA v2. Situs pemerintah sering tertinggal dalam teknologi CAPTCHA, sehingga lebih mudah di-solve.

Bisakah CaptchaAI solve BLS CAPTCHA?

Ya — CaptchaAI mendukung BLS CAPTCHA dengan akurasi 100% menggunakan parameter method=bls untuk solve langsung, atau method=base64 untuk solve berbasis gambar.

Bagaimana cara menangani form pemerintah multi-step?

Gunakan egress jaringan persisten yang diotorisasi session untuk mempertahankan IP yang sama di seluruh form. Portal pemerintah sering memvalidasi konsistensi IP antar halaman form.


Panduan Terkait

  • Persistensi Sesi Browser dalam Alur Kerja CAPTCHA
  • CaptchaAI Quickstart
  • Cara Solve reCAPTCHA v2 via API
  • Cara Solve Cloudflare Turnstile via API
  • Cara Solve GeeTest v3 via API
Komentar dinonaktifkan untuk artikel ini.