2012-11-07 3 views
15

Ich frage mich, ob es eine einfache Möglichkeit gab, die öffentliche IP-Adresse eines Computers mit Ruby zu erhalten.Get public (remote) IP-Adresse

+3

Holen Sie [whatismyip] (http://www.whatismyip.com/) und analysieren Sie es. :) –

+0

Welche Informationen haben Sie in der Hand? der Domain Name?Wenn der Benutzer direkt eine Verbindung zu Ihrem Server herstellt, dann ist die Client-IP die öffentliche IP-Adresse – ShadyKiller

+0

Wohin wird der Code auf dem Computer des Endbenutzers ausgeführt? Sprechen sie schon mit einem externen Server (IE Web-Anfrage) – Doon

Antwort

26

Akamai bietet eine Seite "Was ist meine IP ist", dass Sie holen können:

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

Es gibt ein paar Alternativen, die das gleiche tun, aber:

Sie können auch die ipv4 und ipv6 Subdomains mit icanhazip.com verwenden.

Wenn Sie sich nicht von Dritten abhängig machen möchten, können Sie Ihre eigenen Apps in einer One-Line-Rack-App verwenden und diese kostenlos auf Heroku oder anderen Geräten bereitstellen. Es berücksichtigt, dass X-Forwarded-For eine durch Kommas getrennte Liste von Proxy-IP-Adressen enthalten kann und nur die Client-IP zurückgibt.

# 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

Das ist großartig, danke für den Link! – Stefan

+1

Oder "require" open-uri '; stellt offen ('http://automation.whatismyip.com/n09230945.asp'). Lesen ' –

+0

Es gibt auch: ' erfordern 'Open-Uri'; stellt offen ("http://ifconfig.me/ip") .read' – roychri

1

Ich verwende Curl:

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

Diese nicht verwendet Ruby-stdlib und erfordert obwohl curl.

3

Kein Schaben notwendig!

Ich benutze ipify, eine offene API, die Ihre öffentliche IP-Adresse zurückgibt. Nützlich, wenn Sie eine JSON-Antwort wünschen (hier nicht gezeigt).

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

Oder mit Curl:

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

nicht erregt Versteh, das ist nicht meine öffentliche IP-Adresse :)

0

ich einen Dienst wie http://www.whatsmyip.website/ programmatisch die IP erhalten verwenden würde zu . Mit etwas wie Linux curl würde automatisch nur die IP zurückgeben, aber wenn Sie eine andere Anwendung/Sprache verwenden, müssen Sie möglicherweise ihre API auschecken.

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

Ich bin auf der Suche nach dem gleichen Problem und fand großartige Lösung API basiert.

Um die öffentliche IP-Adresse zu erhalten, können wir den folgenden Code verwenden:

require "net/http" 

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

API Site URL: https://www.ipify.org/

Es ist zu spät auf, dies zu asnwer aber ich dachte, dass es für andere halpful sein kann .