API Tutorials

SOCKS5 Proxy + CaptchaAI: Panduan Setup dan Konfigurasi

Jawaban singkatnya: pakai skema socks5h:// (bukan socks5://) di client Anda, lalu kirim proxytype=SOCKS5 dan proxy=socks5:host:port:user:pass ke in.php supaya CaptchaAI menyelesaikan tantangan dari IP yang sama dengan request Anda. Selisih satu huruf h itulah yang memindahkan resolusi DNS ke sisi proxy. Tanpa h, nama domain diselesaikan di mesin lokal sementara koneksi TCP lewat proxy - sesi Anda jadi terlihat tidak konsisten di mata sistem verifikasi.

Urutannya: perbandingan dengan proxy HTTP, setup Python sinkron dan async, Selenium, Node.js dan Puppeteer, lalu cara meneruskan proxy ke API CaptchaAI. Semua contoh memakai staging.example.com karena alur ini seharusnya diuji lebih dulu di lingkungan yang Anda kelola sendiri.


SOCKS5 atau proxy HTTP: mana yang Anda butuhkan

SOCKS5 bekerja di lapisan jaringan yang lebih rendah daripada proxy HTTP: ia meneruskan TCP dan UDP apa adanya tanpa menulis ulang header, jadi tidak ada X-Forwarded-For atau Via yang bocor ke server tujuan. Imbalannya, SOCKS5 tidak melakukan caching dan sedikit lebih lambat pada handshake awal.

Aspek Proxy HTTP/HTTPS Proxy SOCKS5
Dukungan protokol HTTP/HTTPS saja TCP/UDP apa pun
Modifikasi header Bisa menambah X-Forwarded-For Tidak ada modifikasi
Jejak di sisi server Lebih terbaca (header bocor) Lebih bersih
Kecepatan Cepat Sedikit lebih lambat
Autentikasi Basic/Digest Username/password
Resolusi DNS Sisi client Sisi server (SOCKS5h)
Dukungan WebSocket Terbatas Penuh

Untuk alur kerja CAPTCHA, dua baris terakhir paling menentukan. Widget seperti Cloudflare Turnstile dan reCAPTCHA v2 memakai koneksi panjang dan kadang WebSocket; proxy HTTP yang setengah mendukungnya membuat widget menggantung tanpa pesan kesalahan.

Konteks lokal: tim data yang menjalankan worker di AWS ap-southeast-3 (Jakarta) kerap memakai gateway SOCKS5 milik klien untuk menjangkau lingkungan staging klien tersebut. Karena gateway itu hanya membuka SOCKS5, setiap pustaka HTTP harus dipasangi adapter SOCKS - dan di sinilah kekeliruan socks5:// versus socks5h:// muncul, terbaca sebagai "kadang jalan, kadang tidak" padahal penyebabnya deterministik.


Setup Python: requests + PySocks

Pasang adapter SOCKS untuk requests terlebih dahulu:

pip install requests[socks] pysocks

Konfigurasi berikut menyatukan definisi proxy, pengambilan halaman lewat SOCKS5, dan penyelesaian CAPTCHA yang memanggil in.php lalu polling ke res.php. Panggilan ke CaptchaAI sengaja tidak lewat proxy - API solve tidak perlu melihat IP target, dan hop tambahan hanya menambah latensi.

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,
    )

Empat langkah yang selalu sama: kirim task ke in.php - simpan task ID - polling res.php - pakai token. Setelah token diterima, kirim ke form lewat proxy yang sama; token yang dipakai dari jalur IP berbeda adalah penyebab penolakan yang paling sering terlewat saat debugging.

Pertahankan jeda polling 5 detik, jangan lebih rapat. reCAPTCHA v2 bisa memakan waktu hingga 60 detik, Cloudflare Turnstile umumnya di bawah 10 detik - polling agresif hanya menambah request tanpa mempercepat hasil.

Versi async dengan aiohttp

Kalau worker Anda sudah berbasis asyncio, aiohttp_socks menyediakan connector yang langsung menerima URL SOCKS5:

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

Connector menyimpan pool koneksi, jadi buat satu connector per identitas proxy, bukan satu per request - membuatnya di dalam loop menghabiskan file descriptor pada volume tinggi.


Selenium + SOCKS5 di Chrome

Chrome menerima SOCKS5 lewat --proxy-server, tetapi tidak menyediakan cara mengirim username dan password SOCKS5 dari baris perintah. Untuk proxy tanpa autentikasi argumen itu cukup; untuk proxy berkredensial, pakai Selenium Wire yang menangani autentikasi di lapisan pustaka.

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("--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()
    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()

Argumen --host-resolver-rules mencegah Chrome menyelesaikan nama domain secara lokal - padanan socks5h untuk browser. Tanpa itu, proxy sudah benar tetapi query DNS tetap keluar dari IP asli.


Node.js: axios dengan socks-proxy-agent

Di Node.js, pola setara memakai socks-proxy-agent sebagai agent axios. Fungsi solveCaptcha menjalankan siklus kirim-polling yang sama seperti versi Python:

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

const CAPTCHAAI_KEY = "YOUR_API_KEY";

const socksAgent = new SocksProxyAgent(
  "socks5h://proxyuser:proxypass@proxy.example.com: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");
}

