Proxy yapılandırması ile CAPTCHA çözümü iki ayrı katmandır ve bu ikisini tek bir sorun gibi ele almak, entegrasyonda en sık görülen hatadır. Smartproxy isteğinizin hangi IP üzerinden çıktığını yönetir; CaptchaAI ise sayfadaki CAPTCHA doğrulamasını API üzerinden çözer ve size bir token döndürür. Aşağıdaki kurulum ikisini Python, Selenium ve Node.js tarafında birleştirir — ve asıl kritik noktayı, yani sayfa yükleme, çözüm ve form gönderimini aynı oturumda tutmayı, kod düzeyinde gösterir.
Görev dağılımı: hangi katman neyi çözer
Ayrımı baştan netleştirin, sorun giderme süreniz yarıya iner:
- Smartproxy taşıma katmanıdır. Hedef sayfayı hangi IP'nin, hangi ülkeden ve ne kadar süreyle istediğini belirler.
- CaptchaAI çözüm katmanıdır.
in.phpuç noktasınasitekeyvepageurlgönderir,res.phpüzerinden sonucu sorgularsınız; elinizeg-recaptcha-responsealanına yerleştireceğiniz bir token geçer.
Çözüm isteğinin proxy üzerinden gitmesi zorunlu değildir; CaptchaAI'ye doğrudan bağlanabilirsiniz. Önemli olan, aldığınız token'ı sayfayı yüklediğiniz IP ile geri göndermektir. "Token geçerli ama form reddedildi" vakalarının çoğunun kökeni tam olarak budur.
Hangi Smartproxy ağ geçidi hangi iş yüküne uygun?
| Ağ geçidi | Havuz | Uygun olduğu iş yükü | CAPTCHA sıklığı |
|---|---|---|---|
| Konut ağ geçidi | 55 milyondan fazla IP | Genel web kazıma | Düşük |
| Veri merkezi | 100.000+ IP | Yüksek hızlı toplu veri | Orta–yüksek |
| Mobil ağ geçidi | 10 milyondan fazla IP | Mobil cihazlara özel sayfalar | Çok düşük |
| İSS (statik) | Konut düzeyinde statik IP | Oturum ağırlıklı akışlar | Düşük |
Pratik kural: doğrulama akışı ne kadar oturuma bağlıysa (giriş, çok adımlı form, ödeme adımı), statik ya da sabit oturumlu bir çıkış o kadar mantıklıdır. Yüksek hacimli ve oturumsuz sayfa çekimlerinde veri merkezi ucu daha hızlıdır; karşılığında daha sık CAPTCHA doğrulaması görürsünüz.
Python tarafında temel kurulum
Ağ geçidi kimlik bilgilerini ve CaptchaAI API anahtarınızı tek yerde toplayın. solve_captcha fonksiyonu hem reCAPTCHA v2 hem Cloudflare Turnstile için aynı gövdeyi kullanır; yalnızca method ve anahtar alanı değişir.
import requests
import time
SMARTPROXY_USER = "spuser"
SMARTPROXY_PASS = "sppassword"
SMARTPROXY_HOST = "gate.smartproxy.com"
SMARTPROXY_PORT = 10001
CAPTCHAAI_KEY = "YOUR_API_KEY"
CAPTCHAAI_URL = "https://ocr.captchaai.com"
proxies = {
"http": f"http://{SMARTPROXY_USER}:{SMARTPROXY_PASS}@{SMARTPROXY_HOST}:{SMARTPROXY_PORT}",
"https": f"http://{SMARTPROXY_USER}:{SMARTPROXY_PASS}@{SMARTPROXY_HOST}:{SMARTPROXY_PORT}",
}
def fetch_page(url):
return requests.get(url, proxies=proxies, timeout=30)
def solve_captcha(site_url, sitekey, captcha_type="recaptcha_v2"):
submit_data = {
"key": CAPTCHAAI_KEY,
"pageurl": site_url,
"json": 1,
}
if captcha_type == "turnstile":
submit_data["method"] = "turnstile"
submit_data["sitekey"] = sitekey
else:
submit_data["method"] = "userrecaptcha"
submit_data["googlekey"] = sitekey
resp = requests.post(f"{CAPTCHAAI_URL}/in.php", data=submit_data)
data = resp.json()
if data["status"] != 1:
raise Exception(f"Submit failed: {data['request']}")
task_id = data["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":
continue
if data["status"] == 1:
return data["request"]
raise Exception(f"Solve: {data['request']}")
raise TimeoutError("Timeout")
Üç ayrıntıya dikkat edin: YOUR_API_KEY yer tutucusunu ortam değişkeninden okuyun, koda gömmeyin; sorgulama döngüsü 5 saniyede bir çalışır ve CAPCHA_NOT_READY yanıtını hata saymaz; json=1 parametresi olmadan yanıtı ayrıştırmak gereksiz yere zorlaşır.
Aynı IP'de kalın: oturum kimliğiyle sabit oturum
Varsayılan ağ geçidi her istekte farklı bir çıkış IP'si verir. Sayfayı bir IP'den yükleyip token'ı başka bir IP'den göndermek, doğrulamayı en hızlı bozan senaryodur. Kullanıcı adına bir oturum kimliği ekleyerek akışı tek bir çıkışa sabitleyin:
import random
import string
def get_sticky_proxy(session_duration_minutes=10):
"""Create a sticky session proxy (same IP for duration)."""
session_id = "".join(random.choices(string.ascii_lowercase + string.digits, k=8))
proxy_url = (
f"http://{SMARTPROXY_USER}"
f"-session-{session_id}"
f"-sessionduration-{session_duration_minutes}"
f":{SMARTPROXY_PASS}@{SMARTPROXY_HOST}:{SMARTPROXY_PORT}"
)
return {"http": proxy_url, "https": proxy_url}
# Use same IP for entire CAPTCHA workflow
sticky = get_sticky_proxy(session_duration_minutes=10)
# Page load
resp = requests.get("https://staging.example.com/qa-form", proxies=sticky)
# Solve CAPTCHA
token = solve_captcha("https://staging.example.com/qa-form", "SITEKEY_HERE")
# Submit with same IP
resp = requests.post(
"https://target.com/submit",
data={"g-recaptcha-response": token},
proxies=sticky,
)
Sayfa yükleme, çözüm ve gönderim adımlarının tamamı aynı sticky sözlüğünü kullanır. Çözümün bitmesiyle formun gönderilmesi arasındaki süreyi oturum ömrünün altında tutun; token'lar sınırsız süre geçerli değildir ve geciken gönderim doğrudan ret üretir.
Ülke hedefleme ve yerel senaryolar
Çıkış ülkesi de kullanıcı adı üzerinden seçilir; ayrı bir uç nokta gerekmez.
# Smartproxy country targeting via username
def get_country_proxy(country_code):
proxy_url = (
f"http://{SMARTPROXY_USER}"
f"-country-{country_code}"
f":{SMARTPROXY_PASS}@{SMARTPROXY_HOST}:{SMARTPROXY_PORT}"
)
return {"http": proxy_url, "https": proxy_url}
# US proxy
us_proxy = get_country_proxy("us")
# UK proxy
uk_proxy = get_country_proxy("gb")
# Germany proxy
de_proxy = get_country_proxy("de")
Türkiye'deki ekiplerde bunun en sık karşılığı, yurt dışına açılan bir e-ticaret ya da fintech ürününün ödeme adımını farklı pazarlardan test etmektir. Europe/Istanbul saatinde çalışan bir QA işi, Almanya çıkışlı bir oturumla tr-TR yerine de-DE gören sayfayı doğrulayabilir; bölgeye göre değişen doğrulama akışları böylece gerçek koşullarda ölçülür. Bu testlerde toplanan veri kişisel veri içeriyorsa KVKK yükümlülüklerinin geçerli olduğunu unutmayın: yalnızca yetkiniz olan alan adlarında ve saklama süresi tanımlı bir akışta çalışın.
Selenium ile tarayıcı tarafı entegrasyon
Tarayıcı gerektiren akışlarda proxy'yi Chrome seçeneklerine, oturum kimliğini ise kullanıcı adına verirsiniz:
from selenium import webdriver
from selenium.webdriver.common.by import By
def create_smartproxy_driver(country=None, sticky_session=None):
proxy_user = SMARTPROXY_USER
if country:
proxy_user += f"-country-{country}"
if sticky_session:
proxy_user += f"-session-{sticky_session}"
proxy_url = f"{proxy_user}:{SMARTPROXY_PASS}@{SMARTPROXY_HOST}:{SMARTPROXY_PORT}"
options = webdriver.ChromeOptions()
options.add_argument(f"--proxy-server=http://{SMARTPROXY_HOST}:{SMARTPROXY_PORT}")
options.add_argument("--no-sandbox")
options.add_argument("--window-size=1920,1080")
# For authenticated proxies, use seleniumwire or extension
return webdriver.Chrome(options=options)
def scrape_with_captcha(url, country="us"):
session_id = "".join(random.choices(string.ascii_lowercase, k=8))
driver = create_smartproxy_driver(country=country, sticky_session=session_id)
try:
driver.get(url)
time.sleep(3)
sitekey = driver.execute_script(
"return document.querySelector('[data-sitekey]')?.getAttribute('data-sitekey')"
)
if sitekey:
token = solve_captcha(url, sitekey)
driver.execute_script(f"""
document.querySelector('#g-recaptcha-response').value = '{token}';
""")
driver.find_element(By.CSS_SELECTOR, "form").submit()
time.sleep(3)
return driver.page_source
finally:
driver.quit()
Kimlik doğrulamalı bir ağ geçidinde --proxy-server argümanı tek başına yetmez; Chrome kullanıcı adı ve parolayı bu yolla soramaz. Bu yüzden Selenium Wire ya da kimlik bilgilerini taşıyan küçük bir tarayıcı eklentisi kullanın. Sitekey'i DOM'dan okuduktan sonra token'ı #g-recaptcha-response alanına yazın ve formu aynı sürücü üzerinden gönderin.
Node.js tarafında aynı akış
Node.js tarafında ağ geçidi bir HTTPS agent olarak tanımlanır; CaptchaAI çağrıları bu agent'tan bağımsız gider.
const axios = require("axios");
const HttpsProxyAgent = require("https-proxy-agent");
const CAPTCHAAI_KEY = "YOUR_API_KEY";
function getSmartproxyAgent(options = {}) {
let user = "spuser";
if (options.country) user += `-country-${options.country}`;
if (options.session) user += `-session-${options.session}`;
return new HttpsProxyAgent(
`http://${user}:sppassword@gate.smartproxy.com:10001`
);
}
async function scrapeWithCaptcha(url, sitekey) {
const agent = getSmartproxyAgent({
country: "us",
session: `sess-${Date.now()}`,
});
// Fetch page through proxy
const pageResp = await axios.get(url, { httpsAgent: agent });
// Solve CAPTCHA via CaptchaAI (no proxy needed)
const submitResp = await axios.post(
"https://ocr.captchaai.com/in.php",
null,
{
params: {
key: CAPTCHAAI_KEY,
method: "userrecaptcha",
googlekey: sitekey,
pageurl: url,
json: 1,
},
}
);
const taskId = submitResp.data.request;
// Poll for result
for (let i = 0; i < 60; i++) {
await new Promise((r) => setTimeout(r, 5000));
const result = await axios.get("https://ocr.captchaai.com/res.php", {
params: {
key: CAPTCHAAI_KEY,
action: "get",
id: taskId,
json: 1,
},
});
if (result.data.request === "CAPCHA_NOT_READY") continue;
if (result.data.status === 1) return result.data.request;
}
throw new Error("Timeout");
}
session değerini istek grubu başına üretin. Her çağrıda yeni bir zaman damgası kullanmak sabit oturum avantajını kaybettirir — aynı akışa ait isteklerde aynı değeri taşıyın.
Eşzamanlılık: thread bütçenizi ağ geçidiyle eşleyin
Paralel işlemede iki ayrı sınır vardır: ağ geçidinizin eşzamanlı bağlantı sınırı ve CaptchaAI planınızın thread sayısı. Havuz genişliğini bu ikisinin küçüğüne göre seçin.
from concurrent.futures import ThreadPoolExecutor, as_completed
def process_url(url):
session_id = "".join(random.choices(string.ascii_lowercase, k=8))
proxy = get_sticky_proxy(10)
try:
resp = requests.get(url, proxies=proxy, timeout=30)
# Check if CAPTCHA is present (simplified detection)
if "data-sitekey" in resp.text:
import re
match = re.search(r'data-sitekey="([^"]+)"', resp.text)
if match:
sitekey = match.group(1)
token = solve_captcha(url, sitekey)
return {"url": url, "status": "solved", "token": token[:30]}
return {"url": url, "status": "no_captcha"}
except Exception as e:
return {"url": url, "status": "error", "error": str(e)}
urls = [
"https://site1.com/page",
"https://site2.com/page",
"https://site3.com/page",
]
with ThreadPoolExecutor(max_workers=5) as executor:
futures = {executor.submit(process_url, u): u for u in urls}
for future in as_completed(futures):
result = future.result()
print(f"[{result['status']}] {result['url']}")
CaptchaAI planları thread tabanlıdır ve her plan fatura ayı boyunca thread başına sınırsız çözüm içerir; çözüm başına ek ücret yoktur. BASIC ($15/ay, 5 thread) tek işçili bir süreç için yeterlidir ve yukarıdaki beş işçilik havuz tam olarak bu bütçeye oturur. Düzenli çalışan birden fazla iş için ADVANCE ($90/ay, 50 thread) daha rahat bir tavan verir. Fiyatlar USD'dir ve aylık gider öngörülebilir kalır; kura göre oynayan çözüm başına maliyet hesabı tutmak zorunda kalmazsınız.
Sorun giderme
| Sorun | Sebep | Düzeltme |
|---|---|---|
| 407 Proxy Authentication Required | Kullanıcı adı/parola biçimi yanlış | Kimlik bilgilerini Smartproxy panelinden birebir kopyalayın |
| IP akışın ortasında değişiyor | Oturum kimliği kullanılmıyor | Kullanıcı adına -session-ID ekleyin |
| Her istekte CAPTCHA doğrulaması | Veri merkezi ucu kullanılıyor | Konut ağ geçidine geçin |
| Bağlantılar yavaş | Seçilen coğrafi hedef yoğun | Farklı bir ülke veya şehir deneyin |
| Token çözümden sonra reddediliyor | Yükleme ile gönderim arasında IP değişti | Oturum süresini uzatın, tek çıkışta kalın |
ERROR_ZERO_BALANCE yanıtı |
Bakiye bitti ya da plan yenilenmedi | Panelden bakiyeyi kontrol edin, sorgulama döngüsünü durdurun |
Sitekey None dönüyor |
Sayfa CAPTCHA'yı geç yüklüyor | Sabit bekleme yerine öğe bekleme koşulu (explicit wait) kullanın |
Sık sorulan sorular
Smartproxy IP'sini CaptchaAI'ye iletebilir miyim?
Evet. Gönderme isteğinde proxy parametresini kullanabilirsiniz; çözüm bu durumda sizin çıkışınızla aynı yoldan yapılır. Oturuma bağlı doğrulama akışlarında tutarlılığı artırır.
CAPTCHA çözümü için proxy şart mı?
Hayır. CaptchaAI'ye giden in.php ve res.php çağrıları doğrudan gidebilir. Proxy, hedef siteye erişim tarafındaki bir ihtiyaçtır; çözüm servisi için zorunlu değildir.
Hangi CaptchaAI planı bu akışa uygun?
Eşzamanlı kaç CAPTCHA'nın havada olacağına bakın. Tek işçili bir işte BASIC ($15/ay, 5 thread), sürekli çalışan paralel işlerde ADVANCE ($90/ay, 50 thread) mantıklıdır; ölçek büyüdükçe ENTERPRISE ($300/ay, 200 thread) devreye girer.
CaptchaAI hCaptcha'yı da destekliyor mu?
Hayır. hCaptcha ve FunCaptcha desteklenmiyor; GeeTest v4 için yalnızca "çok yakında" durumu geçerli. Bu kurulumda desteklenen türler reCAPTCHA v2 ve Cloudflare Turnstile'dır. CaptchaFox (beta), Friendly Captcha (beta) ve Lemin (beta) ise beta kapsamındadır.
Ağ geçidini değiştirdim, çözüm süresi neden kısalmadı?
Çözüm süresi CAPTCHA türüne bağlıdır, çıkış IP'nize değil. Proxy tarafındaki iyileştirme sayfanın ne sıklıkla doğrulama gösterdiğini etkiler; tek bir CAPTCHA'nın çözülme süresini kısaltmaz.
İlgili rehberler
- Bright Data ile CaptchaAI entegrasyonu
- IP rotasyonu ve oturum stratejileri
- Proxy kalitesi çözüm oranını nasıl etkiler?
Kurulumu bugün tamamlayın: API anahtarınızı alın, ağ geçidini kod örneğine ekleyin ve ilk token'ınızı görün.