Use Cases

CAPTCHA Çözme ile Devlet Portalı Otomasyonu

Devlet portallarını otomatikleştirirken önünüze çıkan tek gerçek engel çoğu zaman CAPTCHA'dır. Vize randevu sistemleri, mahkeme kayıtları, DMV yenilemeleri ve izin başvuruları birbirinden farklı CAPTCHA aileleri kullanır — ama hepsini tek bir API ile çözebilirsiniz. Bu rehber, bir QA mühendisi olarak yetkili iş akışlarınızda BLS, reCAPTCHA v2 ve resim CAPTCHA'larını CaptchaAI ile nasıl ele alacağınızı, her senaryo için çalışan Python koduyla gösterir.

Türkiye'den bir not: Kişisel veri içeren kayıtları topluyorsanız bu veriler KVKK kapsamına girer. Otomasyonu yalnızca erişim yetkiniz olan portallarda ve yetkili QA/veri toplama akışlarında çalıştırın; randevu kapma ya da slot avı için değil.


Devlet sitelerindeki CAPTCHA türleri (kategori kategori)

Hangi portalın hangi CAPTCHA'yı kullandığını bilmek, doğru method parametresini seçmenizi sağlar. Devlet siteleri genelde CAPTCHA teknolojisinde bir adım geriden gelir, bu yüzden karşınıza çıkanların büyük çoğunluğu reCAPTCHA v2 ve klasik resim CAPTCHA'sıdır:

Portal Kategorisi Ortak CAPTCHA Örnek Siteler Kullanım Örneği
Vize / göçmenlik BLS, reCAPTCHA v2 BLS portalları, USCIS Randevu rezervasyonu
DMV / motorlu taşıtlar reCAPTCHA v2, resim Eyalet DMV siteleri Kayıt yenileme
Mahkeme kayıtları reCAPTCHA v2 PACER, eyalet mahkemeleri Vaka arama
İzinler / lisanslar Resim CAPTCHA'sı Şehir izin portalları Başvuru dosyalama
Vergi portalları reCAPTCHA v2 IRS, eyalet vergi siteleri Dosyalama durumu kontrolleri
Kamu kayıtları Resim CAPTCHA, reCAPTCHA İlçe kayıtları Tapu/kayıt araması

Oturum yönetimi ve zaman aşımı

Devlet portallarında en sinsi sorun genelde CAPTCHA değil, kısa oturum zaman aşımlarıdır: siz CAPTCHA'yı çözerken oturumunuzun süresi dolabilir. Koda başlamadan önce şu üç kuralı benimseyin, sonra portal türüne göre zaman aşımı sürelerine göz atın:

  • CAPTCHA'yı forma göndermeden hemen önce çözün, önceden değil.
  • Tüm form akışı boyunca aynı oturumu ve aynı IP'yi koruyun.
  • Uzun akışlarda oturum çerezini yarıda bir kez yenileyin.
Portal Türü Oturum Zaman Aşımı Tavsiye
Vize portalları 5-10 dakika Akışı hızla tamamlayın
DMV siteleri 15 dakika Oturum çerezini yarıda yenileyin
Mahkeme kayıtları 20-30 dakika Aramaları gruplar hâlinde yapın
Vergi portalları 10-15 dakika Kalıcı QA oturumu, aynı IP
İzin başvuruları 30 dakika Her adımda ilerlemeyi kaydedin

BLS vize portalı CAPTCHA'sını çözme

BLS portalları kendilerine özgü bir CAPTCHA sistemi kullanır ve Türkiye'de Schengen randevu akışlarıyla uğraşan geliştiriciler için tanıdık bir başlıktır. CaptchaAI, BLS CAPTCHA'larını bls yöntemiyle veya görüntü tabanlı çözüm için method=base64 ile yüksek başarı oranıyla destekler.

Akışın üç adımı

Aşağıdaki BLSAppointmentBooker sınıfı, yetkili bir test hesabında şu adımları izler:

  • Portala giriş yapar ve giriş formundaki CAPTCHA'yı çözer.
  • Uygun randevu slotlarını sorgular.
  • Slot seçimini, gerekirse yeni bir CAPTCHA çözerek gönderir.
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"),
        }

Mahkeme kayıtlarında reCAPTCHA v2 çözme

Mahkeme ve dava arama portalları neredeyse her zaman reCAPTCHA v2 kullanır. Akış üç adımdır: arama sayfasını yükleyin, sitekey ve pageurl ile token'ı alın, ardından token'ı g-recaptcha-response alanında forma gönderin:

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

Sonuçları ayrıştırma

