Comparisons

Sabit Oturumlar ve Dönüşümlü Oturumlar: CAPTCHA'lar için En İyi Proxy Stratejisi

Kısa yanıt: çok adımlı akışlarda sabit oturum, toplu sayfa çekiminde dönüşümlü oturum kullanın. Sebebi tek: reCAPTCHA v2 token'ı çözümün yapıldığı IP ile ilişkilendirilir; başka IP'den gönderilirse reddedilir.

Türkiye'deki otomasyon ekiplerinde faturası tanıdıktır:

  • E-ticaret ödeme testleri "bazen" düşer.
  • Ekip suçu çözüm kalitesine yazar.
  • Asıl sebep ise değişen çıkış IP'sidir.

30 Saniyede Karar Matrisi

Ölçüt tek satırda özetlenir: çok adımlı akış → sabit, bağımsız sayfa çekimi → dönüşümlü.

İş akışı Önerilen mod Gerekçe
Giriş / kayıt Sabit Token IP'ye bağlı
Ödeme adımı Sabit Çerezler aynı IP'yi bekler
Toplu sayfa çekme Dönüşümlü Yükü havuza yayar
Arama sonuçları Dönüşümlü İstek sınırını zorlamaz
Periyodik sorgulama Dönüşümlü Yoğunluğu dağıtır
Çok sayfalı gezinme Sabit Çerezler IP ile eşleşmeli
Fiyat takibi Dönüşümlü Birbirinden bağımsız istekler
Hesap işlemleri Sabit Oturum bütünlüğü
CAPTCHA'lı form gönderimi Sabit Token–IP eşleşmesi
Reklam doğrulaması Dönüşümlü Farklı profilleri temsil eder

Yan Yana Karşılaştırma

Faktör Sabit oturum Dönüşümlü oturum
İstek başına IP 1–30 dakika aynı Her istekte yeni
Oturum tutarlılığı Yüksek Yok
CAPTCHA oranı (çok adımlı) Düşük (%5–10) Yüksek (%30–50)
CAPTCHA oranı (tek sayfa) Orta (%10–20) Düşük (%5–10)
Token geçerliliği Yüksek — aynı IP Uyumsuzluk riski
Hız Hızlı (bağlantı yeniden kullanılır) Daha yavaş (yeni bağlantı)
İşaretlenme riski Tüm oturum tek IP'ye bağlı Düşük — yeni IP
Maliyet Aynı veya biraz fazla Aynı
Uygun olduğu yer Giriş, ödeme, kimlik doğrulama Toplu kazıma, arama

Değerler gözlemlenen verilere dayanır; ortama göre değişebilir.

Belirti → sebep → çözüm

Sorun Sebep Çözüm
Token reddedildi Arada IP değişti Akışı sabit oturuma alın
CAPTCHA oranı yüksek Tek IP çok sayfaya gidiyor Dönüşümlü moda geçin
Çerezler kayboluyor TTL doldu TTL'yi iki katına çıkarın
Performans düşük Her IP için yeni bağlantı Bağlantı havuzu kullanın
IP işaretlendi İstekler tek IP'yi paylaşıyor TTL'yi kısaltın
CAPCHA_NOT_READY uzun sürüyor Thread'ler dolu Plan thread sayısını kontrol edin

İki Oturum Modu Teknik Olarak Ne Yapar?

STICKY SESSION:
  Request 1 ──▶ IP: 192.168.1.50 ──▶ site.com/login
  Request 2 ──▶ IP: 192.168.1.50 ──▶ site.com/dashboard
  Request 3 ──▶ IP: 192.168.1.50 ──▶ site.com/account
  (Same IP for all requests in the session window)

ROTATING SESSION:
  Request 1 ──▶ IP: 192.168.1.50 ──▶ site.com/page1
  Request 2 ──▶ IP: 10.0.0.77   ──▶ site.com/page2
  Request 3 ──▶ IP: 172.16.5.22 ──▶ site.com/page3
  (Different IP per request)

Özetle: sabit oturum kimliği korur, dönüşümlü oturum yükü dağıtır.

Token'ın IP'ye bağlanması: asıl kırılma noktası

CAPTCHA doğrulaması token'ı isteği yapan IP ile değerlendirir. Aşağıdaki örnek zinciri tek bir requests.Session üzerinde tutar.

import requests
import time

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

# Sticky session: same IP for the entire login flow
STICKY_PROXY = {
    "http": "http://user-session-abc123:[email protected]:5000",
    "https": "http://user-session-abc123:[email protected]:5000",
}

