Proxy SOCKS5 hoạt động ở cấp độ mạng thấp hơn proxy HTTP — chúng xử lý mọi loại lưu lượng truy cập (HTTP, HTTPS, FTP, UDP) mà không sửa đổi yêu cầu. Điều này khiến chúng khó phát hiện hơn và lý tưởng cho các trang web được bảo vệ CAPTCHA. Hướng dẫn này đề cập đến việc thiết lập SOCKS5 trên Python, Node.js và các công cụ tự động hóa trình duyệt.
SOCKS5 so với HTTP Proxy
| tính năng | Proxy HTTP/HTTPS | Proxy SOCKS5 |
|---|---|---|
| Hỗ trợ giao thức | Chỉ HTTP/HTTPS | Bất kỳ TCP/UDP nào |
| Sửa đổi tiêu đề | Có thể thêm X-Forwarded-For |
Không sửa đổi |
| Phát hiện | Dễ dàng hơn (rò rỉ tiêu đề) | Khó hơn |
| Tốc độ | Nhanh | Chậm hơn một chút |
| Xác thực | Cơ bản/Digest | Tên người dùng/password |
| Độ phân giải DNS | Phía khách hàng | Phía máy chủ (SOCKS5h) |
| Hỗ trợ WebSocket | bị giới hạn | Đầy đủ |
Cài đặt Python
yêu cầu + PySocks
pip install requests[socks] pysocks
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,
)
aiohttp + 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"))
Selen + SOCKS5
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("")
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("")
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()
Node.js + SOCKS5
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");
}
Puppeteer + TẤT5
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();
}
Chuyển proxy SOCKS5 tới CaptchaAI
CaptchaAI có thể giải CAPTCHA từ IP proxy của bạn:
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")
Khắc phục sự cố
| Vấn đề | Nguyên nhân | Cách xử lý |
|---|---|---|
| Kết nối bị từ chối | Cổng hoặc máy chủ sai | Xác minh máy chủ SOCKS5 đang chạy |
| rò rỉ DNS | Sử dụng socks5:// thay vì socks5h:// |
Sử dụng socks5h:// cho DNS từ xa |
| Xác thực không thành công | Thông tin xác thực sai | Xác minh bằng curl --socks5 |
| Kết nối chậm | Máy chủ proxy ở xa | Chọn proxy gần hơn về mặt địa lý |
| WebSocket không thành công | Máy chủ SOCKS5 không hỗ trợ UDP | Sử dụng máy chủ SOCKS5 có hỗ trợ UDP |
Câu hỏi thường gặp
Khi nào tôi nên sử dụng SOCKS5 qua proxy HTTP?
Sử dụng SOCKS5 khi bạn cần xử lý lưu lượng truy cập WebSocket (phổ biến trong CAPTCHA hiện đại), khi bạn muốn tránh rò rỉ tiêu đề proxy hoặc khi nhà cung cấp proxy của bạn chỉ cung cấp SOCKS5.
CaptchaAI có hỗ trợ SOCKS5 làm tham số proxy không?
Vâng. Chuyển proxytype=SOCKS5 và proxy=socks5:host:port:user:pass trong yêu cầu gửi của bạn.
SOCKS5 có nhanh hơn proxy HTTP không?
SOCKS5 có ít chi phí hơn một chút (không có phân tích cú pháp HTTP) nhưng sự khác biệt là không đáng kể đối với quy trình làm việc của CAPTCHA. Ưu điểm chính là tàng hình.
Hướng dẫn liên quan
- Phương thức xác thực proxy
- Ủy quyền dân cư luân phiên
- Chất lượng proxy ảnh hưởng đến tỷ lệ giải quyết
Sử dụng proxy SOCKS5 với CaptchaAI để giải CAPTCHA lén lút hơn —lấy khóa API của bạn.