Perbandingan

Sticky Session vs Rotating Session: Strategi Proxy Terbaik untuk CAPTCHA

Sesi tempel mempertahankan IP yang sama untuk durasi tertentu. Sesi rotasi menetapkan IP baru per request. Memilih yang salah akan meningkatkan tarif CAPTCHA dan membuang-buang kredit API.


Cara Kerja Setiap Mode

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)

Perbandingan Head-to-Head

Faktor Lengket Berputar
IP per request Sama selama 1-30 menit Baru setiap request
Konsistensi sesi Tinggi Tidak ada
Tarif CAPTCHA (aliran multi-langkah) Rendah (5-10%) Tinggi (30-50%)
Tarif CAPTCHA (satu halaman) Sedang (10-20%) Rendah (5-10%)
Validitas token Lebih tinggi — IP yang sama Risiko ketidakcocokan
Kecepatan Cepat (menggunakan kembali koneksi) Lebih lambat (koneksi baru)
Larangan risiko Lebih tinggi jika ditandai Rendah — IP baru setiap saat
Biaya Sama atau sedikit lebih Sama
Terbaik untuk Masuk, checkout, autentikasi Scraping massal, cari

Saat Sticky Session Menang

Alur Kerja Multi-Langkah

CAPTCHA memvalidasi token terhadap IP yang meminta. Jika IP Anda berubah antara solve dan pengiriman, token mungkin ditolak.

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:pass@proxy.example.com:5000",
    "https": "http://user-session-abc123:pass@proxy.example.com: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")

Mengapa Konsistensi IP Penting

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

Saat Sesi Berputar Menang

Scraping Halaman Massal

Setiap halaman bersifat independen. Memutar IP menyebarkan request ke kumpulan yang lebih besar, sehingga mengurangi deteksi per IP.

import concurrent.futures

ROTATING_PROXY = {
    "http": "http://user:pass@rotating.proxy.example.com:5000",
    "https": "http://user:pass@rotating.proxy.example.com: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)}")

Scraping Mesin Pencari

Mesin pencari melacak volume request per IP. Rotasi menghindari rate limit:

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

Strategi Hibrid

Gunakan kedua mode dalam alur yang sama:

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)

Implementasi Node.js

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

Matriks Keputusan

Alur kerja Direkomendasikan Mengapa
Masuk / daftar Lengket Token terikat pada IP
Pembayaran / pembayaran Lengket Cookie sesi memerlukan IP yang sama
Scraping halaman massal Berputar Mendistribusikan beban
Scraping mesin pencari Berputar Menghindari rate limit per-IP
Polling API (endpoint yang sama) Berputar Mengurangi sinyal browser per-IP
Navigasi multi-halaman Lengket Cookie dilacak berdasarkan IP
Pemantauan harga Berputar Banyak request independen
Manajemen akun Lengket Integritas sesi
Pengiriman formulir dengan CAPTCHA Lengket Pengikatan Token–IP
Verifikasi iklan Berputar Simulasikan beragam pengguna

Durasi Sesi Tetap

Durasi Terbaik Untuk Resiko
1 menit Formulir cepat dikirimkan Mungkin kedaluwarsa di tengah aliran
5 menit Login + tindakan standard Keseimbangan yang bagus
10 menit Alur multi-halaman yang kompleks Risiko larangan sedang
30 menit Sesi penjelajahan yang diperpanjang Risiko larangan lebih tinggi
60 menit Operasi akun panjang Risiko larangan tertinggi

Aturan praktis: Tetapkan durasi melekat menjadi 2x waktu aliran yang diharapkan.


Pemecahan Masalah

Masalah Penyebab Solusi
Token CAPTCHA ditolak setelah diselesaikan IP berubah antara selesaikan dan kirim Beralih ke sticky session
Tingkat CAPTCHA tinggi pada satu halaman IP melekat yang sama mengenai terlalu banyak halaman Beralih ke berputar
Cookie sesi hilang Sesi melekat telah berakhir Tingkatkan durasi TTL
Kinerja berputar lambat Overhead koneksi per IP baru Gunakan pengumpulan koneksi
IP terlarang dalam sticky session Semua request berbagi IP yang ditandai Kurangi TTL sesi atau tambahkan penundaan

Pertanyaan Umum

Bisakah saya mencampurkan lengket dan berputar dalam satu proyek?

Ya. Gunakan pendekatan hibrid — melekat untuk alur autentikasi, bergilir untuk pengumpulan data. Sebagian besar penyedia proxy mendukung kedua mode tersebut pada paket yang sama.

Apakah sticky session menjamin IP yang sama?

Kebanyakan penyedia menjaminnya dalam jendela TTL. Jika IP menjadi tidak tersedia (penugasan ulang operator, rotasi kumpulan), IP baru akan ditetapkan.

Modus mana yang lebih murah?

Harga yang sama — Anda membayar per GB atau per request, apa pun modenya. Perbedaan biaya berasal dari tarif CAPTCHA: mode salah → lebih banyak CAPTCHA → pembelanjaan CaptchaAI lebih tinggi.

Bagaimana cara mengatur sesi melekat dengan penyedia proxy saya?

Kebanyakan menggunakan ID sesi pada nama pengguna: user-session-abc123. Periksa dokumen penyedia Anda untuk mengetahui format persisnya. Kami meliputData Cerah,Proxy pintar, Danlaboratorium oksidalam panduan khusus.


Panduan Terkait


Sesuaikan strategi proxy Anda dengan alur kerja Anda —dapatkan kunci CaptchaAI Andauntuk menangani CAPTCHA dalam mode sesi apa pun.

Komentar dinonaktifkan untuk artikel ini.