session = requests.Session()
session.proxies = STICKY_PROXY
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_with_captcha(url, sitekey, username, password):
    """Full login flow — MUST use same IP throughout."""
    # Step 1: Load login page (IP: 192.168.1.50)
    session.get(url)

    # Step 2: Solve CAPTCHA (solved against IP: 192.168.1.50)
    token = solve_recaptcha(sitekey, url)

    # Step 3: Submit login (MUST be IP: 192.168.1.50)
    resp = session.post(url, data={
        "username": username,
        "password": password,
        "g-recaptcha-response": token,
    })

    return resp.status_code == 200


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("CAPTCHA solve timeout")

Kritik satır session.proxies atamasıdır. Token geçerliyken form yine 4xx dönüyorsa önce buraya bakın.


Sabit Oturum Hangi İş Akışlarında Kazanır?

Çok adımlı kimlik doğrulama akışları

Üç adım da aynı IP'den gitmelidir:

Sticky session:

  1. Browser loads page    → IP: 5.5.5.5
  2. CAPTCHA solved        → Token bound to session
  3. Form submitted        → IP: 5.5.5.5 ✅ Token accepted

Rotating session:

  1. Browser loads page    → IP: 5.5.5.5
  2. CAPTCHA solved        → Token bound to session
  3. Form submitted        → IP: 9.9.9.9 ❌ Token may be rejected

Ödeme adımı QA testleri

Kendi mağazanızın sepet → adres → ödeme adımlarını test ederken IP değişirse sepet düşer ve test yanlış negatif üretir. Kişisel veri topluyorsanız KVKK kapsamındasınız.


Dönüşümlü Oturum Hangi İş Akışlarında Kazanır?

Bağımsız sayfaların toplu olarak çekilmesi

Sayfalar bağımsızsa oturum tutarlılığı gerekmez; yükü yaymak CAPTCHA oranını düşürür.

import concurrent.futures

ROTATING_PROXY = {
    "http": "http://user:[email protected]:5000",
    "https": "http://user:[email protected]:5000",
}


def scrape_page(url):
    """Each request gets a fresh IP automatically."""
    resp = requests.get(
        url,
        proxies=ROTATING_PROXY,
        headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"},
        timeout=30,
    )
    if resp.status_code == 200:
        return url, resp.text
    return url, None


urls = [f"https://example.com/products?page={i}" for i in range(1, 501)]

with concurrent.futures.ThreadPoolExecutor(max_workers=10) as pool:
    results = list(pool.map(scrape_page, urls))
    success = sum(1 for _, html in results if html)
    print(f"Scraped: {success}/{len(urls)}")

Arama sonuçları ve fiyat takibi

Arama motorları IP başına sorgu hacmini izler:

def scrape_search(query, pages=10):
    results = []
    for page in range(pages):
        # Each request → new IP
        resp = requests.get(
            "https://search-engine.example.com/search",
            params={"q": query, "start": page * 10},
            proxies=ROTATING_PROXY,
            timeout=20,
        )
        results.append(resp.text)
        time.sleep(2)
    return results

Çıkan Cloudflare Turnstile ve GeeTest v3 doğrulamaları CaptchaAI ile çözülür; GeeTest v4 çok yakında.


İki Modu Tek Ardışık Düzende Birleştirin

Aynı yönetici sınıfı, isteğin türüne göre uygun modu döndürebilir:

class HybridProxyManager:
    """Sticky for multi-step flows, rotating for single requests."""

    def __init__(self, provider_host, username, password, port=5000):
        self.host = provider_host
        self.username = username
        self.password = password
        self.port = port

    def get_rotating_proxy(self):
        return {
            "http": f"http://{self.username}:{self.password}@{self.host}:{self.port}",
            "https": f"http://{self.username}:{self.password}@{self.host}:{self.port}",
        }

    def get_sticky_proxy(self, session_id, duration_min=10):
        sticky_user = f"{self.username}-session-{session_id}-ttl-{duration_min}"
        return {
            "http": f"http://{sticky_user}:{self.password}@{self.host}:{self.port}",
            "https": f"http://{sticky_user}:{self.password}@{self.host}:{self.port}",
        }


proxy_mgr = HybridProxyManager("proxy.example.com", "user", "pass")


def scrape_with_auto_strategy(url, needs_login=False):
    if needs_login:
        # Multi-step → sticky
        import uuid
        session_id = uuid.uuid4().hex[:8]
        proxy = proxy_mgr.get_sticky_proxy(session_id)
    else:
        # Single page → rotating
        proxy = proxy_mgr.get_rotating_proxy()

    return requests.get(url, proxies=proxy, timeout=30)

Node.js tarafında aynı mantık axios ile kurulur:

const axios = require("axios");

