Use Cases

CAPTCHA İşleme ile Sigorta Teklifi Karşılaştırma Otomasyonu

Tek bir sigorta teklifi karşılaştırması genellikle beş ila on farklı taşıyıcının formuna dokunur; her form çok adımlıdır ve neredeyse hepsi son adımda bir CAPTCHA çıkarır. Bu zincirde tek bir çözüm bile başarısız olursa karşılaştırma yarım kalır ve tablo eksik fiyatla döner. Bu rehber, CaptchaAI ile o kırılgan zinciri tekrarlanabilir bir QA iş akışına çevirmenin yolunu gösterir: reCAPTCHA v2/v3 ve image CAPTCHA'larını API üzerinden çözer, kalıcı oturumu korur ve sonuçları tek bir karşılaştırma çıktısında toplar.

Anlatım, kendi karşılaştırma toplayıcısını ya da anlaşmalı taşıyıcı entegrasyonlarını test eden QA ekipleri içindir. reCAPTCHA'nın altı çeşidinin tamamı, image/OCR CAPTCHA'ları ve GeeTest v3 CaptchaAI'nin desteklediği türler arasında yer alır; buna karşılık hCaptcha ve FunCaptcha desteklenmez, dolayısıyla bir teklif sayfasında bu türlerden biriyle karşılaşırsanız akışı CaptchaAI ile otomatikleştiremezsiniz.


Sigorta teklif formlarında karşınıza çıkan CAPTCHA türleri

Sigorta siteleri ücret motorlarını otomatik teklif toplamaya karşı korur ve koruma çoğunlukla formun son adımında, fiyat hesaplanmadan hemen önce devreye girer. Aşağıdaki tablo, taşıyıcı türüne göre en sık rastlanan doğrulama biçimini ve akışın nerede karmaşıklaştığını özetler.

Taşıyıcı Türü CAPTCHA Tetik Noktası Teklif Karmaşıklığı
Araba sigortası reCAPTCHA v2 Teklif formu gönderimi Çok adımlı (araç + sürücü)
Sağlık sigortası reCAPTCHA v2 Plan karşılaştırması Çok adımlı (demografik)
Ev sigortası Image CAPTCHA (OCR) Adres arama Orta
Hayat sigortası reCAPTCHA v2 Oran hesaplayıcı Basit form
Seyahat sigortası görünmez reCAPTCHA Teklif talebi Basit form
İşletme sigortası reCAPTCHA v3 İletişim/teklif formu Uzun form

reCAPTCHA v3'ün skor tabanlı olması, teklif akışında ayrı bir onay kutusu görmeseniz bile arka planda bir doğrulama çalıştığı anlamına gelir; token yine aynı yöntemle alınır, tek fark tetiğin görünmez olmasıdır.


Çok taşıyıcılı sigorta teklifi toplayıcısı

Toplayıcının işi sade: her taşıyıcı için aynı araç ve sürücü verisini gönderir, teklif sayfasındaki CAPTCHA'yı çözer, dönen fiyatı ayrıştırır ve en düşük aylık primi bulur. Aşağıdaki sınıf, tek bir taşıyıcıdan otomobil teklifi alan get_auto_quote metodu ile birden çok taşıyıcıyı sırayla dolaşan compare_carriers metodunu bir araya getirir.

import requests
import time
import re
import base64

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


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


def solve_image_captcha(image_bytes):
    img_b64 = base64.b64encode(image_bytes).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("Timeout")


class InsuranceQuoteCollector:
    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 get_auto_quote(self, carrier_url, vehicle_data, driver_data, sitekey):
        """Get auto insurance quote from a single carrier."""
        # Step 1: Load quote page
        self.session.get(carrier_url)

        # Step 2: Submit vehicle info
        resp = self.session.post(f"{carrier_url}/vehicle", data=vehicle_data)

        # Step 3: Submit driver info
        resp = self.session.post(f"{carrier_url}/driver", data=driver_data)

        # Step 4: Solve CAPTCHA on quote page
        token = solve_recaptcha(sitekey, f"{carrier_url}/quote")

        # Step 5: Get quote
        resp = self.session.post(f"{carrier_url}/quote", data={
            "g-recaptcha-response": token,
        })

        if resp.status_code == 200:
            return self._parse_quote(resp.text)
        return None

    def compare_carriers(self, carriers, vehicle_data, driver_data):
        """Compare quotes across multiple carriers."""
        quotes = []

        for carrier in carriers:
            try:
                quote = self.get_auto_quote(
                    carrier_url=carrier["url"],
                    vehicle_data=vehicle_data,
                    driver_data=driver_data,
                    sitekey=carrier["sitekey"],
                )
                quotes.append({
                    "carrier": carrier["name"],
                    "status": "success",
                    "quote": quote,
                })
            except Exception as e:
                quotes.append({
                    "carrier": carrier["name"],
                    "status": "failed",
                    "error": str(e),
                })
            time.sleep(5)  # Delay between carriers

        # Sort by price
        successful = [q for q in quotes if q["status"] == "success" and q["quote"]]
        successful.sort(key=lambda x: x["quote"].get("monthly_premium", float("inf")))

        return {
            "quotes": quotes,
            "best_rate": successful[0] if successful else None,
            "total_compared": len(carriers),
            "successful": len(successful),
        }

    def _parse_quote(self, html):
        from bs4 import BeautifulSoup
        soup = BeautifulSoup(html, "html.parser")

        premium_el = soup.select_one(".premium, .monthly-rate, .quote-amount")
        coverage_el = soup.select_one(".coverage-summary, .plan-details")

        return {
            "monthly_premium": premium_el.get_text(strip=True) if premium_el else "",
            "coverage": coverage_el.get_text(strip=True) if coverage_el else "",
        }


