Dùng proxy HTTP, SOCKS5 trong Python, Node.js và curl (có xác thực)
Dùng proxy trong Python, Node.js và curl là nhu cầu phổ biến khi viết công cụ tự động, kiểm thử ứng dụng theo vùng, thu thập dữ liệu công khai. Bài viết đưa ra mã mẫu kết nối qua proxy HTTP và SOCKS5 có tên đăng nhập, mật khẩu, cách kiểm tra IP đầu ra và xử lý lỗi thường gặp.
Thông tin proxy cần có
Proxy SuniHost cấp dạng IP:PORT:USER:PASS, giao thức HTTP hoặc SOCKS5 (tuỳ gói đã mua). Các ví dụ dưới đây dùng:
HOST=103.x.x.x PORT=8000 USER=user123 PASS=matkhau
Nếu mật khẩu có ký tự đặc biệt như @ : / #, phải mã hoá URL (ví dụ @ thành %40) khi ghép vào chuỗi http://user:pass@host:port.
curl
# proxy HTTP
curl -x http://user123:[email protected]:8000 https://api.ipify.org
# proxy SOCKS5, phân giải tên miền qua proxy
curl --socks5-hostname 103.x.x.x:8000 -U user123:matkhau https://api.ipify.org
Kết quả in ra IP của proxy là đã kết nối đúng. --socks5-hostname (tương đương socks5h://) để proxy phân giải DNS, tránh lộ truy vấn DNS từ máy bạn.
Python (requests)
import requests
proxy = "http://user123:[email protected]:8000"
# SOCKS5: pip install "requests[socks]" rồi dùng
# proxy = "socks5h://user123:[email protected]:8000"
proxies = {"http": proxy, "https": proxy}
r = requests.get("https://api.ipify.org?format=json", proxies=proxies, timeout=15)
print(r.json())
Luôn đặt timeout: không có timeout, chương trình có thể treo mãi khi proxy không phản hồi. Dùng requests.Session() để giữ kết nối khi gửi nhiều yêu cầu.
Python bất đồng bộ (httpx)
import httpx, asyncio
async def main():
async with httpx.AsyncClient(proxy="http://user123:[email protected]:8000", timeout=15) as c:
r = await c.get("https://api.ipify.org")
print(r.text)
asyncio.run(main())
Tham số proxy= áp dụng cho httpx bản mới; bản cũ dùng proxies=. SOCKS5 cần cài thêm httpx[socks].
Node.js
npm install https-proxy-agent socks-proxy-agent
import { HttpsProxyAgent } from 'https-proxy-agent';
import { SocksProxyAgent } from 'socks-proxy-agent';
import https from 'node:https';
const agent = new HttpsProxyAgent('http://user123:[email protected]:8000');
// const agent = new SocksProxyAgent('socks5h://user123:[email protected]:8000');
https.get('https://api.ipify.org', { agent }, (res) => {
let data = '';
res.on('data', (c) => (data += c));
res.on('end', () => console.log(data));
}).on('error', console.error);
Với thư viện axios, truyền cùng agent qua httpsAgent và đặt proxy: false để axios không tự xử lý proxy.
Dùng nhiều proxy
- Đọc danh sách từ file, mỗi dòng một proxy, chia đều yêu cầu cho từng proxy.
- Proxy lỗi liên tục thì tạm loại khỏi danh sách, đừng thử lại liên tục.
- Kiểm tra cả danh sách trước khi chạy bằng công cụ kiểm tra proxy.
Lỗi thường gặp
- 407 Proxy Authentication Required: sai tên đăng nhập, mật khẩu, hoặc mật khẩu có ký tự đặc biệt chưa mã hoá URL.
- Hết thời gian chờ / từ chối kết nối: sai IP, port, sai giao thức (dùng SOCKS5 cho proxy HTTP), hoặc proxy đã hết hạn.
- Lỗi chứng chỉ SSL: không tắt kiểm tra chứng chỉ (
verify=False) để "chữa cháy"; kiểm tra lại cấu hình proxy và giờ hệ thống.
Xem thêm sự khác biệt giữa hai giao thức trong bài HTTP hay SOCKS5.
Dùng proxy có trách nhiệm
Tuân thủ điều khoản của website bạn truy cập, giới hạn tốc độ gửi yêu cầu hợp lý, không dùng proxy cho hành vi trái pháp luật hay tấn công hệ thống người khác.
Kết luận
Chỉ một tham số proxy kèm timeout là ứng dụng của bạn đi qua IP proxy. Xem các gói Proxy HTTP, SOCKS5 dân cư và datacenter; đại lý cần mua tự động có API proxy.
Bạn thấy bài viết này hữu ích?
Chia sẻ lên Facebook