13

標準の Net::HTTP ライブラリを使用して、GET 要求ごとに異なる IP アドレスを使用する方法を探しています。サーバーには 5 つの IP アドレスがあり、IP ごとの要求制限に達したときに一部の API がアクセスをブロックしていると想定しています。したがって、それを行う唯一の方法は、別のサーバーを使用することです。Rubyドキュメントでそれについて何も見つけることができません。

たとえば、curl を使用すると、(PHP で) 特定の IP アドレスにアタッチできます。

$req = curl_init($url)
curl_setopt($req, CURLOPT_INTERFACE, 'ip.address.goes.here';
$result = curl_exec($req);

Net::HTTP ライブラリでそれを行う方法はありますか? 代替として - CURB (ルビー カール バインディング)。しかし、それは私が試す最後のことです。

提案/アイデア?

PSCURBを使用したソリューション(ダーティテスト、ip`sが置き換えられています):

require 'rubygems'
require 'curb'

ip_addresses = [
  '1.1.1.1',
  '2.2.2.2',
  '3.3.3.3',
  '4.4.4.4',
  '5.5.5.5'
]

ip_addresses.each do |address|
  url = 'http://www.ip-adress.com/'
  c = Curl::Easy.new(url)
  c.interface = address
  c.perform
  ip = c.body_str.scan(/<h2>My IP address is: ([\d\.]{1,})<\/h2>/).first
  puts "for #{address} got response: #{ip}"
end
4

4 に答える 4

8

これが古いことは知っていますが、今日これが必要だったので、他の誰かがこれを役に立つと思うことを願っています. 次のことができます。

http = Net::HTTP.new(uri.host, uri.port)
http.local_host = ip
response = http.request(request)

オプションとして local_host を受け入れないため、Net::HTTP.start を使用できるとは思わないことに注意してください。

于 2014-07-22T19:26:47.683 に答える
4

TCPSocketにモンキーパッチを適用する場合、実際にこれを行う方法があります。

https://gist.github.com/800214

Curbは素晴らしいですが、Jrubyでは機能しないので、別の方法を検討してきました...

于 2011-01-28T16:31:34.233 に答える
1

Net:HTTP でできるようには見えません。ソースはこちら

http://github.com/ruby/ruby/blob/trunk/lib/net/http.rb

行 644 は、接続が開かれる場所です。

  s = timeout(@open_timeout) { TCPSocket.open(conn_address(), conn_port()) }

TCPSocket.open の 3 番目と 4 番目の引数は local_address と local_port であり、これらは指定されていないため、不可能です。縁石で行かなければならないようです。

于 2010-06-09T23:46:03.017 に答える
-2

もちろんできます。私は以下のようにしました:

# remote_host can be IP or hostname
uri     = URI.parse( "http://" + remote_host )
http    = Net::HTTP.new( uri.host, uri.port )
request = Net::HTTP::Get.new(uri.request_uri)
request.initialize_http_header( { "Host" => domain })
response = http.request( request )
于 2019-01-03T06:19:19.547 に答える