const CAPTCHAAI_KEY = "YOUR_API_KEY";
const PROXY_HOST = "proxy.example.com";
const PROXY_PORT = 5000;

function getProxy(mode, sessionId = null) {
  const user =
    mode === "sticky" ? `user-session-${sessionId}` : "user";

  return {
    proxy: {
      host: PROXY_HOST,
      port: PROXY_PORT,
      auth: { username: user, password: "pass" },
    },
  };
}

// Rotating: bulk scrape
async function scrapePages(urls) {
  const results = [];
  for (const url of urls) {
    const config = getProxy("rotating");
    const resp = await axios.get(url, { ...config, timeout: 30000 });
    results.push({ url, data: resp.data });
  }
  return results;
}

// Sticky: login flow
async function loginFlow(loginUrl, sitekey, credentials) {
  const sessionId = Date.now().toString(36);
  const config = getProxy("sticky", sessionId);

  // Step 1: Load page
  await axios.get(loginUrl, config);

  // Step 2: Solve CAPTCHA
  const submitResp = await axios.post(
    "https://ocr.captchaai.com/in.php",
    null,
    {
      params: {
        key: CAPTCHAAI_KEY,
        method: "userrecaptcha",
        googlekey: sitekey,
        pageurl: loginUrl,
        json: 1,
      },
    }
  );
  const taskId = submitResp.data.request;

  let token;
  for (let i = 0; i < 60; i++) {
    await new Promise((r) => setTimeout(r, 5000));
    const res = await axios.get("https://ocr.captchaai.com/res.php", {
      params: { key: CAPTCHAAI_KEY, action: "get", id: taskId, json: 1 },
    });
    if (res.data.request !== "CAPCHA_NOT_READY") {
      token = res.data.request;
      break;
    }
  }

  // Step 3: Submit with same IP
  return axios.post(
    loginUrl,
    {
      ...credentials,
      "g-recaptcha-response": token,
    },
    config
  );
}

TTL Süresini Nasıl Seçersiniz?

Süre Uygun olduğu iş Risk
1 dakika Tek adımlık form gönderimi Akış ortasında biter
5 dakika Standart giriş + işlem En dengeli seçenek
10 dakika Çok sayfalı akışlar Orta işaretlenme riski
30 dakika Uzun tarama oturumu Yüksek işaretlenme riski
60 dakika Uzun hesap işlemleri En yüksek işaretlenme riski

Pratik kural: TTL = akış süresi × 2.


Maliyet Tarafı: Yanlış Mod Neyi Pahalılaştırır?

CaptchaAI faturalandırması eşzamanlı thread üzerindendir; thread başına çözüm sınırsızdır. Yanlış mod daha çok doğrulama, daha çok doğrulama da daha çok thread demektir.

  • Küçük bir QA ardışık düzeni: BASIC ($15/ay, 5 thread).
  • Worker sayısı arttığında: ADVANCE ($90/ay, 50 thread).
  • TL oynaklığı karşısında sabit USD tutarı bütçelemeyi kolaylaştırır.

SSS

Sabit oturumda token neden hâlâ reddediliyor?

En sık sebep, çözüm isteğinin proxy dışından gitmesidir: solve_recaptcha doğrudan çıkarken form proxy üzerinden giderse ortada iki IP vardır. İkisini de aynı Session üzerinden yapın.

TTL akışın ortasında dolarsa ne olur?

Sağlayıcı yeni IP atar, oturum çerezleri geçersizleşir. TTL'yi bol tutmak yeniden denemekten ucuzdur.

Dönüşümlü modda eşzamanlılığı ne kadar artırabilirim?

Sınır proxy'de değil, plan thread sayınızdadır: 50 worker'ı 5 thread'le çalıştırırsanız istekler kuyrukta bekler. Worker sayısını thread sayısıyla hizalayın.

CaptchaAI hCaptcha'yı destekliyor mu?

Hayır; hCaptcha ve FunCaptcha (Arkose Labs) desteklenmiyor. Desteklenenler: reCAPTCHA v2/v3, Cloudflare Turnstile, GeeTest v3, görüntü/OCR, grid, BLS; ayrıca CaptchaFox (beta), Friendly Captcha (beta), Lemin (beta).

Sağlayıcımda sabit oturumu nasıl açarım?

Çoğu sağlayıcı kullanıcı adına oturum kimliği ekler: user-session-abc123. Bright Data, Smartproxy ve Oxylabs rehberlerimize bakın.


İlgili Rehberler


Oturum modunu iş akışınıza göre seçin — CaptchaAI API anahtarınızı alın ve ilk token'ınızı üretin.

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