2008-09-12 22 views
9

Cuando llamo al socket.getsockname() en un objeto de socket, devuelve una tupla de la IP interna de la máquina y el puerto. Sin embargo, me gustaría recuperar mi IP externa. ¿Cuál es la forma más económica y eficiente de hacer esto?¿Cómo obtengo la IP externa de un socket en Python?

+0

Otro gran sitio web que ofrece una solución sin adornos es conseguir una petición HTTP de [icanhazip.com] (http://icanhazip.com) – Droogans

Respuesta

8

Esto no es posible sin la cooperación de un servidor externo, ya que podría haber cualquier número de NAT entre usted y la otra computadora. Si se trata de un protocolo personalizado, puede pedirle al otro sistema que informe a qué dirección está conectado.

5

La única forma que se me ocurre de garantizar que se lo den es presionar un servicio como http://whatismyip.com/ para obtenerlo.

+1

No estoy seguro de por qué esto fue rechazado. Esto es en mi humilde opinión la única forma de obtener la dirección IP externa de cualquier sistema. El hecho de que un enrutador le diga qué piensa que es su dirección IP, o lo que cree que es su dirección IP, no significa que no haya otra NAT en su lugar. –

+0

@MatthewSchinckel: +1 por mencionar otro NAT. Además, diferentes servicios externos pueden ver diferentes direcciones IP externas, por ejemplo, recuerdo que para acceder a un sitio de la biblioteca, tuve que usar una ruta diferente para que el sitio vea direcciones ip diferentes (permitidas), es decir, que la IP pública dependa del destino. – jfs

1

socket importación

s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)

s.connect (("msn.com", 80))

s.getsockname ()

0

Utilizando la dirección sugerida en la fuente de http://whatismyip.com

import urllib 
def get_my_ip_address(): 
    whatismyip = 'http://www.whatismyip.com/automation/n09230945.asp' 
    return urllib.urlopen(whatismyip).readlines()[0] 
+1

note que dicen que no deben hacer esto más de una vez cada 300 segundos – Claudiu

3

https://github.com/bobeirasa/mini-scripts/blob/master/externalip.py

''' 
Finds your external IP address 
''' 

import urllib 
import re 

def get_ip(): 
    group = re.compile(u'(?P<ip>\d+\.\d+\.\d+\.\d+)').search(urllib.URLopener().open('http://jsonip.com/').read()).groupdict() 
    return group['ip'] 

if __name__ == '__main__': 
    print get_ip() 
+1

No estaba al tanto de jsonip.com - gracias. Aquí hay un poco más de variación "jsonica" de su respuesta (el formateo automático está arruinando la URL): json.loads (urllib2.urlopen (urllib2.Request ('http://jsonip.com/', headers = {'Content- Escriba ':' application/json '})). Read()) [' ip '] – chacmool

1
print (urllib.urlopen('http://automation.whatismyip.com/n09230945.asp').read()) 
Cuestiones relacionadas