Use Cases

CaptchaAI ile Otomasyon Botlarında CAPTCHA Çözme

Bir otomasyon botu ilk CAPTCHA duvarına çarptığı anda durur — form gönderilemez, kayıt tamamlanmaz, veri akışı kesilir. Çözüm, CAPTCHA'yı botun kendi kodunun içinde çözmektir: CaptchaAI API'ye sitekey ve pageurl gönderirsiniz, geri dönen token'ı forma yerleştirirsiniz ve bot insan müdahalesi olmadan yoluna devam eder. Bu kılavuz, tek bir yeniden kullanılabilir bot çerçevesiyle reCAPTCHA, Cloudflare Turnstile ve resim CAPTCHA'larını aynı akışta nasıl çözeceğinizi Python ve Node.js örnekleriyle gösterir.

Hangi Otomasyon Akışlarında CAPTCHA Çıkar?

Botunuzun karşılaşacağı CAPTCHA türü, otomasyona aldığınız akışa göre değişir. Aşağıdaki tablo yaygın senaryoları ve her biri için çağıracağınız CaptchaAI yöntemini eşleştirir:

Senaryo Tipik CAPTCHA CaptchaAI Yöntemi
Form gönderimi reCAPTCHA v2 method=userrecaptcha
Hesap kaydı reCAPTCHA v2/v3 method=userrecaptcha
Veri giriş portalları Resim CAPTCHA'sı method=base64
Rezervasyon akışları Cloudflare Turnstile method=turnstile
API ağ geçidi erişimi Cloudflare doğrulama akışı method=cloudflare_challenge

Türkiye'deki ekiplerin en sık otomasyona aldığı işler e-ticaret ve fintech tarafında yoğunlaşır: ödeme akışlarının QA testi, ürün kataloğu doğrulaması, form gönderimlerinin regresyon kontrolü. Bu akışların hemen hepsi bir noktada reCAPTCHA veya Turnstile ile korunur; bu yüzden botun CAPTCHA katmanını tek merkezden yönetmesi işi baştan sağlamlaştırır.

Yeniden Kullanılabilir Bot Çerçevesi

Her senaryo için ayrı kod yazmak yerine, tüm CAPTCHA türlerini tek bir solve() metoduyla çözen bir temel sınıf kurun. Bu sınıf görevi in.php uç noktasına gönderir, sonucu res.php üzerinden sorgular ve token döner:

import requests
import time
import logging

logger = logging.getLogger(__name__)

class CaptchaBot:
    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 solve(self, method, **params):
        """Solve any CAPTCHA type."""
        params["key"] = self.api_key
        params["method"] = method

        resp = requests.get("https://ocr.captchaai.com/in.php", params=params)
        if not resp.text.startswith("OK|"):
            raise Exception(f"Submit error: {resp.text}")

        task_id = resp.text.split("|")[1]
        logger.info(f"Task submitted: {task_id}")

        for _ in range(60):
            time.sleep(5)
            result = requests.get("https://ocr.captchaai.com/res.php", params={
                "key": self.api_key, "action": "get", "id": task_id
            })
            if result.text == "CAPCHA_NOT_READY": continue
            if result.text.startswith("OK|"): return result.text.split("|")[1]
            raise Exception(f"Error: {result.text}")

        raise TimeoutError("CAPTCHA solve timed out")

    def submit_form(self, url, form_data, captcha_field="g-recaptcha-response",
                    site_key=None, captcha_method="userrecaptcha"):
        """Submit a form with CAPTCHA solving."""
        if site_key:
            if captcha_method == "userrecaptcha":
                token = self.solve(captcha_method, googlekey=site_key, pageurl=url)
            elif captcha_method == "turnstile":
                token = self.solve(captcha_method, sitekey=site_key, pageurl=url)
            form_data[captcha_field] = token

        return self.session.post(url, data=form_data)

Buradaki fikir, solve() metodunun türden bağımsız olmasıdır: reCAPTCHA için googlekey, Turnstile için sitekey geçirir, gerisini API halleder. submit_form() ise token'ı doğru form alanına yerleştirip gönderimi tamamlar. API anahtarınızı alıp ilk çağrıyı yapmadıysanız, önce hesabı kurup anahtarı panelden almanız yeterli.

Örnek: Form Gönderen Bot

En yalın senaryo, reCAPTCHA v2 ile korunan bir iletişim formudur. Bot sayfanın sitekey değerini bilir, token'ı çözer ve formu gönderir:

