2012-11-07 230 views
15

我想知道是否有一種簡單的方法來獲取使用Ruby的計​​算機的公共IP地址。獲取公共(遠程)IP地址

+3

取[whatismyip](http://www.whatismyip.com/)並解析它。 :) –

+0

你手頭有什麼信息?域名?如果用戶直接連接到您的服務器上,那麼客戶端ip是公共IP – ShadyKiller

+0

代碼將在最終用戶的計算機上運行?他們是否已經與外部服務器通話(IE Web請求) – Doon

回答

26

的Akamai提供了一個 「什麼是我的IP」 頁面,您可以獲取:

require 'open-uri' 
remote_ip = open('http://whatismyip.akamai.com').read 

有跡象表明,做同樣的事情了幾個備選方案,但:

您還可以使用ipv4ipv6子域與icanhazip.com

如果你不想依賴第三方,你可以在一個單線機架應用程序中推出你自己的應用程序,並在Heroku或其他任何應用程序上免費部署它。它考慮到X-Forwarded-For可能包含以逗號分隔的代理IP地址列表,並且只返回客戶端IP。

# config.ru 

run lambda { |env| 
    remote_ip = env['HTTP_X_FORWARDED_FOR'] || env['REMOTE_ADDR'] 
    remote_ip = remote_ip.scan(/[\d.]+/).first 
    [200, {'Content-Type'=>'text/plain'}, [remote_ip]] 
} 
+0

這很好,謝謝你的鏈接! – Stefan

+1

或者'要求'open-uri'; ('http://automation.whatismyip.com/n09230945.asp').read ' –

+0

還有: 'require'open-uri';打開(「http://ifconfig.me/ip」).read' – roychri

1

我用捲曲:

my_ip = `curl http://ipecho.net/plain` 

這不使用Ruby stdlib的,需要捲曲雖然。

3

不需要刮!

我使用ipify,這是一個打開的api,返回您的公共ip地址。如果你想要一個json響應(這裏沒有顯示)很有用。

require 'net/http' 
public_ip = Net::HTTP.get URI "https://api.ipify.org" 
=> "12.3.45.678" 

或用捲髮:

public_ip = `curl https://api.ipify.org` 
=> "12.3.45.678" 

別激動,那不是我的公網IP地址:)

0

我會使用一個服務,如http://www.whatsmyip.website/以編程方式獲取IP 。使用類似Linux curl的東西會自動返回IP,但如果使用不同的應用程序/語言,則可能需要檢查其API。

ip = `curl http://www.whatsmyip.website` 
0

我在找同樣的問題,並找到了很好的解決方案API基礎。

爲了讓我們可以可以使用下面的代碼的公共IP地址:

require "net/http" 

ip = Net::HTTP.get(URI("https://api.ipify.org")) 
puts "My public IP Address is: " + ip 

API網站網址:https://www.ipify.org/

這是爲時已晚asnwer就這一點,但我認爲這可能是halpful他人。