2012-11-07 184 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他人。