# Usage
collector = InsuranceQuoteCollector(
    proxy="http://user-session-abc:pass@residential.proxy.com:5000"
)

vehicle = {
    "year": "2022",
    "make": "Toyota",
    "model": "Camry",
    "vin": "",
    "mileage": "15000",
}

driver = {
    "age": "35",
    "gender": "M",
    "zip": "90210",
    "driving_record": "clean",
}

carriers = [
    {"name": "Carrier A", "url": "https://carrier-a.example.com/auto", "sitekey": "6Lc_xxx1"},
    {"name": "Carrier B", "url": "https://carrier-b.example.com/auto", "sitekey": "6Lc_xxx2"},
    {"name": "Carrier C", "url": "https://carrier-c.example.com/auto", "sitekey": "6Lc_xxx3"},
]

comparison = collector.compare_carriers(carriers, vehicle, driver)
print(f"Best rate: {comparison['best_rate']}")

İki yardımcı fonksiyon işin çekirdeğini oluşturur: solve_recaptcha görev kimliğini alıp token hazır olana kadar sonucu sorgular (en fazla 60 kez, 5 saniye arayla); solve_image_captcha ise base64 kodlanmış görseli gönderip aynı biçimde sonucu bekler. Taşıyıcılar arasındaki time.sleep(5) beklemesi süs değildir — istek sınırlarını erkenden tetiklememek için bilinçli konur.


Sağlık sigortası pazaryerlerinde plan karşılaştırma

Sağlık planları biraz farklı akar: önce demografik bilgi gönderilir, ardından plan sonuçlarını görebilmek için tek bir CAPTCHA çözülür. compare_health_plans fonksiyonu aynı toplayıcı altyapısını yeniden kullanır; değişen yalnızca gönderilen alanlar ve ayrıştırılan kartlardır.

def compare_health_plans(marketplace_url, demographics, sitekey):
    """Compare health insurance plans on marketplace sites."""
    collector = InsuranceQuoteCollector(
        proxy="http://user-session-xyz:pass@residential.proxy.com:5000"
    )

    # Load marketplace
    collector.session.get(marketplace_url)

    # Submit demographics
    collector.session.post(f"{marketplace_url}/demographics", data=demographics)

    # Solve CAPTCHA for plan results
    token = solve_recaptcha(sitekey, f"{marketplace_url}/plans")

    resp = collector.session.post(f"{marketplace_url}/plans", data={
        "g-recaptcha-response": token,
    })

    if resp.status_code == 200:
        from bs4 import BeautifulSoup
        soup = BeautifulSoup(resp.text, "html.parser")
        plans = []
        for card in soup.select(".plan-card, .insurance-plan"):
            plans.append({
                "name": card.select_one(".plan-name").get_text(strip=True) if card.select_one(".plan-name") else "",
                "premium": card.select_one(".premium").get_text(strip=True) if card.select_one(".premium") else "",
                "deductible": card.select_one(".deductible").get_text(strip=True) if card.select_one(".deductible") else "",
            })
        return plans

    return []

Dönen her plan kartından ad, prim ve muafiyet (deductible) alınır. Aynı desen ev ve hayat sigortası akışları için de geçerlidir; değişen tek şey form alanları ile CSS seçicileridir. Yani bir kez sağlam kurduğunuz toplayıcıyı, sektör başına yalnızca alanları uyarlayarak yeniden kullanabilirsiniz.


Neden kalıcı oturum şart?

Sigorta teklifi verme her zaman çok adımlıdır ve sunucu her adımı aynı oturuma ve aynı IP'ye bağlar. Tipik bir akış şu sırayla ilerler ve her adım aynı IP'yi korumak zorundadır:

  1. Kişisel bilgiler — ad, doğum tarihi ve posta kodu gönderilir.
  2. Araç ya da mülk bilgisi — yıl, marka, model gibi alanlar eklenir.
  3. Kapsam seçimi — limitler ve muafiyet belirlenir.
  4. CAPTCHA çözümü — token alınır ve forma enjekte edilir.
  5. Teklif ekranı — hesaplanan fiyat geri döner.

