मैं नोड.जेएस http.Client के साथ http प्रॉक्सी का उपयोग कैसे कर सकता हूं?


137

मैं मानक का उपयोग करके नोड से एक निवर्तमान HTTP कॉल करना चाहता हूं http.Client। लेकिन मैं अपने नेटवर्क से सीधे दूरस्थ सर्वर तक नहीं पहुंच सकता और प्रॉक्सी से गुजरने की जरूरत है।

मैं प्रॉक्सी का उपयोग करने के लिए नोड.जेएस को कैसे बताता हूं?


1
मैं एक ही मुद्दा रहा हूँ। Node.js एक फ़ायरवॉल के पीछे है और मैं एक बाहरी वेबसाइट पर HTTPClient बनाने में असमर्थ हूँ।
ddallala

जवाबों:


152

टिम Macfarlane का जवाब एक HTTP प्रॉक्सी का उपयोग करने के संबंध में था।

HTTP प्रॉक्सी (गैर सुरक्षित अनुरोधों के लिए) का उपयोग करना बहुत सरल है। आप प्रॉक्सी से कनेक्ट करते हैं और सामान्य रूप से अनुरोध करते हैं सिवाय इसके कि पथ भाग में पूर्ण यूआरएल शामिल है और होस्ट हेडर उस होस्ट पर सेट है जिसे आप कनेक्ट करना चाहते हैं।
टिम अपने जवाब के साथ बहुत करीब थे लेकिन वह मेजबान हेडर को ठीक से सेट करने से चूक गए।

var http = require("http");

var options = {
  host: "proxy",
  port: 8080,
  path: "http://www.google.com",
  headers: {
    Host: "www.google.com"
  }
};
http.get(options, function(res) {
  console.log(res);
  res.pipe(process.stdout);
});

रिकॉर्ड के लिए उसका जवाब http://nodejs.org/ के साथ काम करता है, लेकिन ऐसा इसलिए है क्योंकि उनके सर्वर को परवाह नहीं है कि होस्ट हेडर गलत है।


1
क्या http प्रॉक्सी कनेक्ट https पोर्ट का उपयोग करने का कोई तरीका है? लगता है कि कोई आसान तरीका नहीं है
गोहान

@Gohan एक https सर्वर से और http प्रॉक्सी से कैसे कनेक्ट करें, इस पर उदाहरण के लिए नीचे क्रिस का जवाब देखें।
HairOfTheDog

यदि आपको बुरा अनुरोध मिलता है, तो रास्ता डालें: '/'
लॉरेंट डेब्रीकॉन

9
मैं विकल्प ब्लॉक में प्रॉक्सी-उपयोगकर्ता और प्रॉक्सी-पासवर्ड को कैसे एकीकृत कर सकता हूं?
ट्विस्टलटन

क्या यह बदल गया है? यहां तक ​​कि एक अन्य स्थानीय सर्वर के रूप में अंतिम गंतव्य के साथ, मुझे एक मिलता है 404, और गंतव्य सर्वर को कभी अनुरोध नहीं मिलता है ..
OJFord

53

आप अनुरोध का उपयोग कर सकते हैं , मैंने पाया कि नोड पर प्रॉक्सी का उपयोग करना अविश्वसनीय रूप से आसान है। बस एक बाहरी "प्रॉक्सी" पैरामीटर के साथ, और भी अधिक यह HTTP प्रॉक्सी के माध्यम से HTTPS का समर्थन करता है।

var request = require('request');

request({
  'url':'https://anysite.you.want/sub/sub',
  'method': "GET",
  'proxy':'http://yourproxy:8087'
},function (error, response, body) {
  if (!error && response.statusCode == 200) {
    console.log(body);
  }
})

1
दोनों के लिए काम किया httpऔर httpsमेरे मामले में, बहुत बहुत धन्यवाद
शमूएल बुशी

किसी भी विचार क्यों यह आंतरिक कॉर्प पृष्ठों के लिए काम नहीं करेगा?
कीनाबेल

1
मुझे आश्चर्य है कि आंतरिक कॉर्प पृष्ठ एक प्रॉक्सी के पीछे हैं। क्या आप सुनिश्चित हैं कि प्रॉक्सी को आंतरिक पृष्ठों के लिए बाईपास नहीं किया जा रहा है? क्या यह एक अलग वलान पर है?
चेंचुओ