bot = CaptchaBot("YOUR_API_KEY")

# Submit a contact form protected by reCAPTCHA
result = bot.submit_form(
    url="https://example.com/contact",
    form_data={
        "name": "John Doe",
        "email": "john@example.com",
        "message": "Inquiry about your service"
    },
    site_key="6Le-wvkS...",
    captcha_method="userrecaptcha"
)

print(f"Form submitted: {result.status_code}")

Burada tek kritik değer sayfanın sitekey değeridir; onu sayfanın kaynağından çıkarır, submit_form() içine geçirirsiniz. Token forma otomatik yerleşir ve gönderim tamamlanır.

Örnek: Çok Adımlı İş Akışı Botu

Gerçek dünyadaki akışlar tek adımlı değildir. Bir rezervasyon akışının QA testinde bot önce sayfayı yükler, tarih/saat seçer, ardından CAPTCHA'lı onay adımını gönderir. Adım sırası korunur; her adım bir öncekinin durumuna dayanır:

def appointment_booking_bot(date, time_slot, user_info):
    bot = CaptchaBot("YOUR_API_KEY")

    # Step 1: Load booking page
    page = bot.session.get("https://example.com/book")

    # Step 2: Select date and time
    resp = bot.session.post("https://example.com/book/select", data={
        "date": date,
        "time": time_slot
    })

    # Step 3: Fill personal info with CAPTCHA
    result = bot.submit_form(
        url="https://example.com/book/confirm",
        form_data={
            "name": user_info["name"],
            "email": user_info["email"],
            "phone": user_info["phone"],
            "date": date,
            "time": time_slot
        },
        site_key="6Le-wvkS...",
        captcha_method="userrecaptcha"
    )

    return result.status_code == 200

# Run
success = appointment_booking_bot(
    date="2025-02-15",
    time_slot="10:00",
    user_info={"name": "John Doe", "email": "john@example.com", "phone": "555-0100"}
)

CAPTCHA yalnızca son adımda çözülür; ilk iki adım oturum durumunu hazırlar. Bu yüzden CaptchaBot içindeki session nesnesini tüm adımlarda paylaşmak önemlidir — çerez ve oturum sürekliliği bu şekilde korunur.

Örnek: Resim CAPTCHA'lı Veri Giriş Botu

Eski veri giriş portalları genellikle klasik resim CAPTCHA'sı kullanır. Burada base64 yöntemiyle görüntüyü doğrudan API'ye gönderir, dönen metni forma yazarsınız:

import base64

def data_entry_bot(entries, captcha_image_url):
    bot = CaptchaBot("YOUR_API_KEY")

    for entry in entries:
        # Load the form page
        page = bot.session.get("https://portal.example.com/entry")

        # Download and solve image CAPTCHA
        img = bot.session.get(captcha_image_url)
        img_b64 = base64.b64encode(img.content).decode()
        captcha_text = bot.solve("base64", body=img_b64)

        # Submit entry
        resp = bot.session.post("https://portal.example.com/entry", data={
            **entry,
            "captcha": captcha_text
        })

        logger.info(f"Entry submitted: {resp.status_code}")
        time.sleep(random.uniform(2, 5))

Toplu veri girişi yaparken işlediğiniz kayıtlar kişisel veri içeriyorsa KVKK kapsamına girdiğini unutmayın: yalnızca yetkiniz olan verilerle, izinli QA veya veri toplama akışları içinde çalışın. Botun her kayıt arasına rastgele bir gecikme koyması hem portalı yormaz hem de akışı daha gerçekçi kılar.

Node.js Bot Çerçevesi

Aynı yapıyı Node.js tarafında da kurabilirsiniz. axios ile görevi gönderir, sonucu sorgular ve token'ı forma yerleştirirsiniz:

const axios = require("axios");

class CaptchaBot {
  constructor(apiKey) {
    this.apiKey = apiKey;
  }

  async solve(method, params) {
    params.key = this.apiKey;
    params.method = method;

    const submit = await axios.get("https://ocr.captchaai.com/in.php", {
      params,
    });
    const taskId = submit.data.split("|")[1];

    while (true) {
      await new Promise((r) => setTimeout(r, 5000));
      const result = await axios.get("https://ocr.captchaai.com/res.php", {
        params: { key: this.apiKey, action: "get", id: taskId },
      });
      if (result.data === "CAPCHA_NOT_READY") continue;
      if (result.data.startsWith("OK|")) return result.data.split("|")[1];
      throw new Error(result.data);
    }
  }