Arada IP değişirse sunucu oturumu geçersiz sayar ve akış baştan başlar. Bu yüzden sigorta akışlarında 10–15 dakikalık TTL ile kalıcı bir QA oturumu kullanın; tüm adımlar tek bir IP üzerinden ilerlemelidir.

Kalıcılık burada CAPTCHA'nın kendisi kadar kritiktir: token doğru olsa bile IP değişmişse sunucu teklifi reddeder.

Oturum stratejisi seçenekleri için sabit ve dönüşümlü oturumlar rehberine, tarayıcı tarafındaki kalıcılık için tarayıcı oturumu kalıcılığı yazısına ve kimlik doğrulama ayrıntıları için proxy kimlik doğrulama yöntemlerine göz atın.


Yaygın sorunlar ve çözümleri

Teklif akışlarında en sık takılınan noktalar ve pratik çözümleri:

  • Teklif formu akışın ortasında sıfırlanıyor. Genellikle adımlar arasında IP değişmiştir; kalıcı bir QA oturumu kullanın.
  • "Teklif sağlanamıyor" mesajı. Veri doğrulaması başarısız olmuştur; zorunlu alanların dolu ve biçimli olduğunu kontrol edin.
  • CAPTCHA iki kez görünüyor. İlk token'ın süresi dolmuştur; çözümü hemen yeniden alın ve gecikmeden gönderin.
  • Manuel akıştan farklı oranlar. Çerez ya da oturum farkları vardır; temiz bir oturumla baştan başlayın.
  • İstek sınırlayıcı istekleri engelliyor. Aynı IP'den çok fazla teklif gelmiştir; yavaşlayın ve istekleri taşıyıcılar arasında farklı QA oturumlarına yayın.

Türkiye pazarında sigorta teklifi otomasyonu

Türkiye'de sigorta karşılaştırma siteleri ve acente panelleri hızla dijitalleşiyor; bir QA ekibi kendi karşılaştırma toplayıcısını ya da anlaşmalı taşıyıcı entegrasyonlarını düzenli olarak sınamak zorunda. Burada iki nokta öne çıkar.

Birincisi KVKK. Sigorta teklif akışları ad, doğum tarihi ve adres gibi kişisel veriler içerir; bu verileri yalnızca yetkili olduğunuz, size ya da müşterinize ait teklif akışlarında ve KVKK'ya uygun bir QA sürecinde işleyin. Otomasyonu üçüncü tarafların verisini izinsiz toplamak için değil, kendi akışlarınızın doğruluğunu test etmek için kurun.

İkincisi maliyet öngörülebilirliği. CaptchaAI thread tabanlı ve aylık sabit USD fiyatlarla faturalandırır; çözüm başına ücret yoktur ve her thread ay boyunca sınırsız çözüm yapar. TL'nin oynaklığı düşünüldüğünde BASIC ($15/ay, 5 thread) gibi bir planın aylık maliyeti baştan bellidir. Teklif hacminiz büyüdükçe daha yüksek thread'li planlara — örneğin STANDARD ($30/ay, 15 thread) — geçerek eşzamanlı çözüm kapasitenizi artırabilirsiniz.


Sık sorulan sorular

Sigorta teklif formlarında hangi CAPTCHA türleri çıkar ve CaptchaAI hepsini çözer mi?

En sık reCAPTCHA v2, görünmez reCAPTCHA, reCAPTCHA v3 ve image/OCR CAPTCHA'sı görürsünüz — bunların tamamını CaptchaAI çözer. Bir formda hCaptcha veya FunCaptcha çıkarsa CaptchaAI bu türleri desteklemediği için o akışı otomatikleştiremezsiniz.

reCAPTCHA v3, teklif akışını nasıl değiştirir?

v3 görünür bir onay kutusu göstermez; arka planda bir skor üretir. Token yine userrecaptcha yöntemiyle alınır ve g-recaptcha-response alanında gönderilir, yani entegrasyon mantığınız v2'dekiyle aynı kalır.

Teklif toplama iş yükü için hangi CaptchaAI planı yeterli?

Eşzamanlı çözüm sayısına, yani kaç taşıyıcıyı paralel işlediğinize bağlıdır. Birkaç taşıyıcıyı sırayla dolaşan bir toplayıcı için BASIC ($15/ay, 5 thread) çoğu zaman yeter; onlarca akışı paralel çalıştıran ekipler için STANDARD ($30/ay, 15 thread) veya üzeri daha rahattır.

Sigorta verisi toplarken KVKK açısından nelere dikkat etmeliyim?

Teklif formları kişisel veri içerir; bu nedenle otomasyonu yalnızca yetkili olduğunuz kendi ya da müşterinize ait akışlarda çalıştırın, topladığınız veriyi amaçla sınırlı tutun ve KVKK uyumlu bir saklama/silme politikası uygulayın.


İlgili kılavuzlar


Sigorta tekliflerini geniş ölçekte karşılaştırın — CaptchaAI anahtarınızı alın ve teklif toplamayı kırılgan bir zincir olmaktan çıkarın.

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