API Tutorials

SOCKS5 Proxy + CaptchaAI: Kurulum ve Yapılandırma Kılavuzu

Kısa cevap: SOCKS5 proxy'nizi istemci tarafında socks5h:// şemasıyla tanımlayın, CAPTCHA görevini CaptchaAI'ye gönderirken aynı proxy'yi proxy ve proxytype=SOCKS5 parametreleriyle iletin, dönen token'ı sayfaya aynı oturum üzerinden yazın. Bu üç adım birlikte yapılmazsa sayfayı bir IP'den açıp token'ı başka bir IP'den üretmiş olursunuz; form da çoğu zaman hata mesajı bile vermeden reddeder.

Aşağıda kurulum Python (requests, aiohttp), Selenium, Node.js ve Puppeteer için tek tek anlatılıyor; sonda da sık karşılaşılan hataların çözüm tablosu var.


SOCKS5 ne zaman gerekli, ne zaman gereksiz

SOCKS5 her iş yükü için doğru araç değildir. Karar kısayolu şöyle:

  • SOCKS5 kullanın: WebSocket veya HTTP dışı TCP trafiğiniz varsa, DNS çözümlemesinin proxy tarafında yapılmasını istiyorsanız ya da sağlayıcınız yalnızca SOCKS5 uç noktası veriyorsa.
  • HTTP proxy yeter: Yalnızca düz HTTP/HTTPS istekleri atıyorsanız ve mevcut yığınınız zaten HTTP proxy ile sorunsuz çalışıyorsa. Protokolü değiştirmek tek başına çözüm oranınızı yükseltmez.

Protokol farkları:

Özellik HTTP/HTTPS proxy SOCKS5 proxy
Protokol desteği Yalnızca HTTP/HTTPS TCP/UDP fark etmez
İstek başlıkları X-Forwarded-For ekleyebilir Başlığa dokunmaz
DNS çözümlemesi İstemci tarafında Sunucu tarafında (socks5h)
Kimlik doğrulama Basic/Digest Kullanıcı adı/parola
WebSocket Sınırlı Tam destek
Hız Hızlı Bir tık daha yavaş

Pratikte SOCKS5'in asıl kazandırdığı şey hız değil, trafiğin tek bir çıkıştan tutarlı biçimde akması: sayfayı açan istek, sayfanın attığı XHR çağrıları ve WebSocket bağlantısı aynı uç noktadan gider.


Python kurulumu

requests + PySocks

Önce SOCKS desteğini kurun:

pip install requests[socks] pysocks

requests bu paketle birlikte socks5h:// şemasını tanır. Aşağıdaki dosya tam iş akışını içeriyor: proxy üzerinden sayfayı çekin, sitekey değerini ayıklayın, CAPTCHA'yı CaptchaAI'ye gönderin ve dönen token'ı formla birlikte iletin.

import requests
import time

SOCKS5_HOST = "proxy.example.com"
SOCKS5_PORT = 1080
SOCKS5_USER = "proxyuser"
SOCKS5_PASS = "proxypass"

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

# SOCKS5 proxy configuration
proxies = {
    "http": f"socks5h://{SOCKS5_USER}:{SOCKS5_PASS}@{SOCKS5_HOST}:{SOCKS5_PORT}",
    "https": f"socks5h://{SOCKS5_USER}:{SOCKS5_PASS}@{SOCKS5_HOST}:{SOCKS5_PORT}",
}
# socks5h = DNS resolved by proxy server (recommended)
# socks5  = DNS resolved locally


def fetch_through_socks(url):
    """Fetch URL through SOCKS5 proxy."""
    return requests.get(
        url,
        proxies=proxies,
        headers={
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
            "AppleWebKit/537.36 Chrome/126.0.0.0 Safari/537.36"
        },
        timeout=30,
    )


def solve_captcha(site_url, sitekey):
    """Solve CAPTCHA via CaptchaAI (direct, no proxy needed)."""
    resp = requests.post(f"{CAPTCHAAI_URL}/in.php", data={
        "key": CAPTCHAAI_KEY,
        "method": "userrecaptcha",
        "googlekey": sitekey,
        "pageurl": site_url,
        "json": 1,
    })
    data = resp.json()
    if data["status"] != 1:
        raise Exception(f"Submit: {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")


# Full workflow
resp = fetch_through_socks("https://staging.example.com/qa-form")

import re
match = re.search(r'data-sitekey="([^"]+)"', resp.text)
if match:
    token = solve_captcha("https://staging.example.com/qa-form", match.group(1))
    # Submit with token through same proxy
    resp = requests.post(
        "https://target.com/submit",
        data={"g-recaptcha-response": token},
        proxies=proxies,
    )

