Integrations

Oxylabs + CaptchaAI: Integrasi Datacenter Proxy

Proxy dan solver CAPTCHA mengerjakan dua hal yang berbeda, dan justru itu alasan keduanya dipakai bersama:

  • Proxy Oxylabs menentukan dari IP mana request Anda keluar dan menjaga IP tetap bersih serta tersebar.
  • CaptchaAI menyelesaikan reCAPTCHA v2, Turnstile, dan tantangan lain yang tetap muncul di IP mana pun.

Gabungkan keduanya dan Anda punya pipeline scraping yang stabil — request lewat IP bersih, token CAPTCHA balik dalam hitungan detik. Panduan ini menunjukkan pola integrasinya di Python, dari routing satu request sampai menjalankan puluhan URL secara paralel. Bagi tim scraping di Indonesia yang menagih klien berdasarkan volume, pemisahan ini juga soal biaya: bandwidth dibayar ke Oxylabs, konkurensi (thread) dibayar ke CaptchaAI, sehingga tiap sisi bisa diukur dan dihemat sendiri.


Memilih produk proxy Oxylabs untuk alur CAPTCHA

Oxylabs punya beberapa lini produk. Untuk kerja scraping ber-CAPTCHA, pilihan intinya ada di dua baris pertama: kecepatan proxy pusat data versus kebersihan IP residensial.

Produk Jumlah IP Kecepatan Cocok untuk
Proxy pusat data (datacenter) 2 juta+ Sangat cepat Volume tinggi, kecepatan utama
IP residensial 100 juta+ Sedang Situs sensitif terhadap CAPTCHA
Proxy ISP Kelas residensial Cepat E-commerce, media sosial
IP seluler 20 juta+ Lambat Target khusus seluler
SERP Scraper API Terkelola Cepat Hasil Google/Bing

Aturan praktisnya sederhana:

  • Proxy pusat data memicu CAPTCHA lebih sering, tetapi jauh lebih cepat dan murah per request.
  • IP residensial memancing lebih sedikit tantangan, tetapi berbayar per GB dan lebih lambat.

Karena CaptchaAI menyelesaikan CAPTCHA apa pun yang lolos, banyak tim justru berani memakai proxy pusat data yang murah dan menyerahkan tantangannya ke solver.

Integrasi dengan Python

Alur inti CaptchaAI selalu empat langkah yang sama, apa pun proxy-nya:

  1. Kirim tantangan ke in.php bersama sitekey dan pageurl.
  2. Simpan task ID yang dikembalikan.
  3. Polling res.php sampai token siap.
  4. Pakai token pada request submit Anda.

Routing request lewat proxy Oxylabs

Pola dasarnya: bungkus setiap request dengan kredensial proxy Oxylabs, lalu panggil CaptchaAI hanya saat sebuah halaman menuntut CAPTCHA. Fungsi fetch_page menambahkan penargetan negara opsional, sementara solve_recaptcha menjalankan siklus empat langkah di atas.

import requests
import time

OXYLABS_USER = "customer-USERNAME"
OXYLABS_PASS = "PASSWORD"
OXYLABS_ENDPOINT = "pr.oxylabs.io:7777"

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

# Residential rotasi egress jaringan yang diotorisasi
proxies = {
    "http": f"http://{OXYLABS_USER}:{OXYLABS_PASS}@{OXYLABS_ENDPOINT}",
    "https": f"http://{OXYLABS_USER}:{OXYLABS_PASS}@{OXYLABS_ENDPOINT}",
}


