আমি কীভাবে নোড.জেএসএস http.Client সহ একটি http প্রক্সি ব্যবহার করতে পারি?


137

আমি স্ট্যান্ডার্ডটি ব্যবহার করে নোড.জেএস থেকে একটি বহির্গামী HTTP কল করতে চাই http.Client। তবে আমি সরাসরি আমার নেটওয়ার্ক থেকে রিমোট সার্ভারে পৌঁছতে পারি না এবং প্রক্সি দিয়ে যাওয়ার দরকার পড়ে।

আমি কীভাবে নোড.জেএসকে প্রক্সি ব্যবহার করতে বলব?


1
আমি একই সমস্যা হচ্ছে। নোড.জেএস একটি ফায়ারওয়ালের পিছনে রয়েছে এবং আমি কোনও বাহ্যিক ওয়েবসাইটে একটি HTTPClient তৈরি করতে অক্ষম।
ddallala

উত্তর:


152

টিম 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/ দিয়ে কাজ করে তবে এটি কারণ তাদের সার্ভার হোস্ট শিরোনামটি ভুল হিসাবে যত্ন করে না।


1
এইচটিপিএস প্রক্সি সংযুক্ত https পোর্টটি ব্যবহার করার কোনও উপায় আছে কি? দেখে মনে হচ্ছে কোনও সহজ পদ্ধতি নেই
Gohan

@ গোহান নীচে ক্রিসের উত্তর দেখুন এবং কিভাবে HTTP প্রক্সি মাধ্যমে কোনও https সার্ভারের সাথে সংযোগ স্থাপন করবেন তার উদাহরণের জন্য।
হেয়ারআফডডগ

আপনি যদি খারাপ অনুরোধ পান তবে পথ দিন: '/'
লরেন্ট দেব্রিকন

9
বিকল্প ব্লকে আমি কীভাবে প্রক্সি-ব্যবহারকারী এবং প্রক্সি-পাসওয়ার্ডকে সংহত করতে পারি?
টুইস্টলটন

এই কি পরিবর্তন হয়েছে? এমনকি অন্য স্থানীয় সার্ভার হিসাবে চূড়ান্ত গন্তব্য থাকা সত্ত্বেও আমি একটি পেয়েছি 404, এবং গন্তব্য সার্ভারটি কখনই অনুরোধটি গ্রহণ করে না ..
ওজেফোর্ড

53

আপনি অনুরোধটি ব্যবহার করতে পারেন , আমি কেবলমাত্র একটি বহিরাগত "প্রক্সি" পরামিতি সহ নোড.জেএস-তে প্রক্সি ব্যবহার করা অবিশ্বাস্যরকম সহজ খুঁজে পেয়েছি, এমনকি এটি আরও একটি 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);
  }
})

1
উভয়ের জন্য httpএবং httpsআমার ক্ষেত্রে পরিশ্রম করেছেন , অনেক অনেক ধন্যবাদ
স্যামুয়েল বুশি

কোনও অভ্যন্তরীণ কর্প পৃষ্ঠাগুলির জন্য এটি কেন কাজ করবে না এমন কোনও ধারণা?
কেইনবেল

1
আমি অবাক হই অভ্যন্তরীণ কর্পস পৃষ্ঠাগুলি একটি প্রক্সিের পিছনে। আপনি কি নিশ্চিত যে প্রক্সিটি অভ্যন্তরীণ পৃষ্ঠাগুলির জন্য বাইপাস করা হচ্ছে না? এটি কি অন্য ভ্যালান?
চানচ

আপনাকে কোনওভাবে প্রমাণীকরণ নির্দিষ্ট করতে হবে (আমি যদি এটি বের করি তবে এটি এখানে পোস্ট করবে)
ইগোর এল

প্রক্সি দিয়ে অনুরোধটি ব্যবহার করে আমি এই ত্রুটিটি পেয়েছি: ত্রুটি: টানেলিং সকেট স্থাপন করা যায়নি, কারণ = সংযুক্ত ECONNREFUSED 127.0.0.1:80
ফেডেরিকো

35

আপনি 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);
});

1
উপরের কোডটি আমার পক্ষে কাজ করছে না, এবং এটি github.com/joyent/node/issues/2474 ইস্যু সম্পর্কিত কোচিকের উত্তর যাচাই করতে হবে আমাদের "পদ্ধতি": "সংযুক্ত" এবং "সংযুক্ত" ইভেন্টে ব্যবহার করতে হবে, আমরা পথের তথ্য প্রেরণ করেছি ।
পালানি

16