_parse_results yardımcı metodu dönen HTML'i ayrıştırır ve her satırdan dava numarası, taraflar, tarih ve durum alanlarını çıkarır. Portalın tablo yapısı değişirse yalnızca bu metodu güncellemeniz yeterlidir; token alma mantığına dokunmanız gerekmez.


İzin portallarındaki resim CAPTCHA'sını çözme

Birçok belediye ve ilçe izin portalı, reCAPTCHA yerine basit resim (OCR) CAPTCHA'ları kullanmaya devam eder. Bunları görüntüyü base64'e çevirip in.php uç noktasına göndererek çözersiniz; kod hemen hemen BLS örneğiyle aynıdır, yalnızca daha kısa bir zaman aşımı yeterlidir:

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

Kamu kayıtlarında toplu CAPTCHA çözme

Tapu ve mülk kayıtlarında yüzlerce adres sorgularken her istek için ayrı CAPTCHA çözmek gereksizdir. Aşağıdaki toplu işlem üç işi birden yapar:

  • Token'ı her beşinci istekte bir yeniler, gereksiz çözüm maliyetini düşürür.
  • Sonuçları doğrudan bir CSV dosyasına yazar.
  • İstekler arasına gecikme koyarak portalın hız sınırına takılmayı önler.
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

Küçük bir uyarı: gerçek bir üretim akışında try/except bloğunu genişletin ve başarısız adresleri ayrı bir kuyruğa alarak yeniden deneyin — tek bir hatalı yanıt tüm toplu işlemi durdurmasın.


Sorun giderme

Otomasyon akışları en çok aşağıdaki beş noktada takılır. Belirti, olası sebep ve hızlı çözümü:

Sorun Sebep Düzeltme
CAPTCHA resmi yüklenmiyor Oturum çerezinin süresi doldu Yeni oturum başlat
Form sırasında "Oturumun süresi doldu" Çözülmesi çok uzun sürdü Ön QA testi yapın veya daha hızlı çözüm kullanın
Yanlış CAPTCHA yanıtı Bozuk görüntü Kötü görüntüyü API aracılığıyla bildirin
Portal otomasyonu engelliyor IP/UA tespiti Kendi sunucu altyapınızı ve gerçek bir User-Agent kullanın
CAPTCHA'dan sonra form doğrulama hatası Sunucu tarafı belirtecinin süresi doldu CAPTCHA'yı göndermeden hemen önce çözün

Yayına almadan önce kontrol listesi

  • Doğru method parametresini seçtiniz mi? reCAPTCHA v2 için userrecaptcha, resim CAPTCHA için base64, BLS için bls.
  • Token'ı formu göndermeden hemen önce mi çözüyorsunuz?
  • Çok adımlı akış boyunca aynı oturum ve aynı IP korunuyor mu?
  • Yalnızca erişim yetkiniz olan portallarda mı çalışıyorsunuz (KVKK)?
  • Hata durumları için yeniden deneme ve zaman aşımı mantığınız hazır mı?

SSS

Devlet portalı otomasyonuyla ilgili en sık gelen sorular ve kısa yanıtları:

Devlet portalı otomasyonu için hangi CaptchaAI planı yeterli?

Tek bir portal akışını test ediyorsanız BASIC ($15/ay, 5 thread) genelde yeterlidir. Toplu sorgulama gibi paralel iş yükleri için STANDARD ($30/ay, 15 thread) daha rahat çalışır. Fiyatlar thread başınadır; her planda çözüm sayısı sınırsızdır.

CaptchaAI BLS CAPTCHA'larını çözebilir mi?

Evet. CaptchaAI, BLS CAPTCHA'larını bls yöntemiyle veya görüntü tabanlı çözüm için method=base64 ile yüksek başarı oranıyla destekler. Yalnızca erişim yetkiniz olan portallarda ve yetkili test akışlarında kullanın.

CAPTCHA'yı çözerken oturumun süresi dolarsa ne yapmalıyım?

CAPTCHA'yı forma göndermeden hemen önce çözün — sunucu tarafındaki token'ın da bir ömrü vardır. Vize portalları gibi kısa zaman aşımı olan sitelerde akışı hızlandırın; gerekiyorsa oturum çerezini yarıda yenileyin ve tüm form boyunca aynı IP'yi koruyun.

Devlet sitesinde hCaptcha çıkarsa CaptchaAI çözer mi?

Hayır. CaptchaAI şu anda hCaptcha ve FunCaptcha (Arkose Labs) çözmez. Devlet portallarında bu türler nadirdir; karşılaştığınızın büyük olasılıkla reCAPTCHA v2 veya resim CAPTCHA olduğunu unutmayın.


İlgili Kılavuzlar



Sonraki adımlar

Bu makale için yorumlar devre dışı bırakılmıştır.