मैं मानक का उपयोग करके नोड से एक निवर्तमान HTTP कॉल करना चाहता हूं http.Client
। लेकिन मैं अपने नेटवर्क से सीधे दूरस्थ सर्वर तक नहीं पहुंच सकता और प्रॉक्सी से गुजरने की जरूरत है।
मैं प्रॉक्सी का उपयोग करने के लिए नोड.जेएस को कैसे बताता हूं?
मैं मानक का उपयोग करके नोड से एक निवर्तमान HTTP कॉल करना चाहता हूं http.Client
। लेकिन मैं अपने नेटवर्क से सीधे दूरस्थ सर्वर तक नहीं पहुंच सकता और प्रॉक्सी से गुजरने की जरूरत है।
मैं प्रॉक्सी का उपयोग करने के लिए नोड.जेएस को कैसे बताता हूं?
जवाबों:
टिम 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/ के साथ काम करता है, लेकिन ऐसा इसलिए है क्योंकि उनके सर्वर को परवाह नहीं है कि होस्ट हेडर गलत है।
404
, और गंतव्य सर्वर को कभी अनुरोध नहीं मिलता है ..
आप अनुरोध का उपयोग कर सकते हैं , मैंने पाया कि नोड पर प्रॉक्सी का उपयोग करना अविश्वसनीय रूप से आसान है। बस एक बाहरी "प्रॉक्सी" पैरामीटर के साथ, और भी अधिक यह 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);
}
})
http
और https
मेरे मामले में, बहुत बहुत धन्यवाद
एक बात जो मुझे पता लगाने में थोड़ी देर लगी, वह प्रॉक्सी का उपयोग करने के लिए '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);
});
जैसा कि @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);
});
सोचा था कि मैं इस मॉड्यूल को जोड़ूंगा जो मैंने पाया: 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
पर्यावरण चर का उपयोग करेगा
मैंने निजी प्रॉक्सी सर्वर खरीदा, खरीद के बाद मुझे मिला:
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()
लगता है कि 'अनुरोध' 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 प्रोटोकॉल पर आधारित है। 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" से एक अनुरोध करते हैं।
यदि आपको अपने प्रॉक्सी प्रदाता के लिए मूल प्राधिकरण का उपयोग करने की आवश्यकता है, तो बस निम्नलिखित का उपयोग करें:
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();
नोड को 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"
इम्सकुल के जवाब ने लगभग मेरे लिए काम किया, लेकिन मुझे कुछ बदलाव करने पड़े। केवल वास्तविक परिवर्तन उपयोगकर्ता नाम, पासवर्ड और सेटिंग को गलत में जोड़ रहा है। मैं टिप्पणी नहीं कर सकता था इसलिए मैंने इसे एक उत्तर में रखा।
यदि आप कोड चलाते हैं तो यह आपको हैकर न्यूज पर वर्तमान कहानियों के शीर्षक इस ट्यूटोरियल के अनुसार मिलेगा: 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.');
}
});
मुझे लगता है कि 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
});
हो सकता है कि वह सटीक एक-लाइनर न हो जिसकी आप उम्मीद कर रहे थे, लेकिन आप http://github.com/nodejitsu/node-http-proxy पर एक नज़र डाल सकते हैं क्योंकि आप http के साथ अपने ऐप का उपयोग कैसे कर सकते हैं, इस पर कुछ प्रकाश डाला जा सकता है। क्लाइंट।
इस थ्रेड के उत्तरों के आधार पर ऐसा लगता है कि आप
प्रॉक्सी सर्वर के माध्यम से नोड.जेएस चलाने के लिए प्रॉक्साइकिन्स का उपयोग कर सकते हैं :
$ proxychains /path/to/node application.js
व्यक्तिगत रूप से मैं Cygwin / Windows वातावरण पर किसी भी समीपस्थ संस्करण को स्थापित करने में सक्षम नहीं था, इसलिए यह परीक्षण नहीं कर सका।
इसके अलावा, उन्होंने कनेक्ट-प्रॉक्सी का उपयोग करने के बारे में भी बात की, लेकिन मुझे यह कैसे करना है, इस बारे में कोई दस्तावेज नहीं मिला।
संक्षेप में, मैं अभी भी अटका हुआ हूं, लेकिन शायद कोई व्यक्ति इस जानकारी का उपयोग किसी उपयुक्त कार्य के आसपास खोजने के लिए कर सकता है।
Https के साथ प्रॉक्सी का उपयोग करने के लिए मैंने इस वेबसाइट पर सलाह की कोशिश की (निर्भरता https- प्रॉक्सी एजेंट का उपयोग करके ) और इसने मेरे लिए काम किया:
http://codingmiles.com/node-js-making-https-request-via-proxy/
यदि आपके पास मूल 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 प्रमाणीकरण योजना प्रॉक्सी का उपयोग कर रहा है।