Use Cases

Kamu Kayıtlarında Arama Otomasyonu için CAPTCHA Kullanımı

Kamu kayıt portallarında toplu sorgu yapan bir otomasyonu ölçeklemenin önündeki tek gerçek engel çoğu zaman formdaki görüntü CAPTCHA'sıdır. Mahkeme sistemleri, tapu ve ilçe kayıtları, ticaret sicili ve nüfus veritabanları büyük ölçüde eski görüntü ve OCR CAPTCHA'larına dayanır; bunları çözmenin yolu, resmi CaptchaAI'nin OCR uç noktasına base64 olarak gönderip dönen metni arama formuna yerleştirmektir. Aşağıda her kayıt türü için çalışan kod ve devreye alırken işinize yarayacak pratik ayarlar var.

Somut bir senaryo düşünün: bir müşteri için durum tespiti (due diligence) yapan bir otomasyon geliştiricisisiniz ve onlarca ayrı ticaret sicili ile mahkeme portalından şirket dosyalarını derliyorsunuz. Her portal farklı bir CAPTCHA türü çıkarır; elle çözmek dakikaları yer, otomasyonu kırar. Burada anahtar nokta, tek bir çözüm çağrısını farklı portal düzenlerine yeniden kullanabilir hâle getirmektir. Kişisel veri içeren kayıtları işlerken KVKK kapsamında yalnızca yetkili olduğunuz veri toplama akışları içinde kaldığınızdan emin olun — CAPTCHA çözümü, izinli bir iş akışını hızlandıran bir araçtır.

Portal türüne göre karşılaşacağınız CAPTCHA türleri

Kayıt türü değiştikçe portalın kullandığı CAPTCHA da değişir. İlk adım, hangi türle uğraştığınızı tanımaktır:

Portal kategorisi Tipik CAPTCHA Zorluk örnekleri
Mahkeme davası arama Özel metin CAPTCHA Bozuk 5-6 karakter alfanümerik
İlçe mülk kayıtları Matematik CAPTCHA'sı "4+7 nedir?"
İşletme varlığı araması Resim metni CAPTCHA Satır gürültüsüyle çarpık harfler
Hayati kayıtlar reCAPTCHA v2 Görüntü ızgarası seçimi
İnşaat izinleri Basit metin CAPTCHA 4 haneli sayısal kod
UCC başvuruları Özel OCR CAPTCHA Arka planda gürültü olan karışık büyük harfler

Çoğu kamu portalı bir görüntü ya da OCR CAPTCHA'sı çıkardığından, tek bir OCR çözüm akışı vakaların büyük bölümünü kapsar; reCAPTCHA v2 çıkaran portallar için ayrı bir akış gerekir. Bu yazıdaki örnekler görüntü/OCR tarafına odaklanır.

Görüntü CAPTCHA çözümüyle kayıt sorgulama

Temel desen şudur: arama sayfasını yükleyin, sayfadaki CAPTCHA görselini bulun, base64 olarak in.php uç noktasına gönderin, sonucu res.php üzerinden sorgulayın ve dönen metni arama isteğine ekleyin. Aşağıdaki sınıf tam olarak bunu yapar ve oturum çerezlerini koruyarak mahkeme kayıtlarını sorgular:

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

Dikkat edilmesi gereken iki nokta: CAPTCHA görselini indirmeden önce arama sayfasını yükleyin (görsel çoğu zaman oturum çerezine bağlıdır) ve tüm istekleri aynı Session üzerinden yapın; aksi hâlde çözüm doğru olsa bile sunucu isteği reddeder.

Matematik CAPTCHA'larını çözme

Bazı devlet portalları "4 + 7 = ?" gibi basit matematik CAPTCHA'ları çıkarır. CaptchaAI bunları da metin tanıma olarak ele alır; farkı, çözücüye ne yapması gerektiğini söyleyen textinstructions parametresidir:

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

textinstructions alanına yazdığınız yönerge ne kadar netse (örneğin "yalnızca sonucun sayısını döndür"), dönen yanıt o kadar temiz olur — bu, çıktıyı doğrudan forma yazacağınız için önemlidir.

Birden fazla portalda paralel arama

Durum tespiti veya toplu araştırma işlerinde tek bir sorguyu birçok portalda çalıştırmanız gerekir. Aşağıdaki JavaScript toplayıcısı, her portalı sırayla gezer, CAPTCHA varsa çözer ve sonuçları tek bir listede birleştirir; bir portalın hata vermesi diğerlerini durdurmaz:

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' }
]);

