2008-09-12 9 views
9

Wenn ich socket.getsockname() auf einem Socket-Objekt aufrufen, gibt es ein Tupel von internen IP-Adressen meiner Maschine und den Hafen. Ich möchte jedoch meine externe IP abrufen. Was ist die billigste und effizienteste Art, dies zu tun?Wie bekomme ich die externe IP eines Sockets in Python?

+0

Eine weitere große Website, die eine no frills-Lösung bietet, ist eine HTTP-Anforderung von [icanhazip.com] (http://icanhazip.com) – Droogans

Antwort

8

Dies ist nicht möglich, ohne die Zusammenarbeit von einem externen Server, denn es gibt eine beliebige Anzahl von NATs zwischen Ihnen sein könnte und den anderen Computer. Wenn es sich um ein benutzerdefiniertes Protokoll handelt, können Sie das andere System bitten, anzugeben, mit welcher Adresse es verbunden ist.

5

Der einzige Weg, ich daran denken kann, ist garantiert, es geben Ihnen einen Service wie http://whatismyip.com/ zu schlagen ist es zu bekommen.

+1

Nicht ganz sicher, warum dies überstimmt wurde zu bekommen. Dies ist IMHO die einzige Möglichkeit, die externe IP-Adresse eines Systems zu erhalten. Nur weil ein Router Ihnen sagt, was er denkt, dass Ihre IP-Adresse ist, oder was es denkt, es ist die IP-Adresse ist, bedeutet nicht, es keine andere NAT an seinem Platz ist. –

+0

@MatthewSchinckel: +1 für die Erwähnung eines anderen NAT. Außerdem können verschiedene externe Dienste verschiedene externe IPs sehen, z. B. erinnere ich mich daran, dass zum Zugriff auf eine Bibliotheks-Site ich eine andere Route verwenden musste, so dass die Site unterschiedliche (erlaubte) IP sieht, d.h. die öffentliche IP kann vom Ziel abhängen. – jfs

1

import Buchse

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

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

s.getsockname ()

0

unter Verwendung der Adresse vorgeschlagen in der Quelle der 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

Anmerkung sagen sie nicht tun dies mehr als einmal alle 300 Sekunden – 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

War nicht bewusst jsonip.com - danke. Hier ist ein wenig mehr "jsonic" Variation Ihrer Antwort (automatische Formatierung wird die URL vermasselt): json.loads (urllib2.urlopen (urllib2.Request ('http://jsonip.com/', headers = { 'Content- Geben Sie ':' application/json '})). Read()) [' ip '] – chacmool

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