Node.js প্রোক্সি সেটিং, HTTP এবং SOCKS5 প্রোক্সি fetch এবং https-এ সংযোগ করা
এই গাইডে Node.js 18+-এ Socks5Proxy-এর HTTP প্রোক্সি undici ProxyAgent দিয়ে, SOCKS5 প্রোক্সি socks-proxy-agent দিয়ে সংযোগ ও API থেকে তালিকা নিয়ে রোটেট করার কোড বর্ণনা করা হয়েছে।
Node.js-এ প্রোক্সি ব্যবহার করতে কী প্রয়োজন?
Node.js-এর বিল্ট-ইন fetch undici লাইব্রেরি দিয়ে কাজ করে এবং ডিফল্টভাবে প্রোক্সি সেটিং পড়ে না। তাই HTTP প্রোক্সি undici-এর ProxyAgent dispatcher হিসেবে পাস করে ব্যবহার করা হয় এবং SOCKS5 প্রোক্সি socks-proxy-agent Node-এর https মডিউলে agent হিসেবে পাস করে ব্যবহার করা হয়।
উদাহরণে IP 198.51.100.23, HTTP পোর্ট 8000, SOCKS5 পোর্ট 1080, ইউজারনেম spx_user, পাসওয়ার্ড spx_pass ব্যবহার করা হয়। সব কোড ES মডিউল ফরম্যাটে (.mjs)।
npm install undici socks-proxy-agentfetch এ HTTP প্রক্সি সংযোগ করতে হলে কিভাবে করব?
ProxyAgent-এ প্রোক্সি ঠিকানা দিন এবং ব্যবহারকারী নাম এবং পাসওয়ার্ড token অপশনে Basic অথেন্টিকেশন মান হিসেবে দিন। undici থেকে নেওয়া fetch-এ dispatcher হিসেবে পাস করলে সেই রিকোয়েস্ট প্রোক্সি দিয়ে যাবে। HTTPS ঠিকানা CONNECT পদ্ধতিতে এনক্রিপ্টেড অবস্থায় পাঠানো হয়।
একই ProxyAgent একাধিক রিকুয়েস্টে পুনরায় ব্যবহার করলে কানেকশন রিইউজ হয়ে দ্রুত হয়। প্রতিটি প্রোক্সির জন্য একটি এজেন্ট তৈরি করে ঘুরিয়ে ফিরিয়ে ব্যবহার করুন।
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 IPSOCKS5 প্রোক্সি কিভাবে কানেক্ট করবো?
socks-proxy-agent Node-এর http, https মডিউলের সাথে ব্যবহার করা একটি এজেন্ট। ঠিকানা socks5h দিলে ডোমেইন নাম রেজোলিউশন প্রোক্সি সাইডে হয়। নিচের উদাহরণে https.get-এ এজেন্ট পাস করে রেসপন্স বডি সংগ্রহ করে প্রিন্ট করা হয়েছে।
axios এর মতো http মডিউলের উপর কাজ করা লাইব্রেরিও httpAgent এবং httpsAgent এ একই এজেন্ট পাঠালে 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));API দিয়ে তালিকা নিয়ে রোটেশন করতে চাইলে কিভাবে করবো?
শুরু করার সময় API ব্যবহার করে লিস্ট নিন এবং প্রতিটি প্রোক্সির জন্য এজেন্ট তৈরি করুন, প্রতিটি অনুরোধে পরবর্তী এজেন্ট ব্যবহার করুন। নিচের কোড HTTP লিস্টকে ip:port:user:pass ফরম্যাটে নেয় এবং ProxyAgent অ্যারে তৈরি করে, ব্যর্থ হলে পরবর্তী প্রোক্সি ব্যবহার করে আবার চেষ্টা করে।
অনুরোধে অবশ্যই AbortSignal.timeout দিয়ে সময় সীমা যুক্ত করুন। রেস্পন্স না পাওয়া অনুরোধ জমে গেলে পুরো প্রক্রিয়া ধীর হয়ে যাবে।
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);IP অনুমোদন ব্যবহার করলে কোড কিভাবে পরিবর্তন হয়?
ড্যাশবোর্ডে Node.js চলছে এমন সার্ভারের IPv4 রেজিস্টার করুন, তারপর ProxyAgent-এ token অপশন বাদ দিয়ে শুধু ঠিকানা ব্যবহার করুন। SOCKS5-ও socks5h://198.51.100.23:1080 এর মতো ইউজারনেম ও পাসওয়ার্ড ছাড়াই ব্যবহার করা যায়। পাসওয়ার্ড পরিবেশ ভেরিয়েবল বা কোডে রাখার দরকার নেই, তাই একাধিক সার্ভারে ডিপ্লয় করা সহজ।
axios ব্যবহার করলে কিভাবে সংযোগ করব?
axios Node এর http, https মডিউলের উপর কাজ করে তাই এজেন্ট পাঠিয়ে প্রক্সি ব্যবহার করা যায়। SOCKS5 হল socks-proxy-agent কে httpAgent এবং httpsAgent এ পাঠানো, এবং axios এর নিজস্ব proxy অপশন false রাখা যাতে দুটি সেটিং ওভারল্যাপ না হয়।
HTTP প্রোক্সি axios-এর proxy অপশনে host, port, auth দিয়ে সংযুক্ত করা যায়, কিন্তু HTTPS ঠিকানায় এজেন্ট ব্যবহার করা বেশি স্টেবল। https-proxy-agent প্যাকেজ ব্যবহার করে HTTP প্রোক্সিও একই স্ট্রাকচারে সংযুক্ত করা যায়।
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);একই সময়ে একাধিক অনুরোধ পাঠানোর সময় কী বিবেচনা করা উচিত?
Promise.all দিয়ে হাজার হাজার রিকোয়েস্ট একসাথে শুরু করলে সংযোগ অনেক বেশি খুলে যায় এবং প্রোক্সি এবং টার্গেট সাইট উভয়ের উপর চাপ পড়ে। একসাথে প্রসেস করার সংখ্যা নির্দিষ্ট করুন এবং সেই পরিমাণে চালানোর জন্য কাজের কিউ রাখুন। ছোট ফাংশন দিয়ে নিজে তৈরি করলেও হয়, p-limit-এর মতো প্যাকেজ ব্যবহার করলেও হয়।
প্রতিটি প্রক্সিতে সমানভাবে সংযোগ ভাগ করলে একটি IP এ রিকোয়েস্ট জমা হয় না। শেয়ার্ড প্ল্যানে 500 সমকালীন সংযোগ অন্তর্ভুক্ত, তাই মোট সমকালীন রিকোয়েস্ট সেই সীমার মধ্যে রাখুন।
এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করে সমস্ত অনুরোধে প্রোক্সি প্রয়োগ করা সম্ভব?
undici-এর EnvHttpProxyAgent HTTP_PROXY, HTTPS_PROXY, NO_PROXY এনভায়রনমেন্ট ভেরিয়েবল পড়ে প্রোক্সি সেট করে। setGlobalDispatcher দিয়ে রেজিস্টার করলে সেই প্রসেসের সব fetch প্রোক্সি দিয়ে যাবে। একাধিক লাইব্রেরি অভ্যন্তরীণভাবে fetch ব্যবহার করলে একবারে প্রয়োগ করা সুবিধাজনক।
গ্লোবাল সেটিংস সব অনুরোধে একই IP ব্যবহার করবে, তাই যেখানে IP ভাগ করে স্ক্র্যাপিং করতে হয় তার চেয়ে এক দেশ থেকে অ্যাক্সেস প্রয়োজন এমন টুল বা টেস্টের জন্য উপযুক্ত। যদি রোটেশন প্রয়োজন হয়, তাহলে আগের মতো প্রতিটি অনুরোধে ডিসপ্যাচার পাস করুন।
// 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());ঘন ঘন হওয়া সমস্যার সমাধান কী?
Node.js-এর বিল্ট-ইন fetch-এ dispatcher পাস করলে তা উপেক্ষিত মনে হলে, undici প্যাকেজ থেকে fetch একসাথে নেওয়া হয়েছে কিনা তা পরীক্ষা করুন। বিল্ট-ইন fetch এবং ইনস্টল করা undici-এর ভার্সন আলাদা হলে এজেন্ট মিলবে না, তাই একই প্যাকেজ থেকে fetch এবং ProxyAgent নেওয়া পদ্ধতি সবচেয়ে নির্ভরযোগ্য।
407 রেসপন্স মানে অথেন্টিকেশন তথ্য ভুল। token মানের Basic এর পরে ব্যবহারকারী নাম:পাসওয়ার্ড base64 এ পরিবর্তিত হয়েছে কিনা চেক করুন। ECONNREFUSED সাধারণত পোর্ট ভুল হলে হয়। HTTP এজেন্টে HTTP পোর্ট এবং SOCKS এজেন্টে SOCKS5 পোর্ট ব্যবহার করুন।
- fetch এবং ProxyAgent একই undici প্যাকেজে রয়েছে
- 407: token মান এবং নিবন্ধিত IP চেক করুন
- ECONNREFUSED: HTTP পোর্ট এবং SOCKS5 পোর্ট পার্থক্য
- সমস্ত অনুরোধে সময় সীমা