Socks5Proxy

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 को डिस्पैचर के रूप में पास करके और SOCKS5 प्रॉक्सी को socks-proxy-agent को Node के https मॉड्यूल में एजेंट के रूप में पास करके उपयोग किया जाता है।

उदाहरण में IP 198.51.100.23, HTTP पोर्ट 8000, SOCKS5 पोर्ट 1080, यूजरनेम spx_user, पासवर्ड spx_pass का उपयोग किया गया है। सभी कोड ES मॉड्यूल फॉर्मेट (.mjs) में हैं।

npm install undici socks-proxy-agent

fetch में HTTP प्रॉक्सी कैसे कनेक्ट करें?

ProxyAgent में प्रॉक्सी पता डालें, और उपयोगकर्ता नाम और पासवर्ड को token विकल्प में Basic प्रमाणीकरण मान के रूप में डालें। undici से लाए गए fetch में डिस्पैचर के रूप में पास करने पर वह अनुरोध प्रॉक्सी के माध्यम से जाता है। 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 IP

SOCKS5 प्रॉक्सी से कैसे कनेक्ट करें?

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 में टोकन विकल्प हटाकर केवल पता डालें। 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 जैसे पैकेज का उपयोग किया जा सकता है।

प्रॉक्सी के बीच समवर्ती कनेक्शन समान रूप से वितरित करें। साझा प्लान में 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 में डिस्पैचर पास करने पर यदि इसे अनदेखा किया जाता है, तो undici पैकेज से fetch को साथ में लाने की जांच करें। अंतर्निहित fetch और इंस्टॉल किए गए undici के संस्करण अलग होने पर एजेंट मेल नहीं खा सकता है, इसलिए एक ही पैकेज से fetch और ProxyAgent लाने का तरीका सबसे विश्वसनीय है।

407 प्रतिक्रिया का अर्थ है कि प्रमाणीकरण जानकारी गलत है। टोकन मान में Basic के बाद यूजरनेम:पासवर्ड को base64 में बदलकर डाला गया है या नहीं जांचें। ECONNREFUSED आमतौर पर पोर्ट गलत होने के कारण होता है। HTTP एजेंट में HTTP पोर्ट डालें, और SOCKS एजेंट में SOCKS5 पोर्ट डालें।

  • fetch और ProxyAgent एक ही undici पैकेज से हैं
  • 407: टोकन मान और पंजीकृत IP जांचें
  • ECONNREFUSED: HTTP पोर्ट और SOCKS5 पोर्ट के बीच अंतर
  • सभी अनुरोधों में समय सीमा
Node.js प्रॉक्सी सेटिंग, undici·SOCKS5 एजेंट कनेक्शन | Socks5Proxy