यू को किसी भी तरह प्रमाणीकरण निर्दिष्ट करने की आवश्यकता है (यदि मैं इसे
इगोर एल।

मुझे प्रॉक्सी के साथ अनुरोध का उपयोग करके यह त्रुटि मिली: त्रुटि: टनलिंग सॉकेट स्थापित नहीं किया जा सका, कारण = कनेक्ट ECONNREFUSED 127.0.0.1.180
फेडेरिको कैसिया

35

एक बात जो मुझे पता लगाने में थोड़ी देर लगी, वह प्रॉक्सी का उपयोग करने के लिए 'http' का उपयोग करें, भले ही आप किसी https सर्वर से प्रॉक्सी करने का प्रयास कर रहे हों। यह चार्ल्स (osx प्रोटोकॉल विश्लेषक) का उपयोग करके मेरे लिए काम करता है:

var http = require('http');

http.get ({
    host: '127.0.0.1',
    port: 8888,
    path: 'https://www.google.com/accounts/OAuthGetRequestToken'
}, function (response) {
    console.log (response);
});

1
उपरोक्त कोड मेरे लिए काम नहीं कर रहा है, और इसके संबंधित github.com/joyent/node/issues/2474 जारी करें koichik के उत्तर की जाँच करें कि हमें "विधि" का उपयोग करना है: "कनेक्ट" और "कनेक्ट" इवेंट पर, हमें जानकारी भेजनी होगी ।
पलानी

16

जैसा कि @Renat यहाँ पहले ही उल्लेख किया गया है, अनुमानित HTTP ट्रैफ़िक बहुत सामान्य HTTP अनुरोधों में आता है। पथ के रूप में गंतव्य के पूर्ण URL को पारित करते हुए, प्रॉक्सी के खिलाफ अनुरोध करें ।

var http = require ('http');

http.get ({
    host: 'my.proxy.com',
    port: 8080,
    path: 'http://nodejs.org/'
}, function (response) {
    console.log (response);
});

2
यह काम करने के लिए लगता है, हालांकि फिडलर इसे एक प्रोटोकॉल उल्लंघन कहते हैं जो यह बताता है कि यह उचित HTTP अनुरोध नहीं है-थ्रू प्रॉक्सी ...
मार्क

11

सोचा था कि मैं इस मॉड्यूल को जोड़ूंगा जो मैंने पाया: https://www.npmjs.org/package/global-tunnel , जिन्होंने मेरे लिए बहुत अच्छा काम किया (मेरे सभी कोड के साथ तुरंत काम किया और केवल नीचे दिए गए कोड के साथ तीसरे पक्ष के मॉड्यूल)।

require('global-tunnel').initialize({
  host: '10.0.0.10',
  port: 8080
});

एक बार ऐसा करें, और आपके आवेदन में सभी http (और https) प्रॉक्सी के माध्यम से जाता है।

वैकल्पिक रूप से, बुला रहा है

require('global-tunnel').initialize();

http_proxyपर्यावरण चर का उपयोग करेगा


2
यह मेरे लिए काम किया! वास्तव में इस तरह से आप कोड से प्रॉक्सी को कम कर देते हैं और npm के लिए मौजूदा कॉन्फ़िगरेशन का उपयोग करते हैं! यही कारण है कि मैं जाने के लिए रास्ता है
cesaregb

@ नीलबसु हाँ यह करता है
प्रमुख-

9

मैंने निजी प्रॉक्सी सर्वर खरीदा, खरीद के बाद मुझे मिला:

255.255.255.255 // IP address of proxy server
99999 // port of proxy server
username // authentication username of proxy server
password // authentication password of proxy server

और मैं इसका इस्तेमाल करना चाहता था। पहला उत्तर और दूसरा उत्तर केवल http (प्रॉक्सी) -> http (गंतव्य) के लिए काम करता था, हालाँकि मैं http (प्रॉक्सी) -> https (गंतव्य) चाहता था।

और https गंतव्य के लिए सीधे HTTP सुरंग का उपयोग करना बेहतर होगा । मुझे यहाँ समाधान मिला । अंतिम कोड:

const http = require('http')
const https = require('https')
const username = 'username'
const password = 'password'
const auth = 'Basic ' + Buffer.from(username + ':' + password).toString('base64')

http.request({
  host: '255.255.255.255', // IP address of proxy server
  port: 99999, // port of proxy server
  method: 'CONNECT',
  path: 'kinopoisk.ru:443', // some destination, add 443 port for https!
  headers: {
    'Proxy-Authorization': auth
  },
}).on('connect', (res, socket) => {
  if (res.statusCode === 200) { // connected to proxy server
    https.get({
      host: 'www.kinopoisk.ru',
      socket: socket,    // using a tunnel
      agent: false,      // cannot use a default agent
      path: '/your/url'  // specify path to get from server
    }, (res) => {
      let chunks = []
      res.on('data', chunk => chunks.push(chunk))
      res.on('end', () => {
        console.log('DONE', Buffer.concat(chunks).toString('utf8'))
      })
    })
  }
}).on('error', (err) => {
  console.error('error', err)
}).end()

7

लगता है कि 'अनुरोध' http पैकेज में यह सुविधा है:

https://github.com/mikeal/request

उदाहरण के लिए, 'r' अनुरोध ऑब्जेक्ट नीचे स्थानीय अनुरोध का उपयोग करने के लिए स्थानीयकृत का उपयोग करता है:

var r = request.defaults({'proxy':'http://localproxy.com'})

http.createServer(function (req, resp) {
  if (req.url === '/doodle.png') {
    r.get('http://google.com/doodle.png').pipe(resp)
  }
})

दुर्भाग्य से कोई "वैश्विक" चूक नहीं है, ताकि इसका उपयोग करने वाले उन उपयोगकर्ताओं के लिए प्रॉक्सी में संशोधन न हो सके जब तक कि http विकल्प के माध्यम से lib पास न हो जाए ...

एचटीएच, क्रिस


अनुरोध http पैकेज आपके कोड को प्रॉक्सी और गैर प्रॉक्सी उपयोग (जो मेरे लैपटॉप पर काफी उपयोगी है) के बीच टॉगल करने की अनुमति देना आसान बनाता है।
जॉन मैडिसन

5

मूल रूप से आपको एक स्पष्ट प्रॉक्सी समर्थन की आवश्यकता नहीं है। प्रॉक्सी प्रोटोकॉल बहुत सरल है और सामान्य HTTP प्रोटोकॉल पर आधारित है। HTTPClient के साथ कनेक्ट होने पर आपको बस अपने प्रॉक्सी होस्ट और पोर्ट का उपयोग करना होगा। उदाहरण (नोड से। डॉक्स):

var http = require('http');
var google = http.createClient(3128, 'your.proxy.host');
var request = google.request('GET', '/',
  {'host': 'www.google.com'});
request.end();
...

इसलिए मूल रूप से आप अपने प्रॉक्सी से जुड़ते हैं लेकिन "http://www.google.com" से एक अनुरोध करते हैं।


3
http.createClient पदावनत है, टिम मैकफर्लेन नए http.get का उपयोग कर रहा है
sami

1
यह जाहिरा तौर पर v5.6 के रूप में नोड के साथ काम नहीं करेगा । क्योंकि उन्होंने createClient को हटा दिया है ।
मार्क

5

यदि आपको अपने प्रॉक्सी प्रदाता के लिए मूल प्राधिकरण का उपयोग करने की आवश्यकता है, तो बस निम्नलिखित का उपयोग करें:

var http = require("http");

var options = {
    host:       FarmerAdapter.PROXY_HOST,
    port:       FarmerAdapter.PROXY_PORT,
    path:       requestedUrl,
    headers:    {
        'Proxy-Authorization':  'Basic ' + new Buffer(FarmerAdapter.PROXY_USER + ':' + FarmerAdapter.PROXY_PASS).toString('base64')
    }
};

var request = http.request(options, function(response) {
    var chunks = [];
    response.on('data', function(chunk) {
        chunks.push(chunk);
    });
    response.on('end', function() {
        console.log('Response', Buffer.concat(chunks).toString());
    });
});

request.on('error', function(error) {
    console.log(error.message);
});

request.end();

1
मुझे "FarmerAdapter" कहां मिल सकता है?
एलेक्स

3

नोड को http_proxy पर्यावरण चर का उपयोग करके समर्थन करना चाहिए - इसलिए यह क्रॉस प्लेटफॉर्म है और प्रति-एप्लिकेशन कॉन्फ़िगरेशन की आवश्यकता के बजाय सिस्टम सेटिंग्स पर काम करता है।

दिए गए समाधानों का उपयोग करते हुए, मैं निम्नलिखित की सिफारिश करूंगा:

Coffeescript

get_url = (url, response) ->
  if process.env.http_proxy?
    match = process.env.http_proxy.match /^(http:\/\/)?([^:\/]+)(:([0-9]+))?/i
    if match
      http.get { host: match[2], port: (if match[4]? then match[4] else 80), path: url }, response
      return
  http.get url, response

जावास्क्रिप्ट

get_url = function(url, response) {
  var match;
  if (process.env.http_proxy != null) {
    match = process.env.http_proxy.match(/^(http:\/\/)?([^:\/]+)(:([0-9]+))?/i);
    if (match) {
      http.get({
        host: match[2],
        port: (match[4] != null ? match[4] : 80),
        path: url
      }, response);
      return;
    }
  }
  return http.get(url, response);
};

उपयोग विधि का उपयोग करने के लिए, प्रभावी रूप से सिर्फ http.get को बदलें, उदाहरण के लिए निम्नलिखित Google के सूचकांक पृष्ठ को test.htm: नामक फ़ाइल में लिखते हैं।

file = fs.createWriteStream path.resolve(__dirname, "test.htm")
get_url "http://www.google.com.au/", (response) ->
  response.pipe file
  response.on "end", ->
    console.log "complete"

Windows पर Node चलाते समय http_proxy सेट करने से कोई प्रभाव नहीं पड़ता है।
एरिकलाव

यह विंडोज के तहत काम करना चाहिए (वह प्राथमिक प्रणाली है जिसका मैं उपयोग कर रहा हूं)। यह सुनिश्चित करने के बाद कि आप सेटिंग सेट कर चुके हैं, जिसे आपने अपना टर्मिनल सत्र रीसेट कर दिया है (यदि नियंत्रण कक्ष के माध्यम से सेट किया गया है और सेट नहीं किया गया है)। आपको यह जांचने में सक्षम होना चाहिए कि यह इको% HTTP_PROXY% का उपयोग करके सही ढंग से सेट किया गया है या इससे भी बेहतर है कि आपको नोड नोड का उपयोग करना चाहिए -e "कंसोल.लॉग (process.env.http_proxy);" यह मेरे लिए विंडोज़ के तहत काम करता है, इसलिए शुभकामनाएँ।
ल्यूक

1

इम्सकुल के जवाब ने लगभग मेरे लिए काम किया, लेकिन मुझे कुछ बदलाव करने पड़े। केवल वास्तविक परिवर्तन उपयोगकर्ता नाम, पासवर्ड और सेटिंग को गलत में जोड़ रहा है। मैं टिप्पणी नहीं कर सकता था इसलिए मैंने इसे एक उत्तर में रखा।

यदि आप कोड चलाते हैं तो यह आपको हैकर न्यूज पर वर्तमान कहानियों के शीर्षक इस ट्यूटोरियल के अनुसार मिलेगा: http://smalljs.org/package-managers/npm/

var cheerio = require('cheerio');
var request = require('request');

request({
    'url': 'https://news.ycombinator.com/',
    'proxy': 'http://Username:Password@YourProxy:Port/',
    'rejectUnauthorized': false
}, function(error, response, body) {
    if (!error && response.statusCode == 200) {
        if (response.body) {
            var $ = cheerio.load(response.body);
            $('td.title a').each(function() {
                console.log($(this).text());
            });
       }
    } else {
        console.log('Error or status not equal 200.');
    }
});

1

मुझे लगता है कि 2019 तक उत्तरों का एक बेहतर विकल्प है। हम global-tunnel-ngप्रॉक्सी को आरंभ करने के लिए पैकेज का उपयोग कर सकते हैं और हर जगह httpया httpsआधारित कोड को प्रदूषित नहीं कर सकते हैं । तो पहले global-tunnel-ngपैकेज स्थापित करें :

npm install global-tunnel-ng

यदि आवश्यक हो तो प्रॉक्सी को शुरू करने के लिए अपने कार्यान्वयन को बदलें:

const globalTunnel = require('global-tunnel-ng');

globalTunnel.initialize({
  host: 'proxy.host.name.or.ip',
  port: 8080
});

0

हो सकता है कि वह सटीक एक-लाइनर न हो जिसकी आप उम्मीद कर रहे थे, लेकिन आप http://github.com/nodejitsu/node-http-proxy पर एक नज़र डाल सकते हैं क्योंकि आप http के साथ अपने ऐप का उपयोग कैसे कर सकते हैं, इस पर कुछ प्रकाश डाला जा सकता है। क्लाइंट।


1
यह कैसे सहायक है?
जेरिनवा

0

http://groups.google.com/group/nodejs/browse_thread/thread/d5aadbcaa00c3f7/12ebf01d7ec415c3?lnk=gst&q=proxy#12ebf01d7ec415c3

इस थ्रेड के उत्तरों के आधार पर ऐसा लगता है कि आप प्रॉक्सी सर्वर के माध्यम से नोड.जेएस चलाने के लिए प्रॉक्साइकिन्स का उपयोग कर सकते हैं :
$ proxychains /path/to/node application.js

व्यक्तिगत रूप से मैं Cygwin / Windows वातावरण पर किसी भी समीपस्थ संस्करण को स्थापित करने में सक्षम नहीं था, इसलिए यह परीक्षण नहीं कर सका।

इसके अलावा, उन्होंने कनेक्ट-प्रॉक्सी का उपयोग करने के बारे में भी बात की, लेकिन मुझे यह कैसे करना है, इस बारे में कोई दस्तावेज नहीं मिला।

संक्षेप में, मैं अभी भी अटका हुआ हूं, लेकिन शायद कोई व्यक्ति इस जानकारी का उपयोग किसी उपयुक्त कार्य के आसपास खोजने के लिए कर सकता है।


अद्यतन: कुछ जांच के बाद पता चला कि मैं CygWin पर समीपस्थ नहीं बना सकता क्योंकि RTLD_NEXT समर्थित नहीं है।
ddallala


0

इस तरह 'https-प्रॉक्सी-एजेंट' का उपयोग करें

var HttpsProxyAgent = require('https-proxy-agent');
var proxy = process.env.https_proxy || 'other proxy address';
var agent = new HttpsProxyAgent(proxy);

options = {
    //...
    agent : agent
}

https.get(options, (res)=>{...});

0

यदि आपके पास मूल http प्रमाणीकरण योजना है, तो आपको बेस 64 स्ट्रिंग करना होगा myuser:mypassword, और फिर शुरुआत में "बेसिक" जोड़ना होगा। यह प्रॉक्सी-प्राधिकार शीर्षक का मान है , यहाँ एक उदाहरण है:

var Http = require('http');

var req = Http.request({
    host: 'myproxy.com.zx',
    port: 8080,
    headers:{"Proxy-Authorization": "Basic bXl1c2VyOm15cGFzc3dvcmQ="},
    method: 'GET',
    path: 'http://www.google.com/'
    }, function (res) {
        res.on('data', function (data) {
        console.log(data.toString());
    });
});

req.end();

नोडज में आप बफर को एनकोड करने के लिए इस्तेमाल कर सकते हैं

var encodedData = Buffer.from('myuser:mypassword').toString('base64');

console.log(encodedData);

उदाहरण के रूप में, ब्राउज़र में आप btoa () का उपयोग करके बेस 64 में सांकेतिक शब्दों में बदलना कर सकते हैं , प्रॉक्सी सेटिंग्स के बिना एक ब्राउज़र में ajax अनुरोधों में उपयोगी प्रॉक्सी का उपयोग करके एक अनुरोध का प्रदर्शन कर सकते हैं।

var encodedData = btoa('myuser:mypassword')

console.log(encodedData);

विच स्कीम को प्रॉक्सी सर्वर कैसे स्वीकार करता है?

यदि हमारे पास कोई कस्टम DNS कॉन्फ़िगर नहीं है (जो कि ERR_NAME_NOT_RESOLVED जैसी कोई चीज़ फेंक देगा), जब हम एक अनुरोध करते हैं, तो प्रतिक्रिया (कोड 407) को प्रतिक्रिया हेडर में सूचित करना चाहिए जो http प्रमाणीकरण योजना प्रॉक्सी का उपयोग कर रहा है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.