যেমন @ রেনাট এখানে ইতিমধ্যে উল্লিখিত হয়েছে, প্রক্সিড 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
এটি আমার পক্ষে কাজ করেছিল! আসলে আপনি কোড থেকে প্রক্সিটি ডিকুয়াল করে এনটিএমের জন্য বিদ্যমান কনফিগারেশনটি ব্যবহার করেন! সেই পথেই আমি বলব
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

উদাহরণস্বরূপ, নীচে 'র' অনুরোধ বস্তু এর অনুরোধগুলি অ্যাক্সেস করতে লোকালপ্রক্সি ব্যবহার করে:

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 প্যাকেজটি আপনার কোডকে প্রক্সি এবং নন প্রক্সি ব্যবহারের (যা আমার ল্যাপটপে বেশ কার্যকর) এর মধ্যে টগল করার অনুমতি দেয়াকে সহজ করে তোলে।
জন ম্যাডিসন

5

মূলত আপনার সুস্পষ্ট প্রক্সি সহায়তার দরকার নেই। প্রক্সি প্রোটোকলটি বেশ সহজ এবং সাধারণ এইচটিটিপি প্রোটোকলের উপর ভিত্তি করে। 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 ব্যবহার করছেন
সামি

1
এটি স্পষ্টত node.js এর সাথে v5.6 হিসাবে আর কাজ করবে না কারণ তারা ক্রিয়েট ক্লিনেন্টকে সরিয়ে দিয়েছে
মার্ক

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 প্রতিস্থাপন করুন, উদাহরণস্বরূপ নিম্নলিখিতটি গুগলের সূচী পাতাটি 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_proxy সেট করার কোনও প্রভাব নেই।
এরিকল

এটি উইন্ডোজের অধীনে কাজ করা উচিত (এটি আমি ব্যবহার করছি এমন প্রাথমিক পদ্ধতি)। আপনি সেটিংস সেট করার পরে নিশ্চিত হয়ে নিন যে আপনি নিজের টার্মিনাল সেশনটি পুনরায় সেট করেছেন (যদি নিয়ন্ত্রণ প্যানেলের মাধ্যমে সেট করা থাকে এবং সেট না করা থাকে)। আপনি প্রতিধ্বনি% HTTP_PROXY% ব্যবহার করে এটি সঠিকভাবে সেট করা আছে তা পরীক্ষা করতে সক্ষম হওয়া উচিত বা আরও ভাল আপনার নোড নিজেই নোড ব্যবহার করা উচিত - "কনসোল.লগ (প্রক্রিয়া.এনভিএইচটিটিপি_প্রক্সি);" এটি আমার জন্য উইন্ডোজের অধীনে কাজ করেছিল, তাই শুভকামনা।
লুক

1

ইমস্কুলের উত্তর আমার জন্য প্রায় কাজ করেছিল, তবে আমাকে কিছু পরিবর্তন করতে হয়েছিল। একমাত্র আসল পরিবর্তন হ'ল ব্যবহারকারীর নাম, পাসওয়ার্ড এবং সেটাকে বাতিল করে দেওয়া হয়েছে যা অনুমোদিত নয় 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.');
    }
});

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

ব্যক্তিগতভাবে আমি সাইগউইন / উইন্ডোজ এনভায়রনমেন্টের যে কোনও প্রক্সিচেন সংস্করণ ইনস্টল করতে সক্ষম ছিলাম তাই এটি পরীক্ষা করতে পারিনি।

তদ্ব্যতীত, তারা সংযোগ-প্রক্সি ব্যবহার করার বিষয়ে কথা বলেছিল তবে কীভাবে এটি করা যায় সে সম্পর্কে আমি কোনও নথিপত্র পাইনি।

সংক্ষেপে, আমি এখনও আটকে আছি, তবে কেউ উপযুক্ত তথ্য খুঁজে পেতে এই তথ্য ব্যবহার করতে পারেন।


আপডেট: কিছু তদন্তের পরে আমি জানতে পেরেছিলাম যে আমি সাইগউইনটিতে প্রক্সিচেনগুলি তৈরি করতে পারছি না কারণ আরটিএলডি_নেক্সট সমর্থিত নয়।
ddallala

0

Https- এর সাথে একটি প্রক্সি ব্যবহার করার জন্য আমি এই ওয়েবসাইটে পরামর্শটি চেষ্টা করেছি (নির্ভরতা https-প্রক্সি-এজেন্ট ব্যবহার করে ) এবং এটি আমার পক্ষে কাজ করেছে:

http://codingmiles.com/node-js-making-https-request-via-proxy/


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

আপনার কাছে যদি বেসিক 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 প্রমাণীকরণ প্রকল্পটি প্রক্সিটি ব্যবহার করছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.