def fetch_page(url, country=None):
    """Fetch page through Oxylabs proxy."""
    user = OXYLABS_USER
    if country:
        user += f"-cc-{country}"

    proxy = {
        "http": f"http://{user}:{OXYLABS_PASS}@{OXYLABS_ENDPOINT}",
        "https": f"http://{user}:{OXYLABS_PASS}@{OXYLABS_ENDPOINT}",
    }

    return requests.get(
        url,
        proxies=proxy,
        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_recaptcha(site_url, sitekey):
    """Solve via CaptchaAI."""
    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")

Menjaga IP tetap dengan sticky session

CAPTCHA sering muncul di tengah alur multi-langkah — buka form, isi, submit. Kalau IP berganti di tengah jalan, sesi bisa gugur dan tantangan berulang. Sticky session Oxylabs mengunci satu IP untuk seluruh langkah, sehingga token yang Anda ambil masih valid saat di-submit.

def get_oxylabs_sticky_proxy(session_id, country=None):
    """Create Oxylabs sticky session (same IP)."""
    user = OXYLABS_USER + f"-sessid-{session_id}"
    if country:
        user += f"-cc-{country}"

    proxy_url = f"http://{user}:{OXYLABS_PASS}@{OXYLABS_ENDPOINT}"
    return {"http": proxy_url, "https": proxy_url}


# CAPTCHA workflow with sticky IP
import random, string
session = "".join(random.choices(string.ascii_lowercase, k=8))
proxy = get_oxylabs_sticky_proxy(session, country="us")

# All requests use the same IP
resp = requests.get("https://staging.example.com/qa-form", proxies=proxy)
# ... solve CAPTCHA ...
resp = requests.post("https://target.com/submit", proxies=proxy, data={
    "g-recaptcha-response": token,
})

Menggabungkan Web Scraper API Oxylabs dengan CaptchaAI

Sebagian situs perlu rendering JavaScript penuh sebelum CAPTCHA-nya bahkan tampil. Web Scraper API Oxylabs menangani rendering itu; setelah HTML kembali, Anda deteksi data-sitekey dan serahkan ke CaptchaAI.

def scrape_with_oxylabs_api(url):
    """Use Oxylabs Web Scraper API for rendering, CaptchaAI for CAPTCHAs."""
    resp = requests.post(
        "https://realtime.oxylabs.io/v1/queries",
        auth=(OXYLABS_USER, OXYLABS_PASS),
        json={
            "source": "universal",
            "url": url,
            "render": "html",
            "browser_instructions": [
                {"type": "wait", "wait_time_s": 3},
            ],
        },
    )

    result = resp.json()
    html = result["results"][0]["content"]

    # Check for CAPTCHA in rendered HTML
    import re
    sitekey_match = re.search(r'data-sitekey="([^"]+)"', html)

    if sitekey_match:
        sitekey = sitekey_match.group(1)
        token = solve_recaptcha(url, sitekey)
        return {"html": html, "captcha_solved": True, "token": token}

    return {"html": html, "captcha_solved": False}

Kapan pakai proxy pusat data, kapan IP residensial

Keputusan ini paling menentukan biaya. Pilih tipe proxy per target, bukan satu tipe untuk semua:

  • Target sensitif (banyak proteksi): mulai dari IP residensial agar tantangan lebih jarang.
  • Target volume tinggi (proteksi ringan): pakai proxy pusat data yang cepat, biarkan CaptchaAI menuntaskan CAPTCHA yang muncul.

Fungsi smart_proxy_selection di bawah menerapkan logika itu langsung dari flag sensitivitas.

# Datacenter: Fast but higher CAPTCHA rate
DC_PROXY = {
    "http": f"http://{OXYLABS_USER}:{OXYLABS_PASS}@dc.pr.oxylabs.io:10000",
    "https": f"http://{OXYLABS_USER}:{OXYLABS_PASS}@dc.pr.oxylabs.io:10000",
}

# Residential: Slower but lower CAPTCHA rate
RES_PROXY = {
    "http": f"http://{OXYLABS_USER}:{OXYLABS_PASS}@pr.oxylabs.io:7777",
    "https": f"http://{OXYLABS_USER}:{OXYLABS_PASS}@pr.oxylabs.io:7777",
}


def smart_proxy_selection(url, captcha_sensitive=True):
    """Pick proxy type based on target site sensitivity."""
    if captcha_sensitive:
        return RES_PROXY  # Less likely to trigger CAPTCHA
    return DC_PROXY  # Faster, CaptchaAI handles any CAPTCHAs

Menjalankan banyak URL secara paralel

Untuk skala nyata, jalankan beberapa URL sekaligus. Tiap worker mendapat sticky session sendiri, dan tiap CAPTCHA yang ditemukan diselesaikan lewat CaptchaAI. Jumlah max_workers di sini sebaiknya selaras dengan jumlah thread di paket CaptchaAI Anda — satu tantangan aktif menempati satu thread. Deploy worker di region terdekat seperti AWS ap-southeast-1 (Singapura) atau ap-southeast-3 (Jakarta) untuk menekan latensi.

from concurrent.futures import ThreadPoolExecutor, as_completed

def process_url(url):
    session = "".join(random.choices(string.ascii_lowercase, k=8))
    proxy = get_oxylabs_sticky_proxy(session, country="us")

    try:
        resp = requests.get(url, proxies=proxy, timeout=30)

        import re
        match = re.search(r'data-sitekey="([^"]+)"', resp.text)

        if match:
            token = solve_recaptcha(url, match.group(1))
            return {"url": url, "status": "solved"}
        return {"url": url, "status": "no_captcha"}

    except Exception as e:
        return {"url": url, "status": "error", "error": str(e)}


urls = ["https://site1.com", "https://site2.com", "https://site3.com"]

with ThreadPoolExecutor(max_workers=5) as executor:
    futures = {executor.submit(process_url, u): u for u in urls}
    for future in as_completed(futures):
        print(future.result())

Saat menargetkan data publik, pastikan Anda hanya memproses data yang berhak Anda olah — UU Pelindungan Data Pribadi (UU 27/2022) menjadikan ini praktik yang wajar dijaga, bukan sekadar formalitas.

Tips: setel max_workers tidak melebihi jumlah thread paket CaptchaAI Anda. Worker berlebih hanya akan antre menunggu thread kosong, bukan mempercepat solve.

Mengatasi masalah umum

Masalah Penyebab Solusi
403 dari proxy IP masuk daftar hitam Beralih ke IP residensial atau rotasi IP
Autentikasi gagal endpoint salah Datacenter: dc.pr.oxylabs.io:10000, Residensial: pr.oxylabs.io:7777
Sticky session berakhir Standarnya 10 menit Buat ID sesi baru
CAPTCHA di setiap halaman IP datacenter dikenali Beralih ke IP residensial
Respons lambat Latensi jaringan residensial Terima apa adanya atau pindah ke proxy ISP

Pertanyaan umum

Apakah saya masih perlu proxy jika sudah memakai CaptchaAI?

Ya, keduanya berbeda peran. CaptchaAI menyelesaikan tantangan CAPTCHA, tetapi tidak menentukan dari IP mana request Anda keluar. Proxy Oxylabs menjaga IP tetap bersih dan tersebar; CaptchaAI menangani CAPTCHA yang tetap muncul.

Bagaimana cara menekan 403 dan CAPTCHA yang berulang saat scraping?

Mulai dari IP residensial untuk target sensitif, pakai sticky session agar satu alur memakai satu IP, dan lakukan rotasi IP setelah beberapa request. Biarkan CaptchaAI menuntaskan tantangan yang tetap lolos, jadi Anda tidak perlu mengejar rasio nol CAPTCHA.

Berapa thread CaptchaAI yang saya butuhkan untuk scraping paralel?

Samakan jumlah thread dengan konkurensi target Anda: satu CAPTCHA yang sedang diproses menempati satu thread. Paket BASIC ($15/bulan, 5 thread) cukup untuk uji coba, sedangkan ADVANCE ($90/bulan, 50 thread) atau PREMIUM ($170/bulan, 100 thread) cocok untuk pipeline paralel yang padat. Semua paket berbasis thread dengan solve tanpa batas per thread.

Apakah CaptchaAI menyelesaikan reCAPTCHA v2 dan Turnstile di alur proxy ini?

Ya. Contoh di atas memakai reCAPTCHA v2, tetapi CaptchaAI juga menyelesaikan Cloudflare Turnstile, reCAPTCHA v3, GeeTest v3, serta CAPTCHA gambar/OCR — semuanya lewat request yang sama, terlepas dari proxy yang Anda pakai.


Panduan terkait


Padukan infrastruktur proxy Oxylabs dengan penyelesaian CAPTCHA dari CaptchaAI — ambil API key Anda.

Komentar dinonaktifkan untuk artikel ini.