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
- Cara kerja autentikasi proxy dan format kredensialnya
- Rotasi egress jaringan yang diotorisasi untuk beban kerja besar
- Pengaruh kualitas proxy terhadap tingkat keberhasilan solve
Siapkan gateway SOCKS5 Anda, lalu ambil API key CaptchaAI dan jalankan solve pertama dari jalur yang sama.