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
- Proxy havuzu ile çözüm oranı ilişkisi
- Proxy kalitesinin çözüm hızına etkisi
- Tarayıcı oturumunun kalıcılığı
Oturum modunu iş akışınıza göre seçin — CaptchaAI API anahtarınızı alın ve ilk token'ınızı üretin.