Perhatikan httpsAgent dan httpAgent keduanya diisi. Melewatkan salah satunya adalah kesalahan klasik: request HTTPS akan diam-diam lewat jalur langsung tanpa satu pun peringatan.

Puppeteer dengan SOCKS5

Puppeteer meneruskan argumen yang sama ke Chromium, dan page.authenticate() menangani kredensial di level halaman:

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

Meneruskan proxy SOCKS5 ke CaptchaAI

Bagian ini membedakan integrasi yang benar dari yang sekadar jalan. CaptchaAI dapat menyelesaikan tantangan dari IP proxy Anda selama detail proxy dikirim bersama task, dengan format type:host:port:user:pass dan proxytype diisi SOCKS5:

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

Kapan ini perlu? Untuk reCAPTCHA v2 biasa di halaman publik, umumnya tidak. Tetapi begitu halaman target menilai konsistensi antara IP yang memuat widget dan IP yang menghasilkan token, ketidakcocokan jalur membuat token ditolak meski solve-nya berhasil. Kirim proxy yang sama persis dengan session Anda - bukan proxy lain dari pool itu.

Apa pun konfigurasi proxy Anda, biaya CaptchaAI dihitung per thread bersamaan, bukan per solve. BASIC ($15/bulan, 5 thread) dan STANDARD ($30/bulan, 15 thread) cukup untuk satu-dua worker; ADVANCE ($90/bulan, 50 thread) masuk akal saat banyak session berjalan paralel di beberapa jalur proxy. Jumlah proxy tidak memengaruhi tagihan - yang dihitung adalah jumlah tantangan yang diproses bersamaan.


Diagnosis masalah SOCKS5 yang sering muncul

Gejala Penyebab Perbaikan
Connection refused Port atau host salah Pastikan server SOCKS5 berjalan dan port terbuka
DNS keluar dari IP asli Memakai socks5:// bukan socks5h:// Ganti ke socks5h:// agar DNS diselesaikan proxy
Autentikasi gagal Kredensial salah atau server hanya SOCKS4 Uji cepat dengan curl --socks5
Koneksi lambat Server proxy jauh secara geografis Pilih exit yang lebih dekat, misalnya Singapura untuk trafik regional
WebSocket gagal Server SOCKS5 tidak mendukung UDP Pakai server SOCKS5 dengan dukungan UDP
Token ditolak setelah solve IP pengirim form berbeda dengan IP saat solve Kirim parameter proxy ke in.php dan pakai jalur yang sama

Urutan debugging yang hemat waktu: verifikasi proxy dengan curl --socks5-hostname dulu, baru jalankan skrip. Kalau curl gagal, percuma membaca ulang kode Python.


Pertanyaan umum

Apa bedanya socks5 dan socks5h di URL proxy?

socks5 menyelesaikan nama domain di mesin Anda lalu mengirim alamat IP ke proxy; socks5h mengirim nama domainnya sehingga proxy yang menyelesaikan DNS. Untuk otomatisasi, pakai socks5h agar tidak ada query DNS yang keluar dari koneksi Anda sendiri.

Apakah request ke CaptchaAI juga harus lewat proxy?

Tidak perlu. Panggilan ke in.php dan res.php adalah lalu lintas API biasa; melewatkannya ke proxy hanya menambah latensi. Yang perlu memakai proxy adalah request ke halaman target dan pengiriman form dengan token.

Berapa lama waktu penyelesaian jika saya memakai proxy?

Tidak berubah - Cloudflare Turnstile umumnya di bawah 10 detik dan reCAPTCHA v2 di bawah 60 detik, dengan tingkat keberhasilan tinggi pada tipe yang didukung. Yang bertambah hanya latensi menuju exit proxy Anda.

Bisakah satu skrip memakai beberapa proxy SOCKS5 sekaligus?

Bisa. Buat satu session atau connector per proxy, simpan pemetaan session ke proxy, lalu kirim proxy yang sesuai ke in.php untuk setiap task. Jangan berbagi satu cookie jar di antara beberapa jalur keluar.

Apakah SOCKS5 lebih cepat dibanding proxy HTTP?

Overhead-nya sedikit lebih rendah karena tidak ada parsing HTTP, tetapi untuk alur kerja CAPTCHA selisihnya tidak terasa. Keunggulan sebenarnya ada pada dukungan protokol yang luas dan header yang tidak diubah.


Bacaan lanjutan


Siapkan gateway SOCKS5 Anda, lalu ambil API key CaptchaAI dan jalankan solve pertama dari jalur yang sama.

Komentar dinonaktifkan untuk artikel ini.