Aynı anda kaç portalı sorgulayabileceğiniz thread sayınıza bağlıdır. CaptchaAI thread bazında ücretlendirir: her thread eş zamanlı bir çözüm demektir ve çözüm başına ek ücret yoktur. Düzenli portal taramaları için BASIC ($15/ay, 5 thread) çoğu zaman yeterlidir; USD üzerinden sabit aylık ücret, TL dalgalanmasına karşı öngörülebilir bir maliyet sağlar. Hacim arttıkça STANDARD ($30/ay, 15 thread) veya ADVANCE ($90/ay, 50 thread) planlarına geçebilirsiniz.

Devlet portalları için CAPTCHA parametreleri

CaptchaAI'ye gönderdiğiniz parametreler doğruluğu belirgin biçimde etkiler. Portalın CAPTCHA biçimini önceden biliyorsanız, çözücüye ipucu verin:

Parametre Değer Ne zaman kullanılmalı
method base64 Resim bayt olarak indirildi
method post Resim dosyasını doğrudan gönderin
language 0 Latin karakterli metin CAPTCHA'lar
numeric 1 Yalnızca rakamlardan oluşan CAPTCHA'lar
min_len / max_len Değişir Karakter sayısı tahmin edilebilir olduğunda
textinstructions Özel istem Matematik CAPTCHA'ları veya belirli formatlar

Örneğin bir inşaat izni portalı yalnızca 4 haneli sayısal kod kullanıyorsa, numeric=1 ile min_len=4 ve max_len=4 göndermek yanlış tanımaları azaltır.

Sık karşılaşılan sorunlar ve çözümleri

Sorun Sebep Düzeltme
CAPTCHA görüntüsü 403 değerini döndürür Oturum çerezi eksik Önce arama sayfasını yükleyin, ardından görseli getirin
Yanlış CAPTCHA yanıtı Düşük görüntü kalitesi Görüntüyü ön işleyin (kontrastı artırın, gürültüyü kaldırın)
CAPTCHA gönderildiğinde yenileniyor Form token'ının süresi doldu CAPTCHA ile birlikte gizli form alanlarını da çıkarın
CAPTCHA'dan sonra arama boş dönüyor POST yönlendirmesi çerezleri kaybetti allow_redirects=True kullanın ve oturuma devam edin

Bu dört durum, kamu portallarında en çok karşılaşacağınız hatalardır; çoğu, oturum yönetimini doğru kurmakla çözülür.

Sık sorulan sorular

Kamu kayıtlarını otomatik toplamak KVKK açısından uygun mu?

CAPTCHA çözümü teknik bir adımdır; asıl belirleyici, topladığınız verinin niteliğidir. Kişisel veri içeren kayıtları işliyorsanız bu veriler KVKK kapsamına girer. Yalnızca yetkili olduğunuz, meşru amaca dayanan ve saklama süresi tanımlı veri toplama akışları içinde kalın; portalın kullanım şartlarını da gözden geçirin.

Hangi CaptchaAI planı portal otomasyonu için yeterli?

Kaç portalı eş zamanlı sorguladığınıza bağlıdır. Sıralı, tek seferlik aramalar için BASIC ($15/ay, 5 thread) genelde yeterlidir; onlarca portalı paralel tarayan toplu işler için STANDARD ($30/ay, 15 thread) ya da ADVANCE ($90/ay, 50 thread) daha rahat çalışır. Tüm planlarda çözüm başına ek ücret yoktur.

CAPTCHA görsellerini göndermeden önce ön işlemeli miyim?

Çok düşük kaliteli görüntülerde ön işleme (gri tonlama, kontrast artırma, gürültü giderme) doğruluğu belirgin biçimde yükseltebilir. Temiz görsellerde ise gerekmez. Teknikler için görüntü ön işleme rehberine bakın.

Portal reCAPTCHA v2 ya da Turnstile'a geçerse ne yapmalıyım?

Bu durumda görüntü/OCR akışı yeterli olmaz; ilgili çözüm yöntemine geçmeniz gerekir. CaptchaAI reCAPTCHA v2/v3'ü, Cloudflare Turnstile'ı ve GeeTest v3'ü destekler; sayfa alt kısmındaki bağlantılardan her biri için ayrı rehbere ulaşabilirsiniz.

Sonraki adımlar

Kamu kayıtlarındaki aramaları CaptchaAI ile tekrarlanabilir bir iş akışına dönüştürün: ücretsiz API anahtarınızı alın ve devlet portalı CAPTCHA'larını tek bir akıştan yönetin.


İlgili rehberler

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