Node.js-Proxy-Einstellungen, Verbinden von HTTP- und SOCKS5-Proxys mit fetch und https
Diese Anleitung erklärt für Node.js 18+ die Verbindung von Socks5Proxy-HTTP-Proxys mit undici ProxyAgent, SOCKS5-Proxys mit socks-proxy-agent sowie das Rotieren von API-Listen.
Was benötigen Sie, um Proxys in Node.js zu verwenden?
Die in Node.js enthaltene fetch-Funktion arbeitet mit der Bibliothek undici und liest standardmäßig keine Proxy-Einstellungen. Daher verwenden Sie den ProxyAgent von undici als Dispatcher für HTTP-Proxys und socks-proxy-agent als Agent für das https-Modul von Node.js für SOCKS5-Proxys.
Beispiel mit IP 198.51.100.23, HTTP-Port 8000, SOCKS5-Port 1080, Benutzername spx_user, Passwort spx_pass. Alle Codebeispiele im ES-Modul-Format (.mjs).
npm install undici socks-proxy-agentWie verbinde ich HTTP-Proxies mit fetch?
Geben Sie die Proxy-Adresse in ProxyAgent ein und fügen Sie Benutzername und Passwort als Basic-Authentifizierungswert in die token-Option ein. Übergeben Sie den Dispatcher an die aus undici importierte fetch-Funktion, und die Anfrage wird über den Proxy gesendet. HTTPS-Adressen werden über die CONNECT-Methode verschlüsselt übertragen.
Wiederverwendung desselben ProxyAgent beschleunigt durch Verbindungspooling. Erstellen Sie pro Proxy einen Agent und rotieren Sie diese.
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 IPWie verbinde ich mich mit einem SOCKS5-Proxy?
socks-proxy-agent für Node.js http/https. socks5h lässt DNS-Auflösung über Proxy erfolgen. Beispiel zeigt https.get mit Agent für Proxy-Anfragen.
Bibliotheken, die wie axios auf dem http-Modul basieren, können SOCKS5-Anfragen senden, indem sie denselben Agent für httpAgent und httpsAgent verwenden.
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));Wie erhalte ich die Liste über die API und rotiere sie?
Beim Start holen Sie sich die Liste per API und erstellen für jeden Proxy einen Agent. Bei jeder Anfrage wird der nächste Agent verwendet. Der folgende Code lädt die HTTP-Liste im Format ip:port:user:pass, erstellt ein ProxyAgent-Array und versucht bei Fehlern den nächsten Proxy.
Setzen Sie unbedingt ein Timeout mit AbortSignal.timeout für Anfragen. Ansonsten verlangsamen nicht antwortende Anfragen den gesamten Prozess.
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);Wie ändert sich der Code, wenn Sie die IP-Autorisierung verwenden?
Wenn Sie die IPv4-Adresse des Servers, auf dem Node.js ausgeführt wird, im Dashboard registrieren, können Sie in ProxyAgent einfach die Adresse ohne Token-Option verwenden. SOCKS5 kann auch ohne Benutzername und Passwort verwendet werden, z.B. socks5h://198.51.100.23:1080. Da Sie das Passwort nicht in Umgebungsvariablen oder im Code speichern müssen, ist die Bereitstellung auf mehreren Servern einfacher.
Wie verbinde ich mich mit axios?
axios arbeitet auf den Node-Modulen http und https und ermöglicht die Nutzung von Proxies durch Übergabe eines Agents. Für SOCKS5 wird socks-proxy-agent als httpAgent und httpsAgent verwendet, während die proxy-Option von axios auf false gesetzt wird, um Konflikte zu vermeiden.
HTTP-Proxys können auch über die proxy-Option von axios mit host, port und auth verbunden werden, aber für HTTPS-Adressen ist die Agent-Methode stabiler. Mit dem https-proxy-agent-Paket können Sie HTTP-Proxys auf dieselbe Weise verbinden.
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);Worauf sollte man achten, wenn mehrere Anfragen gleichzeitig gesendet werden?
Wenn Sie mit Promise.all tausende Anfragen gleichzeitig starten, wird die Verbindung überlastet, was sowohl den Proxy als auch die Zielseite belastet. Legen Sie eine Arbeitswarteschlange fest, die die Anzahl der gleichzeitig verarbeiteten Anfragen begrenzt. Sie können dies mit einer kleinen Funktion selbst erstellen oder ein Paket wie p-limit verwenden.
Gleichmäßige Verteilung gleichzeitiger Verbindungen pro Proxy vermeidet Überlastung einzelner IPs. Shared-Pläne erlauben 500 gleichzeitige Verbindungen - halten Sie Ihre Gesamtanfragen darunter.
Können Umgebungsvariablen verwendet werden, um Proxy-Einstellungen für alle Anfragen zu übernehmen?
undici's EnvHttpProxyAgent liest HTTP_PROXY/HTTPS_PROXY/NO_PROXY. setGlobalDispatcher wendet Proxy auf alle fetch-Aufrufe an - praktisch für Bibliotheken mit fetch-Integration.
Globale Einstellungen verwenden dieselbe IP für alle Anfragen und eignen sich eher für Tools oder Tests, die aus einem Land zugreifen müssen, als für Sammlungsaufgaben, die IPs aufteilen müssen. Für Rotation übergeben Sie wie zuvor einen Dispatcher pro Anfrage.
// 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());Wie löse ich häufige Probleme?
Wenn es so aussieht, als würde der Dispatcher in der integrierten fetch-Funktion von Node.js ignoriert werden, überprüfen Sie, ob Sie fetch aus dem undici-Paket importiert haben. Wenn die Versionen der integrierten fetch-Funktion und des installierten undici-Pakets unterschiedlich sind, kann der Agent nicht korrekt arbeiten. Es ist am sichersten, fetch und ProxyAgent aus dem gleichen Paket zu importieren.
Die 407-Antwort bedeutet, dass die Authentifizierungsinformationen falsch sind. Überprüfen Sie, ob nach dem Basic-Token der Benutzername:Passwort-Wert in Base64 kodiert ist. ECONNREFUSED tritt oft auf, wenn der Port falsch ist. Verwenden Sie den HTTP-Port für HTTP-Agenten und den SOCKS5-Port für SOCKS-Agenten.
- fetch und ProxyAgent sind Teil des gleichen undici-Pakets
- 407: Token-Wert und registrierte IP überprüfen
- ECONNREFUSED: HTTP-Port und SOCKS5-Port unterscheiden
- Zeitlimit für alle Anfragen