2012-11-07 11 views
15

Mi chiedevo se esistesse un modo semplice per ottenere l'indirizzo IP pubblico di un computer che utilizza Ruby.Ottieni l'indirizzo IP pubblico (remoto)

+3

Recupera [whatismyip] (http://www.whatismyip.com/) e analizzalo. :) –

+0

quali informazioni hai in mano? il nome di dominio?Se l'utente si collega direttamente al tuo server, allora l'IP del client è l'IP pubblico – ShadyKiller

+0

Dove verrà eseguito il codice sul computer dell'utente finale? stanno già parlando con un server esterno (richiesta web IE) – Doon

risposta

26

Akamai fornisce una "Qual è il mio IP" pagina che è possibile recuperare:

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

Ci sono alcune alternative che fanno la stessa cosa, però:

È anche possibile utilizzare i ipv4 e ipv6 sottodomini con icanhazip.com.

Se non si vuole dipendere da una terza parte, si può rotolare il vostro proprio in un rack applicazione di una riga e distribuire questo gratuitamente su Heroku o qualsiasi altra cosa. Tiene conto che X-Forwarded-For può contenere un elenco separato da virgole di indirizzi IP proxy e restituisce solo l'IP del client.

# 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

È grandioso, grazie per il link! – Stefan

+1

Oppure 'require 'open-uri'; puts open ('http://automation.whatismyip.com/n09230945.asp') .read ' –

+0

C'è anche: ' require 'open-uri'; puts open ("http://ifconfig.me/ip") .read' – roychri

1

Io uso ricciolo:

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

Questo non usa Rubino stdlib e richiede ricciolo però.

3

Nessun graffio necessario!

Io uso ipify, un'API aperta che restituisce il tuo indirizzo IP pubblico. Utile se vuoi una risposta JSON (non mostrata qui).

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

oppure con l'arricciatura:

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

Non ti agitare, che non è il mio indirizzo IP pubblico :)

0

userei un servizio come http://www.whatsmyip.website/ da ottenere programatically l'IP . L'utilizzo di qualcosa come Linux curl restituirà automaticamente solo l'IP, ma se usi una lingua/applicazione diversa potresti dover controllare la loro API.

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

Sto cercando lo stesso problema e ho trovato un'ottima soluzione basata su API.

per ottenere l'indirizzo IP pubblico possiamo in grado di utilizzare il codice qui sotto:

require "net/http" 

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

Url API del sito: https://www.ipify.org/

E 'troppo tardi per asnwer su questo, ma ho pensato che potrebbe essere halpful per gli altri .

Problemi correlati