  async submitForm(url, formData, siteKey, method = "userrecaptcha") {
    const token = await this.solve(method, {
      googlekey: siteKey,
      pageurl: url,
    });
    formData["g-recaptcha-response"] = token;

    return axios.post(url, new URLSearchParams(formData));
  }
}

// Usage
const bot = new CaptchaBot("YOUR_API_KEY");
const result = await bot.submitForm(
  "https://example.com/submit",
  { name: "John", email: "john@example.com" },
  "6Le-wvkS..."
);

Turnstile ile korunan sayfalarda method değerini turnstile yapmanız ve sitekey parametresini geçirmeniz yeterlidir; token'ın forma yerleşimi reCAPTCHA ile aynıdır. Böylece tek bir çerçeve iki farklı CAPTCHA türünü aynı kod yoluyla çözer.

Bot Filonuz İçin Plan ve Thread Seçimi

CaptchaAI, çözüm başına değil eşzamanlı thread başına ücretlendirir; her plan o ay boyunca thread başına sınırsız çözüm içerir. Botunuzun kaç isteği aynı anda uçurduğu, ihtiyacınız olan thread sayısını belirler:

  • BASIC ($15/ay, 5 thread) — tek bir zamanlanmış bot veya küçük QA akışı için yeterlidir.
  • ADVANCE ($90/ay, 50 thread) — paralel çalışan birden çok worker'a rahat nefes aldırır.
  • PREMIUM ($170/ay, 100 thread) — kesintisiz çalışan büyük bot filoları için.

Fatura thread başına olduğundan, günlük hacim arttığında ek çözüm ücreti değil yalnızca daha fazla thread gerekir. TL kurundaki oynaklığa karşı fiyatların USD ve aylık sabit olması, bütçe planlamasını öngörülebilir kılar.

Sorun Giderme

Sorun Düzeltme
CAPTCHA token'ı reddedildi Token'ı çözdükten sonraki 120 saniye içinde kullanın
Geçerli token'a rağmen bot tespit edildi Gerçekçi HTTP başlıkları ekleyin ve istekler arasına gecikme koyun
Form ek alanlar gerektiriyor Form kaynağında gizli alanlar (CSRF token'ları) olup olmadığını inceleyin
Tekrarlanan gönderimlerde istek sınırına takılıyor İstekler arasına gecikme ekleyin ve istek hızını düşürün

Sık Sorulan Sorular

Çözülen token ne kadar süre geçerli kalır?

Token'ı çözdükten sonra 120 saniye içinde göndermeniz gerekir. Bu süre dolarsa hedef site token'ı reddeder ve yeniden çözüm istemeniz gerekir; bu yüzden çözme ile gönderme adımlarını arka arkaya tutun.

Bot filom için hangi CaptchaAI planını seçmeliyim?

Aynı anda kaç görev çözdüğünüze bakın. Tek bir bot için BASIC ($15/ay, 5 thread), paralel worker'lar için ADVANCE ($90/ay, 50 thread) iyi başlangıç noktalarıdır. Fatura thread başına olduğundan, günlük hacim arttıkça ek ücret değil yalnızca daha fazla thread gerekir.

Geçerli bir token gönderdiğim halde bot neden engelleniyor?

Token doğruysa sorun genellikle CAPTCHA katmanında değil, istek profilindedir. Gerçekçi HTTP başlıkları ekleyin, istekler arasına gecikme koyun ve gönderim hızını insani bir tempoya çekin. CaptchaAI CAPTCHA'yı çözer; isteğin geri kalanının doğal görünmesi sizin akışınızın sorumluluğundadır.

CaptchaAI hangi CAPTCHA türlerini çözüyor?

reCAPTCHA v2/v3 (görünmez ve Enterprise dahil), Cloudflare Turnstile ve Cloudflare doğrulama akışı, GeeTest v3, resim/OCR, grid ve BLS CAPTCHA'ları desteklenir. CaptchaFox, Friendly Captcha ve Lemin ise beta aşamasındadır. hCaptcha ve FunCaptcha ise henüz desteklenmiyor; GeeTest v4 için destek çok yakında.

Veri kazıyan botlarda KVKK'ya dikkat etmeli miyim?

Evet. Topladığınız veriler kişisel veri içeriyorsa KVKK kapsamındadır. Yalnızca yetkiniz olan ve sahibi olduğunuz veri üzerinde, izinli QA ve veri toplama akışları içinde çalışın.

İlgili Kılavuzlar

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