İki ayrıntı kritik. Birincisi, socks5h:// yazımındaki h harfi DNS'i proxy sunucusuna devreder; socks5:// kullanırsanız alan adı sizin makinenizde çözülür ve gerçek IP'niz DNS trafiğinde görünür. İkincisi, CaptchaAI çağrısının proxy üzerinden gitmesi zorunlu değildir: proxy'nin taşıması gereken şey hedef sayfadır, çözüm servisiyle kurduğunuz bağlantı değil.

aiohttp ile eşzamansız istekler

Aynı anda onlarca sayfa işleyen bir toplu işlem yazıyorsanız aiohttp_socks bağlayıcısı requests'ten belirgin biçimde verimli çalışır:

import aiohttp
import aiohttp_socks
import asyncio


async def fetch_async(url):
    connector = aiohttp_socks.ProxyConnector.from_url(
        f"socks5://{SOCKS5_USER}:{SOCKS5_PASS}@{SOCKS5_HOST}:{SOCKS5_PORT}"
    )

    async with aiohttp.ClientSession(connector=connector) as session:
        async with session.get(url) as resp:
            return await resp.text()


asyncio.run(fetch_async("https://staging.example.com/qa-form"))

Eşzamanlılığı planlarken thread bütçenizi hesaba katın: planlar thread tabanlıdır ve bir thread, aynı anda çözülen bir CAPTCHA demektir. BASIC ($15/ay, 5 thread) beş görevi paralel çözer, ADVANCE ($90/ay, 50 thread) elli görevlik kuyruğu besler. Bu sayının üzerine çıkmak hızı artırmaz, yalnızca bekleme kuyruğu oluşturur.


Selenium + SOCKS5

Chrome'un komut satırı bayrağı SOCKS5'i kabul eder ama kimlik doğrulamalı proxy'yi kabul etmez. Kullanıcı adı ve parola gerekiyorsa Selenium Wire üzerinden gidin; aşağıdaki dosyada her iki yol da var:

from selenium import webdriver
from selenium.webdriver.common.by import By


def create_socks5_driver(host, port, username=None, password=None):
    options = webdriver.ChromeOptions()

    # SOCKS5 proxy (no auth via command line)
    options.add_argument(f"--proxy-server=socks5://{host}:{port}")

    # DNS through proxy
    options.add_argument("--host-resolver-rules=MAP * ~NOTFOUND, EXCLUDE 127.0.0.1")

    options.add_argument("--no-sandbox")
    options.add_argument("--window-size=1920,1080")

    driver = webdriver.Chrome(options=options)
    return driver


# For authenticated SOCKS5, use seleniumwire
from seleniumwire import webdriver as sw_webdriver

def create_auth_socks5_driver():
    options = {
        "proxy": {
            "http": f"socks5h://{SOCKS5_USER}:{SOCKS5_PASS}@{SOCKS5_HOST}:{SOCKS5_PORT}",
            "https": f"socks5h://{SOCKS5_USER}:{SOCKS5_PASS}@{SOCKS5_HOST}:{SOCKS5_PORT}",
        }
    }

    chrome_options = sw_webdriver.ChromeOptions()
    chrome_options.add_argument("--no-sandbox")

    return sw_webdriver.Chrome(
        seleniumwire_options=options,
        options=chrome_options,
    )


# Usage
driver = create_auth_socks5_driver()
driver.get("https://staging.example.com/qa-form")
time.sleep(3)

sitekey = driver.execute_script(
    "return document.querySelector('[data-sitekey]')?.getAttribute('data-sitekey')"
)

if sitekey:
    token = solve_captcha("https://staging.example.com/qa-form", sitekey)
    driver.execute_script(f"""
        document.querySelector('#g-recaptcha-response').value = '{token}';
    """)
    driver.find_element(By.CSS_SELECTOR, "form").submit()

driver.quit()

Kimlik doğrulaması olmayan proxy için --proxy-server=socks5://host:port yeterli. Kimlik bilgisi varsa Selenium Wire'ın seleniumwire_options sözlüğü isteği yerel bir dinleyici üzerinden geçirir. Token'ı #g-recaptcha-response alanına yazdıktan sonra formu aynı sürücü oturumunda gönderin; yeni sürücü açmak hem oturumu hem IP eşleşmesini bozar.


Node.js + SOCKS5

Node tarafında socks-proxy-agent paketini Axios'a agent olarak takmak yeterli. Aynı agent'ı hem httpAgent hem httpsAgent için verin, aksi hâlde HTTPS istekleri proxy'yi atlar ve sunucunuzun gerçek IP'sinden çıkar:

const { SocksProxyAgent } = require("socks-proxy-agent");
const axios = require("axios");

const CAPTCHAAI_KEY = "YOUR_API_KEY";

const socksAgent = new SocksProxyAgent(
  "socks5h://proxyuser:[email protected]:1080"
);

async function fetchViaSocks(url) {
  return axios.get(url, {
    httpsAgent: socksAgent,
    httpAgent: socksAgent,
    headers: {
      "User-Agent":
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/126.0.0.0",
    },
  });
}

async function solveCaptcha(siteUrl, sitekey) {
  // CaptchaAI calls don't go through SOCKS proxy
  const submit = await axios.post(
    "https://ocr.captchaai.com/in.php",
    null,
    {
      params: {
        key: CAPTCHAAI_KEY,
        method: "userrecaptcha",
        googlekey: sitekey,
        pageurl: siteUrl,
        json: 1,
      },
    }
  );

  const taskId = submit.data.request;

  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");
}

Buradaki solveCaptcha fonksiyonu CaptchaAI'ye doğrudan bağlanır: in.php ile görevi gönderir, ardından beş saniyelik aralıklarla res.php'yi sorgular. CAPCHA_NOT_READY yanıtı bir hata değil, "henüz hazır değil" demektir — döngüyü kırmayın, sorgulamaya devam edin.


Puppeteer + SOCKS5

Puppeteer'da proxy başlatma bayrağıyla verilir, kimlik doğrulama ise page.authenticate() ile yapılır:

const puppeteer = require("puppeteer");

async function launchWithSocks5() {
  const browser = await puppeteer.launch({
    args: [
      "--proxy-server=socks5://proxy.example.com:1080",
      "--no-sandbox",
      "--window-size=1920,1080",
    ],
  });

  const page = await browser.newPage();

  // Authenticate if needed
  await page.authenticate({
    username: "proxyuser",
    password: "proxypass",
  });

  await page.goto("https://staging.example.com/qa-form", { waitUntil: "networkidle0" });

  const sitekey = await page.evaluate(() =>
    document.querySelector("[data-sitekey]")?.getAttribute("data-sitekey")
  );

  if (sitekey) {
    const token = await solveCaptcha(page.url(), sitekey);
    await page.evaluate((t) => {
      document.querySelector("#g-recaptcha-response").value = t;
    }, token);
  }

  await browser.close();
}

waitUntil: "networkidle0" seçeneği, sayfadaki CAPTCHA betiği yüklenmeden sitekey aramanızı engeller. Proxy yavaşsa bu bekleme süresi uzar; zaman aşımı alıyorsanız önce proxy gecikmesini ölçün, kodu değiştirmeyin.


Proxy'yi CaptchaAI'ye parametre olarak iletme

Buraya kadarki örneklerde proxy yalnızca sizin isteklerinizi taşıyordu. Proxy'yi CaptchaAI'ye de iletirseniz çözüm de aynı IP üzerinden üretilir. IP ile token'ın eşleştiği bu yapılandırma, özellikle IP tutarlılığına duyarlı reCAPTCHA v2 ve Cloudflare Turnstile akışlarında reddedilen token sayısını belirgin biçimde azaltır.

Parametre biçimi type:host:port:user:pass, proxytype alanı ise ayrıca gönderilir:

