আমি স্ট্যান্ডার্ডটি ব্যবহার করে নোড.জেএস থেকে একটি বহির্গামী HTTP কল করতে চাই http.Client। তবে আমি সরাসরি আমার নেটওয়ার্ক থেকে রিমোট সার্ভারে পৌঁছতে পারি না এবং প্রক্সি দিয়ে যাওয়ার দরকার পড়ে।
আমি কীভাবে নোড.জেএসকে প্রক্সি ব্যবহার করতে বলব?
আমি স্ট্যান্ডার্ডটি ব্যবহার করে নোড.জেএস থেকে একটি বহির্গামী HTTP কল করতে চাই http.Client। তবে আমি সরাসরি আমার নেটওয়ার্ক থেকে রিমোট সার্ভারে পৌঁছতে পারি না এবং প্রক্সি দিয়ে যাওয়ার দরকার পড়ে।
আমি কীভাবে নোড.জেএসকে প্রক্সি ব্যবহার করতে বলব?
উত্তর:
টিম Macfarlane এর উত্তর একটি HTTP প্রক্সি ব্যবহার শুভেচ্ছা সঙ্গে ঘনিষ্ঠ ছিলেন।
একটি HTTP প্রক্সি ব্যবহার করা (নিরাপদ নয় অনুরোধের জন্য) খুব সহজ। আপনি প্রক্সিটির সাথে সংযোগ স্থাপন করুন এবং অনুরোধটি সাধারণত করুন তবে পথের অংশটিতে সম্পূর্ণ url অন্তর্ভুক্ত রয়েছে এবং হোস্ট শিরোনামটি যে হোস্টটিতে আপনি সংযোগ করতে চান সেটি সেট করা আছে।
টিম তার উত্তরের সাথে খুব ঘনিষ্ঠ ছিলেন তবে তিনি হোস্টের শিরোনামটি সঠিকভাবে সেট করতে পারেননি।
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 প্রক্সির মাধ্যমে এইচটিটিপিএস সমর্থন করে।
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আমার ক্ষেত্রে পরিশ্রম করেছেন , অনেক অনেক ধন্যবাদ
আপনি https সার্ভারের মাধ্যমে প্রক্সি চেষ্টা করার পরেও, প্রক্সিটি অ্যাক্সেস করতে 'http' ব্যবহার করুন এমন একটি জিনিস যা আমাকে বুঝতে সময় লাগল। এটি চার্লস (অক্স প্রোটোকল বিশ্লেষক) ব্যবহার করে আমার জন্য কাজ করে:
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);
});
যেমন @ রেনাট এখানে ইতিমধ্যে উল্লিখিত হয়েছে, প্রক্সিড 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
উদাহরণস্বরূপ, নীচে 'র' অনুরোধ বস্তু এর অনুরোধগুলি অ্যাক্সেস করতে লোকালপ্রক্সি ব্যবহার করে:
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)
}
})
দুর্ভাগ্যক্রমে কোনও "গ্লোবাল" ডিফল্ট নেই যাতে লিব ব্যবহারকারী ব্যবহারকারীরা প্রক্সিটি সংশোধন করতে পারবেন না যদি না এই লিবি এইচটি বিকল্পের মধ্য দিয়ে যায় ...
এইচটিএইচ, ক্রিস
মূলত আপনার সুস্পষ্ট প্রক্সি সহায়তার দরকার নেই। প্রক্সি প্রোটোকলটি বেশ সহজ এবং সাধারণ এইচটিটিপি প্রোটোকলের উপর ভিত্তি করে। 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 প্রতিস্থাপন করুন, উদাহরণস্বরূপ নিম্নলিখিতটি গুগলের সূচী পাতাটি 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"
ইমস্কুলের উত্তর আমার জন্য প্রায় কাজ করেছিল, তবে আমাকে কিছু পরিবর্তন করতে হয়েছিল। একমাত্র আসল পরিবর্তন হ'ল ব্যবহারকারীর নাম, পাসওয়ার্ড এবং সেটাকে বাতিল করে দেওয়া হয়েছে যা অনুমোদিত নয় to আমি মন্তব্য করতে পারিনি তাই আমি এটি একটি উত্তরে রেখেছি।
আপনি যদি কোডটি চালনা করেন তবে এই টিউটোরিয়ালটিতে হ্যাকার নিউজের বর্তমান গল্পগুলির শিরোনামগুলি পাবেন: 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
ব্যক্তিগতভাবে আমি সাইগউইন / উইন্ডোজ এনভায়রনমেন্টের যে কোনও প্রক্সিচেন সংস্করণ ইনস্টল করতে সক্ষম ছিলাম তাই এটি পরীক্ষা করতে পারিনি।
তদ্ব্যতীত, তারা সংযোগ-প্রক্সি ব্যবহার করার বিষয়ে কথা বলেছিল তবে কীভাবে এটি করা যায় সে সম্পর্কে আমি কোনও নথিপত্র পাইনি।
সংক্ষেপে, আমি এখনও আটকে আছি, তবে কেউ উপযুক্ত তথ্য খুঁজে পেতে এই তথ্য ব্যবহার করতে পারেন।
Https- এর সাথে একটি প্রক্সি ব্যবহার করার জন্য আমি এই ওয়েবসাইটে পরামর্শটি চেষ্টা করেছি (নির্ভরতা https-প্রক্সি-এজেন্ট ব্যবহার করে ) এবং এটি আমার পক্ষে কাজ করেছে:
http://codingmiles.com/node-js-making-https-request-via-proxy/
'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)=>{...});
আপনার কাছে যদি বেসিক HT প্রমাণীকরণের স্কিম থাকে তবে আপনাকে একটি বেস 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();
Nodejs আপনি ব্যবহার করতে পারে বাফার সঙ্কেতাক্ষরে লিখা
var encodedData = Buffer.from('myuser:mypassword').toString('base64');
console.log(encodedData);
যেমন উদাহরণস্বরূপ, ব্রাউজারগুলিতে আপনি btoa () ব্যবহার করে বেস 64 এ এনকোড করতে পারেন , প্রক্সি ব্যবহার করে কোনও অনুরোধ সম্পাদন না করে একটি ব্রাউজারে অ্যাজাক্স অনুরোধে কার্যকর।
var encodedData = btoa('myuser:mypassword')
console.log(encodedData);
কীভাবে উইকি স্কিম প্রক্সি সার্ভার গ্রহণ করবে?
যদি আমাদের কাছে কাস্টম ডিএনএস কনফিগার করা না থাকে (এটি ERR_NAME_NOT_RESOLVED এর মতো কিছু ফেলে দেয়), যখন আমরা একটি অনুরোধ সম্পাদন করি, প্রতিক্রিয়া শিরোনামে (কোড 407) জানাতে হবে কোনটি HTTP প্রমাণীকরণ প্রকল্পটি প্রক্সিটি ব্যবহার করছে।