Geçerli bir token'ın neden reddedildiğini merak ediyorsanız cevap çoğu zaman tek bir ayrıntıda saklıdır: CAPTCHA'yı çözerken kullandığınız IP ile formu gönderdiğiniz IP birbirinden farklıdır. Doğru proxy rotasyonu bu tuzağı ortadan kaldırır ve doğrulama sıklığını belirgin biçimde düşürür — gerisini CaptchaAI çözer. Konut sınıfı IP havuzlarıyla çalışan iş akışlarında isabetli bir rotasyon stratejisi, CAPTCHA oranlarını %50–80 aralığında azaltabilir.
Bu rehberde üç konuyu netleştireceğiz:
- Hangi IP türünün en az doğrulama tetiklediğini ve nedenini.
- Hangi rotasyon deseninin hangi iş yüküne uygun olduğunu.
- CaptchaAI'yi proxy iş akışınıza nasıl bağlayacağınızı.
Konut IP'leri neden daha az CAPTCHA tetikler?
| Proxy türü | IP kaynağı | CAPTCHA oranı | Nedeni |
|---|---|---|---|
| Veri merkezi | Bulut/hosting sağlayıcı | Yüksek (%30–70) | IP aralıkları bilinir ve işaretlenir |
| Konut | Gerçek ev İSS'leri | Düşük (%5–15) | Gerçek kullanıcı gibi görünür |
| Mobil | Hücresel operatörler | Çok düşük (%1–5) | Binlerce abone aynı IP'yi paylaşır |
| İSS | Statik konut sınıfı | Düşük (%5–10) | Hız ve güveni birleştirir |
CAPTCHA sistemleri (özellikle reCAPTCHA) gelen isteğin IP itibarını veritabanlarında sorgular. Bu itibarı belirleyen başlıca sinyaller şunlardır:
- IP'nin hangi otonom sisteme (ASN) ait olduğu — veri merkezi mi, gerçek bir İSS mi.
- Geçmişte bot trafiği üretip üretmediği.
- Coğrafi konumun beklenen kullanıcı kitlesiyle tutarlı olup olmadığı.
Gerçek İSS'lere ait konut IP'leri gerçek abonelere tahsis edildiği için temiz bir geçmişe sahiptir ve bu yüzden daha az doğrulama tetikler.
Proxy rotasyon stratejileri
Rotasyon stratejinizi iş yükünüz belirler: çok sayıda bağımsız sayfayı mı geziyorsunuz, yoksa oturum sürekliliği gerektiren çok adımlı bir formu mu dolduruyorsunuz? Aşağıdaki üç desen bu iki uç arasındaki dengeyi kurar.
1. İstek başına rotasyon (varsayılan)
import requests
proxies = {
"http": "http://user:pass@gateway.proxy.com:7777",
"https": "http://user:pass@gateway.proxy.com:7777",
}
# Each request gets a new IP
for url in urls:
resp = requests.get(url, proxies=proxies, timeout=30)
# New IP after each request
- En uygun senaryo: farklı sitelerdeki çok sayıda sayfayı tek tek gezmek.
- CAPTCHA riski: istek başına düşüktür, ancak oturum sürekliliği sağlanamaz.
2. Sabit oturum rotasyonu
import random
import string
def get_sticky_session(duration_min=10):
session_id = "".join(random.choices(string.ascii_lowercase, k=8))
return {
"http": f"http://user-session-{session_id}:pass@gateway.proxy.com:7777",
"https": f"http://user-session-{session_id}:pass@gateway.proxy.com:7777",
}
# Same IP for the whole CAPTCHA workflow
session_proxy = get_sticky_session(duration_min=10)
# Step 1: Load page
resp = requests.get("https://staging.example.com/qa-form", proxies=session_proxy)
# Step 2: Solve CAPTCHA (same IP)
token = solve_captcha("https://staging.example.com/qa-form", sitekey)
# Step 3: Submit (same IP — required for token validity)
resp = requests.post("https://target.com/submit", proxies=session_proxy, data={
"g-recaptcha-response": token,
})
- En uygun senaryo: CAPTCHA korumalı formlar ve çok adımlı iş akışları.
- CAPTCHA riski: çok düşüktür — tutarlı IP zamanla güven oluşturur.
3. Alan adı başına rotasyon
domain_sessions = {}
def get_domain_proxy(domain):
"""Same IP per domain, different IP per domain."""
if domain not in domain_sessions:
session_id = "".join(random.choices(string.ascii_lowercase, k=8))
domain_sessions[domain] = get_sticky_session()
return domain_sessions[domain]
# site-a.com always uses the same IP
proxy_a = get_domain_proxy("site-a.com")
# site-b.com gets a different IP
proxy_b = get_domain_proxy("site-b.com")
Bu desen iki avantajı birleştirir:
- Her alan adı kendi sabit IP'sini korur; böylece site bazında tutarlı bir kimlik oluşur.
- Farklı hedeflere farklı IP'ler dağıtılır, tek bir havuz aşırı yüklenmez.
Üretimde işe yarayan uygulamalar
Doğru rotasyon deseni tek başına yeterli değildir; havuzdan en yüksek verimi almak için isteklerinizin de gerçek bir kullanıcı gibi görünmesi gerekir. Aşağıdaki beş uygulama bu farkı yaratır:
- Coğrafyayı hedefe eşleyin.
- İstek hızını insan temposuna yaklaştırın.
- Gerçekçi HTTP başlıkları gönderin.
- IP engellerini kontrollü yönetin.
- Yeni IP'leri ısıtın.
1. Coğrafyayı hedefle eşleştirin
# Target site is US-based? Use US residential IP
us_proxy = "http://user-country-us:pass@gateway.proxy.com:7777"
# Target is Germany? Use DE residential IP
de_proxy = "http://user-country-de:pass@gateway.proxy.com:7777"
Coğrafi olarak eşleşmeyen IP'ler daha fazla CAPTCHA tetikler. Örneğin Türkiye'de barındırılan bir e-ticaret staging ortamını test ederken TR veya yakın bir AB bölgesinden IP seçmek, uzak bir kıtadan bağlanmaya kıyasla belirgin biçimde daha az doğrulama üretir; Europe/Istanbul saat dilimi ve tr-TR yerel ayarıyla uyumlu bir profil bu tutarlılığı pekiştirir.
2. İstek hızını insan temposuna yaklaştırın
import time
import random
def human_pace_requests(urls, proxy):
results = []
for url in urls:
resp = requests.get(url, proxies=proxy, timeout=30)
results.append(resp)
# Random delay between requests
delay = random.uniform(2, 8)
time.sleep(delay)
return results
| Hız | CAPTCHA riski |
|---|---|
| Saniyede 1 istek | Yüksek (bot deseni) |
| 5–10 sn'de 1 istek | Orta |
| 10–30 sn'de 1 istek | Düşük (insana yakın) |
| Rastgele 3–15 sn | Çok düşük |
3. Gerçekçi HTTP başlıkları gönderin
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/126.0.0.0 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.9",
"Accept-Encoding": "gzip, deflate, br",
"DNT": "1",
"Connection": "keep-alive",
"Upgrade-Insecure-Requests": "1",
}
resp = requests.get(url, proxies=proxy, headers=headers)
Öne çıkan üç başlık pratikte fark yaratır:
User-Agent: güncel bir tarayıcı sürümüyle eşleşmeli, jenerik istemci imzaları bırakmamalı.Accept-Language: hedef bölgeyle uyumlu olmalı (tr-TRsitesi için Türkçe dil tercihi mantıklıdır).Accept-Encoding: gerçek tarayıcılarda daima gönderilir; eksikliği isteği anında öne çıkarır.
4. IP engellerini kontrollü yönetin
def fetch_with_retry(url, max_retries=3):
for attempt in range(max_retries):
# New proxy for each retry
proxy = get_sticky_session()
try:
resp = requests.get(url, proxies=proxy, timeout=30)
if resp.status_code == 403:
print(f"IP banned, rotating... (attempt {attempt + 1})")
time.sleep(5)
continue
if resp.status_code == 429:
print(f"Rate limited, backing off...")
time.sleep(30)
continue
return resp
except requests.exceptions.ProxyError:
print(f"Proxy failed, rotating...")
continue
raise Exception(f"Failed after {max_retries} retries")
Durum kodlarını ayrı ele alın: 403 genellikle IP'nin engellendiğini gösterir ve rotasyon gerektirir; 429 ise hız sınırıdır ve üstel geri çekilme (exponential backoff) ile beklemek daha doğrudur.
5. Yeni IP'leri ısıtın
def warm_up_proxy(proxy):
"""Visit neutral sites before target to build session trust."""
warm_urls = [
"https://www.google.com",
"https://www.wikipedia.org",
]
for url in warm_urls:
try:
requests.get(url, proxies=proxy, timeout=15)
time.sleep(random.uniform(2, 5))
except Exception:
pass
Yeni bir IP'yi doğrudan CAPTCHA korumalı hedefe sürmek yerine önce birkaç nötr sitede gezdirmek, oturuma daha doğal bir geçmiş kazandırır ve ilk denemedeki doğrulama olasılığını düşürür.
CaptchaAI entegrasyon deseni
Proxy rotasyonu doğrulama sıklığını düşürür; kalan CAPTCHA'ları ise API'ye devredersiniz. Aşağıdaki desen, sabit oturumla açılan sayfadan sitekey'i çıkarır, CaptchaAI'ye gönderir ve dönen token'ı aynı IP üzerinden formla birlikte iletir.
import requests
import time
import re
import random
import string
CAPTCHAAI_KEY = "YOUR_API_KEY"
CAPTCHAAI_URL = "https://ocr.captchaai.com"
def solve_recaptcha(site_url, sitekey):
resp = requests.post(f"{CAPTCHAAI_URL}/in.php", data={
"key": CAPTCHAAI_KEY,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": site_url,
"json": 1,
})
task_id = resp.json()["request"]
for _ in range(60):
time.sleep(5)
resp = requests.get(f"{CAPTCHAAI_URL}/res.php", params={
"key": CAPTCHAAI_KEY, "action": "get",
"id": task_id, "json": 1,
})
data = resp.json()
if data["request"] != "CAPCHA_NOT_READY":
return data["request"]
raise TimeoutError("Timeout")
def scrape_url(url, proxy_config):
"""Complete scrape with proxy + CAPTCHA solving."""
session_id = "".join(random.choices(string.ascii_lowercase, k=8))
proxy = {
"http": f"http://user-session-{session_id}:{proxy_config['pass']}@{proxy_config['host']}",
"https": f"http://user-session-{session_id}:{proxy_config['pass']}@{proxy_config['host']}",
}
resp = requests.get(url, proxies=proxy, timeout=30)
match = re.search(r'data-sitekey="([^"]+)"', resp.text)
if match:
token = solve_recaptcha(url, match.group(1))
resp = requests.post(
url.replace("/form", "/submit"),
proxies=proxy,
data={"g-recaptcha-response": token},
)
return resp.text
Sorun giderme
Konut IP havuzuyla çalışırken en sık karşılaşılan beş sorun ve pratik çözümleri:
| Sorun | Sebep | Çözüm |
|---|---|---|
| Her sayfada CAPTCHA çıkıyor | Zayıf IP havuzu | Proxy sağlayıcısını veya bölgeyi değiştirin |
| Token reddediliyor | Çözüm ile gönderim arasında IP değişti | Sabit oturum kullanın |
| 407 hataları | Kimlik doğrulama biçimi hatalı | Sağlayıcının tam kullanıcı adı biçimini doğrulayın |
| Yavaş yanıtlar | Ağ geçidi aşırı yüklü | Yoğun olmayan saatleri veya farklı bir uç noktayı deneyin |
| Oturum iş akışı ortasında bitiyor | Sabit oturum TTL'i çok kısa | Daha uzun oturum süresi isteyin |
Maliyeti kontrol altında tutma
Havuz kaliteniz stabil hale geldiğinde odak maliyete kayar. Aşağıdaki dört kaldıraç, konut IP ve CAPTCHA harcamalarını birlikte düşürür:
| Strateji | Etkisi |
|---|---|
| Konut IP'lerini yalnızca CAPTCHA yoğun sitelere ayırın | Tümünü konut sınıfında çalıştırmaya kıyasla %50–70 tasarruf |
| Oturum ısıtmayla CAPTCHA sıklığını düşürün | Daha az CaptchaAI çağrısı |
| CAPTCHA korumalı sayfalardan önce sıradan sayfaları toplu gezin | Daha az sabit oturum ihtiyacı |
| IP kalitesini izleyip zayıf havuzları eleyin | İlk denemede daha yüksek başarı |
CaptchaAI thread bazlı ücretlendirir ve her planda thread başına sınırsız çözüm sunar; düşük hacimli QA testleri için BASIC planı ($15/ay, 5 thread) çoğu zaman yeterlidir. TL kurundaki oynaklık göz önüne alındığında, aylık maliyeti USD üzerinden öngörülebilir tutan bu model Türkiye'deki ekipler için somut bir avantajdır. Kişisel veri topladığınız senaryolarda kazınan verinin KVKK kapsamına girebileceğini unutmayın ve çalışmayı yetkili QA/veri toplama akışlarıyla sınırlayın.
SSS
Geçerli token'ım neden reddediliyor?
En sık neden, CAPTCHA'yı çözdüğünüz IP ile formu gönderdiğiniz IP'nin farklı olmasıdır. Sayfa yüklemesinden token gönderimine kadar aynı IP'yi koruyun; görevi bitirdikten sonra rotasyona devam edin.
Türkiye'deki bir siteyi test ederken hangi bölgeden IP seçmeliyim?
Hedef altyapıya en yakın bölgeyi seçin. Türkiye'de barındırılan bir site için TR veya yakın AB bölgesi IP'leri, uzak coğrafyalara kıyasla daha az doğrulama tetikler.
Proxy kimlik bilgilerimi CaptchaAI'ye vermem gerekir mi?
Hayır. CaptchaAI yalnızca sitekey ve pageurl gibi CAPTCHA parametrelerini alır; isteği kendi proxy'niz üzerinden siz gönderirsiniz. Proxy kimlik bilgileriniz sizde kalır.
CaptchaAI hangi CAPTCHA türlerini çözer?
reCAPTCHA v2 ve v3, Cloudflare Turnstile, GeeTest (v3) ile görüntü/OCR tabanlı CAPTCHA'ları çözer. hCaptcha ve FunCaptcha desteklenmez; GeeTest v4 için çözüm çok yakında sunulacak.
İlgili rehberler
- Bright Data ile CaptchaAI proxy entegrasyonu
- Sabit ve dönüşümlü oturumların karşılaştırması
- Proxy kalitesi çözüm oranını nasıl etkiler
Proxy iş akışınızdaki CAPTCHA'ları otomatikleştirin — CaptchaAI anahtarınızı alın ve gerisini API'ye bırakın.