def solve_with_proxy(site_url, sitekey, proxy_url):
    """Pass proxy to CaptchaAI for IP-matched solving."""
    # Format: type:host:port:user:pass
    proxy_param = f"socks5:{SOCKS5_HOST}:{SOCKS5_PORT}:{SOCKS5_USER}:{SOCKS5_PASS}"

    resp = requests.post(f"{CAPTCHAAI_URL}/in.php", data={
        "key": CAPTCHAAI_KEY,
        "method": "userrecaptcha",
        "googlekey": sitekey,
        "pageurl": site_url,
        "proxy": proxy_param,
        "proxytype": "SOCKS5",
        "json": 1,
    })

    data = resp.json()
    if data["status"] != 1:
        raise Exception(f"Submit: {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":
            return data["request"]

    raise TimeoutError("Timeout")

Bu yapılandırmada proxy'nizin CaptchaAI tarafından erişilebilir olması şart: yalnızca kendi sunucu IP'nize açık bir SOCKS5 uç noktası dışarıdan gelen bağlantıyı reddeder ve görev proxy bağlantı hatasıyla döner.


Yerel senaryo: ödeme adımının staging ortamında test edilmesi

Türkiye'deki ekiplerin en sık kurduğu senaryo şu: bir e-ticaret ekibi kendi staging ortamındaki ödeme adımını test ediyor, form reCAPTCHA v2 ile korunuyor. Test koşucusu Frankfurt'taki bir sunucuda, hedef ortam ise Europe/Istanbul saat dilimine göre yapılandırılmış; sayfa doğrudan çekildiğinde bölgesel yönlendirme devreye giriyor ve testin beklemediği varyant dönüyor.

Çözüm iki parçalı: testi İstanbul çıkışlı bir SOCKS5 uç noktasına bağlayın ve aynı uç noktayı CaptchaAI'ye proxy parametresiyle iletin. Böylece hem sayfa hem token aynı coğrafyadan gelir, tr-TR yerel ayarıyla render edilen form doğru varyantla test edilir. Maliyet tarafında da öngörülebilirlik var: planlar aylık USD ve thread bazlı faturalanır, dolayısıyla her gece koşan test paketinizin aylık gideri kur hareketlerinden bağımsız olarak sabit kalır.

Bir uyarı: test akışınızda gerçek müşteri kaydı dolaşıyorsa bu veri KVKK kapsamındadır. Staging ortamlarında üretim verisi yerine sentetik kayıtlar kullanın — +90 biçiminde sahte numaralar, maskelenmiş e-posta adresleri, kurgusal adresler.


Sorun giderme

Sorun Sebep Düzeltme
Bağlantı reddedildi Yanlış port veya host SOCKS5 sunucusunun ayakta olduğunu curl --socks5 ile doğrulayın
DNS sızıntısı socks5h:// yerine socks5:// yazılmış Şemayı socks5h:// yapın, DNS proxy tarafında çözülsün
Kimlik doğrulama başarısız Hatalı kullanıcı adı/parola ya da bayrakla auth denemesi Kimlik bilgisi varsa Selenium Wire veya page.authenticate() kullanın
Yanıtlar çok yavaş Coğrafi olarak uzak proxy Hedef ortama yakın bir çıkış noktası seçin
WebSocket bağlantısı kopuyor SOCKS5 sunucusu UDP desteklemiyor UDP destekleyen bir SOCKS5 sunucusuna geçin
Token reddediliyor Sayfa ve çözüm farklı IP'lerden geliyor Proxy'yi CaptchaAI'ye de iletin (proxytype=SOCKS5)

Sık sorulan sorular

socks5:// ile socks5h:// arasındaki fark nedir?

socks5h:// alan adını proxy sunucusunda çözer, socks5:// ise sizin makinenizde. Otomasyonda neredeyse her zaman socks5h:// istersiniz; aksi hâlde istek trafiği proxy'den geçse bile DNS sorgularınız yerel ağdan çıkar.

Kimlik doğrulamalı SOCKS5 proxy'yi Chrome'da neden tanımlayamıyorum?

Chrome'un --proxy-server bayrağı kullanıcı adı ve parola kabul etmez; bu bir yapılandırma hatası değil, tarayıcının sınırıdır. Selenium tarafında Selenium Wire, Puppeteer tarafında page.authenticate() bu boşluğu doldurur.

CaptchaAI hangi CAPTCHA türlerini proxy parametresiyle çözebilir?

Proxy parametresi, desteklenen türlerin tamamında aynı biçimde çalışır: reCAPTCHA v2 ve v3 (Enterprise varyantları dahil), Cloudflare Turnstile ve Cloudflare doğrulama akışı, GeeTest v3, görüntü/OCR ve grid CAPTCHA'ları, BLS. CaptchaFox (beta), Friendly Captcha (beta) ve Lemin (beta) beta aşamasındadır. hCaptcha ve FunCaptcha (Arkose Labs) desteklenmiyor; GeeTest v4 için "çok yakında" durumu geçerli.

Kaç eşzamanlı SOCKS5 bağlantısına ihtiyacım var?

Bağlantı sayınızı proxy tarafı değil, thread bütçeniz belirler. Aynı anda çözülmesini istediğiniz CAPTCHA sayısı kadar thread gerekir: STANDARD ($30/ay, 15 thread) orta ölçekli bir test paketine yeter, PREMIUM ($170/ay, 100 thread) sürekli çalışan bir veri kazıma hattını besler.

Proxy gecikmesi çözüm süresini uzatır mı?

Doğrudan uzatmaz — çözüm süresi CaptchaAI tarafında geçen süredir. Uzayan şey sayfayı açma ve formu gönderme adımlarıdır. Token'ın geçerlilik penceresi kısa olduğu için yavaş bir proxy, elinizdeki geçerli token'ın süresini doldurup onu boşa harcamanıza yol açabilir.


İlgili rehberler


SOCKS5 yapılandırmanız hazırsa sıra çözümde: API anahtarınızı alın ve ilk token'ınızı bugün üretin.

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