Node.js proxy setup, pagkonekta ng HTTP at SOCKS5 proxy sa fetch at https
Ang gabay na ito ay nagpapaliwanag kung paano ikonekta ang HTTP proxy ng Socks5Proxy gamit ang undici ProxyAgent at SOCKS5 proxy gamit ang socks-proxy-agent sa Node.js 18 pataas, kasama ang code para i-rotate ang listahan gamit ang API.
Ano ang kailangan para gumamit ng proxy sa Node.js?
Ang fetch sa Node.js ay gumagana gamit ang undici library, at hindi nito binabasa ang proxy settings by default. Kaya para sa HTTP proxy, gamitin ang ProxyAgent ng undici bilang dispatcher, at para sa SOCKS5 proxy, gamitin ang socks-proxy-agent bilang agent sa https module ng Node.
Ginagamit ang IP 198.51.100.23, HTTP port 8000, SOCKS5 port 1080, username spx_user, password spx_pass. Lahat ng code ay ES module format (.mjs).
npm install undici socks-proxy-agentPaano ikonekta ang HTTP proxy sa fetch?
Ilagay ang proxy address sa ProxyAgent, at ang username at password sa token option bilang Basic auth value. Kapag ipinasa mo ito bilang dispatcher sa fetch mula sa undici, dadaan sa proxy ang request na iyon. Ang HTTPS addresses ay ipapasa nang naka-encrypt gamit ang CONNECT method.
Kapag ginamit muli ang parehong ProxyAgent sa multiple request, mas mabilis dahil sa connection reuse. Gumawa ng isang agent per proxy at gamitin nang paikot.
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 IPPaano kumonekta sa SOCKS5 proxy?
Ang socks-proxy-agent ay isang agent na ginagamit kasama ng http at https module ng Node. Kapag ginamit ang socks5h address, ang domain name resolution ay ginagawa ng proxy. Ang halimbawa sa ibaba ay nagpapasa ng agent sa https.get at nagtitipon at nagpi-print ng response body.
Para sa mga library na gumagana sa ibabaw ng http module tulad ng axios, ilagay ang parehong agent sa httpAgent at httpsAgent para makapagpadala ng request sa SOCKS5.
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));Paano kumuha ng list gamit ang API at i-rotate?
Kapag nagsimula, kunin ang listahan gamit ang API at gumawa ng ahente para sa bawat proxy, gamitin ang susunod na ahente sa bawat kahilingan. Ang code sa ibaba ay kumukuha ng HTTP listahan sa format na ip:port:user:pass, gumagawa ng ProxyAgent array, at susubok ulit sa susunod na proxy kapag nag-fail.
Siguraduhing may timeout sa bawat request gamit ang AbortSignal.timeout. Ang mga non-responsive request ay nagpapabagal sa buong operation.
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);Paano nagbabago ang code kapag gumagamit ng IP authorization?
Kapag nairehistro mo ang IPv4 ng server na nagpapatakbo ng Node.js sa dashboard, maaari mong gamitin ang ProxyAgent nang walang token option, ilagay lang ang address. Maaari ring gamitin ang SOCKS5 nang walang username at password tulad ng socks5h://198.51.100.23:1080. Hindi mo kailangang ilagay ang password sa environment variable o code, kaya mas madaling i-deploy sa maraming server.
Paano kumonekta kung gumagamit ng axios?
Ang axios ay gumagana sa ibabaw ng http at https modules ng Node, kaya maaari mong ipasa ang agent para magamit ang proxy. Para sa SOCKS5, gamitin ang socks-proxy-agent sa httpAgent at httpsAgent, at i-set ang proxy option ng axios sa false para hindi mag-overlap ang settings.
Ang HTTP proxy ay maaari ding gamitin sa pamamagitan ng paglalagay ng host, port, auth sa proxy option ng axios, ngunit mas stable ang paggamit ng agent para sa HTTPS address. Gamitin ang https-proxy-agent package para makonekta ang HTTP proxy sa parehong istruktura.
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);Ano ang dapat tandaan kapag nagse-send ng multiple requests nang sabay?
Kung magsisimula ka ng libo-libong request nang sabay-sabay gamit ang Promise.all, masyadong maraming connection ang mabubuksan na magdudulot ng load sa proxy at target site. Mag-set ng concurrency limit at gumamit ng task queue para kontrolin ang bilang ng parallel requests. Pwede kang gumawa ng simpleng function o gumamit ng package tulad ng p-limit.
I-distribute ang concurrent connections evenly sa mga proxy para hindi mag-overload ang isang IP. Ang shared plan ay may 500 concurrent connections, kaya dapat pasok ang total requests dito.
Pwede bang mag-apply ng proxy sa lahat ng requests gamit ang environment variables?
Ang EnvHttpProxyAgent ng undici ay nagbabasa ng HTTP_PROXY, HTTPS_PROXY, at NO_PROXY environment variable para magtakda ng proxy. Kapag nirehistro gamit ang setGlobalDispatcher, lahat ng fetch sa proseso na iyon ay dadaan sa proxy. Kapaki-pakinabang ito kapag maraming library ang gumagamit ng fetch sa loob nito dahil maaari itong ma-apply nang sabay-sabay.
Ang global settings ay gagamit ng parehong IP para sa lahat ng request, kaya mas bagay ito para sa tools o testing na kailangang mag-access mula sa isang bansa kaysa sa scraping na kailangang hatiin ang IP. Kung kailangan ng rotation, gamitin ang dispatcher per request tulad ng nakita mo kanina.
// 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());Paano malulutas ang mga common issues?
Kung parang hindi gumagana ang dispatcher na ipinasa mo sa built-in fetch ng Node.js, siguraduhing kinuha mo ang fetch mula sa undici package. Kung magkaiba ang version ng built-in fetch at installed undici, maaaring hindi mag-match ang agent, kaya ang pinakasiguradong paraan ay kunin ang parehong fetch at ProxyAgent mula sa iisang package.
407 response ay nangangahulugang mali ang authentication details. Siguraduhing tama ang base64 encoded na 'username:password' sa likod ng 'Basic' sa token value. ECONNREFUSED ay kadalasang dahil sa maling port. Gamitin ang HTTP port para sa HTTP agent at SOCKS5 port para sa SOCKS agent.
- Ang fetch at ProxyAgent ay nasa iisang undici package.
- 407: Tignan ang token value at rehistradong IP
- ECONNREFUSED: Pagkakaiba ng HTTP port at SOCKS5 port
- Time limit sa lahat ng request