Integrations

Smartproxy ve CaptchaAI: proxy üzerinden CAPTCHA çözme kurulumu

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.php uç noktasına sitekey ve pageurl gönderir, res.php üzerinden sonucu sorgularsınız; elinize g-recaptcha-response alanı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


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.

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