Pengaturan proxy Node.js, menghubungkan proxy HTTP dan SOCKS5 ke fetch dan https
Panduan ini menjelaskan cara menghubungkan HTTP proxy Socks5Proxy dengan ProxyAgent undici dan SOCKS5 proxy dengan socks-proxy-agent di Node.js 18+, serta kode untuk menerima dan merotasi daftar melalui API.
Apa yang dibutuhkan untuk menggunakan proxy di Node.js?
Fetch yang ada di Node.js beroperasi dengan library bernama undici dan secara default tidak membaca pengaturan proxy. Jadi, untuk proxy HTTP, gunakan ProxyAgent dari undici sebagai dispatcher, dan untuk proxy SOCKS5, gunakan socks-proxy-agent sebagai agen untuk modul https Node.
Contoh menggunakan IP 198.51.100.23, port HTTP 8000, port SOCKS5 1080, username spx_user, password spx_pass. Semua kode dalam format modul ES (.mjs).
npm install undici socks-proxy-agentBagaimana cara menghubungkan HTTP proxy ke fetch?
Masukkan alamat proxy ke ProxyAgent, dan nama pengguna serta kata sandi sebagai nilai autentikasi Basic di opsi token. Jika diteruskan sebagai dispatcher ke fetch dari undici, permintaan tersebut akan melalui proxy. Alamat HTTPS dikirimkan secara terenkripsi dengan metode CONNECT.
Menggunakan kembali ProxyAgent yang sama untuk banyak permintaan akan mempercepat koneksi. Buat satu agent per proxy dan gunakan bergantian.
import { fetch, ProxyAgent } from "undici";
const agent = new ProxyAgent({
uri: "http://198.51.100.23:8000",
token: "Basic " + Buffer.from("spx_user:spx_pass").toString("base64"),
});
const res = await fetch("https://api.ipify.org?format=json", { dispatcher: agent });
console.log(res.status, await res.json()); // "ip" should be the proxy IPBagaimana cara menghubungkan proxy SOCKS5?
socks-proxy-agent adalah agen yang digunakan dengan modul http dan https Node. Gunakan alamat socks5h agar resolusi nama domain dilakukan oleh proxy. Contoh berikut mengirim agen ke https.get untuk mengumpulkan dan menampilkan isi respons.
Library yang beroperasi di atas modul http seperti axios dapat menggunakan SOCKS5 dengan meneruskan agen yang sama ke httpAgent dan httpsAgent.
import https from "node:https";
import { SocksProxyAgent } from "socks-proxy-agent";
const agent = new SocksProxyAgent("socks5h://spx_user:spx_pass@198.51.100.23:1080");
https.get("https://api.ipify.org?format=json", { agent }, (res) => {
let body = "";
res.on("data", (chunk) => (body += chunk));
res.on("end", () => console.log(res.statusCode, body));
}).on("error", (err) => console.error("request failed:", err.message));Bagaimana cara mengambil dan memutar daftar melalui API?
Saat memulai, Anda bisa mendapatkan daftar melalui API dan membuat agen untuk setiap proxy, lalu menggunakan agen berikutnya untuk setiap permintaan. Kode di bawah ini mengambil daftar HTTP dalam format ip:port:user:pass dan membuat array ProxyAgent, lalu mencoba lagi dengan proxy berikutnya jika gagal.
Pastikan untuk menambahkan batas waktu dengan AbortSignal.timeout di setiap permintaan. Permintaan yang tidak merespons akan memperlambat seluruh pekerjaan.
import { fetch, ProxyAgent } from "undici";
const API = "https://socks5proxy.io/api/v1";
const KEY = "YOUR_API_KEY";
const text = await (await fetch(API + "/proxies/download?format=ip:port:user:pass&protocol=http", {
headers: { Authorization: "Bearer " + KEY },
})).text();
const agents = text.trim().split("\n").map((line) => {
const [ip, port, user, pass] = line.trim().split(":");
return new ProxyAgent({
uri: "http://" + ip + ":" + port,
token: "Basic " + Buffer.from(user + ":" + pass).toString("base64"),
});
});
let i = 0;
async function get(url, tries = 3) {
for (let t = 0; t < tries; t++) {
const dispatcher = agents[i++ % agents.length];
try {
const res = await fetch(url, { dispatcher, signal: AbortSignal.timeout(20000) });
if (res.ok) return await res.text();
} catch {
// try the next proxy
}
}
return null;
}
console.log((await get("https://example.com/"))?.length);Bagaimana kode berubah jika menggunakan IP authorization?
Jika Anda mendaftarkan IPv4 server yang menjalankan Node.js di dashboard, Anda hanya perlu memasukkan alamat tanpa opsi token di ProxyAgent. SOCKS5 juga dapat digunakan tanpa username dan password, seperti socks5h://198.51.100.23:1080. Tidak perlu menyimpan password di variabel lingkungan atau kode, sehingga lebih mudah untuk melakukan deployment ke beberapa server.
Bagaimana cara menghubungkan jika menggunakan axios?
axios beroperasi di atas modul http dan https Node, sehingga dapat menggunakan proxy dengan meneruskan agen. Untuk SOCKS5, gunakan socks-proxy-agent untuk httpAgent dan httpsAgent, dan setel opsi proxy axios ke false untuk menghindari tumpang tindih pengaturan.
HTTP proxy bisa diatur di axios melalui opsi proxy dengan host, port, auth, tetapi untuk alamat HTTPS, menggunakan agent lebih stabil. Paket https-proxy-agent memungkinkan koneksi HTTP proxy dengan struktur serupa.
import axios from "axios";
import { SocksProxyAgent } from "socks-proxy-agent";
const agent = new SocksProxyAgent("socks5h://spx_user:spx_pass@198.51.100.23:1080");
const client = axios.create({ httpAgent: agent, httpsAgent: agent, proxy: false, timeout: 20000 });
const { data } = await client.get("https://api.ipify.org?format=json");
console.log(data);Apa yang perlu diperhatikan saat mengirim banyak permintaan sekaligus?
Jika Anda memulai ribuan permintaan sekaligus dengan Promise.all, koneksi yang terlalu banyak terbuka akan membebani proxy dan situs target. Tetapkan jumlah maksimum permintaan yang diproses bersamaan dan gunakan antrian pekerjaan. Anda bisa membuat fungsi kecil sendiri atau menggunakan paket seperti p-limit.
Membagi jumlah koneksi simultan secara merata ke setiap proxy mencegah penumpukan permintaan di satu IP. Paket shared mencakup 500 koneksi simultan, jadi sesuaikan total permintaan simultan dalam batas tersebut.
Bisakah proxy diterapkan ke seluruh permintaan melalui variabel lingkungan?
EnvHttpProxyAgent dari undici membaca variabel lingkungan HTTP_PROXY, HTTPS_PROXY, dan NO_PROXY untuk menentukan proxy. Dengan setGlobalDispatcher, semua fetch dalam proses tersebut akan melalui proxy. Berguna saat banyak library menggunakan fetch secara internal.
Pengaturan global akan menggunakan IP yang sama untuk semua permintaan, sehingga lebih cocok untuk alat atau pengujian yang perlu mengakses dari satu negara daripada pekerjaan pengumpulan data yang perlu membagi IP. Jika perlu rotasi, operasikan dispatcher untuk setiap permintaan seperti yang telah dilihat sebelumnya.
// HTTPS_PROXY=http://spx_user:spx_pass@198.51.100.23:8000 node app.mjs
import { EnvHttpProxyAgent, setGlobalDispatcher, fetch } from "undici";
setGlobalDispatcher(new EnvHttpProxyAgent());
const res = await fetch("https://api.ipify.org");
console.log(await res.text());Bagaimana cara menyelesaikan masalah yang sering terjadi?
Jika dispatcher yang Anda lewatkan ke fetch bawaan Node.js tampak diabaikan, pastikan Anda juga mengimpor fetch dari paket undici. Jika versi fetch bawaan dan undici yang terinstal berbeda, agen mungkin tidak cocok, jadi cara paling pasti adalah mengambil fetch dan ProxyAgent dari paket yang sama.
Respon 407 berarti informasi autentikasi salah. Pastikan token berisi nilai base64 dari username:password setelah 'Basic'. ECONNREFUSED sering terjadi karena port salah. Gunakan port HTTP untuk agen HTTP dan port SOCKS5 untuk agen SOCKS.
- fetch dan ProxyAgent berada dalam paket undici yang sama
- 407: Periksa nilai token dan IP yang terdaftar
- ECONNREFUSED: Membedakan port HTTP dan SOCKS5
- Batas waktu untuk semua permintaan