2008-09-12 9 views
9

Bir soket nesnesinde socket.getsockname() numaralı telefonu aradığımda, makinemin dahili IP'sinin ve bağlantı noktasının bir kopyasını döndürür. Ancak harici IP'mi geri almak istiyorum. Bunu yapmanın en ucuz, en verimli şekli nedir?Python'da bir soketin harici IP'sini nasıl alabilirim?

+0

bir fırfırlar çözüm sunar diğer büyük web[icanhazip.com] dan bir HTTP isteği elde etmektir (http://icanhazip.com) – Droogans

cevap

8

Bu, harici bir sunucudan işbirliği olmadan mümkün değildir, çünkü siz ve diğer bilgisayar arasında herhangi bir sayıda NAT olabilir. Özel bir protokolse, diğer sistemin bağlı olduğu adresi bildirmesini isteyebilirsiniz.

5

Bunu size vermeyi garanti etmenin tek yolu, http://whatismyip.com/ gibi bir hizmete ulaşmaktır.

+1

bu aşağı seçildi Tam olarak emin değil. Bu IMHO, herhangi bir sistemin harici IP adresini almanın tek yoludur. Bir yönlendiricinin IP adresinizin ne olduğunu veya IP adresi olduğunu düşündüğü şeyin başka bir NAT olmadığı anlamına gelmediğini söylemesidir. –

+0

@MatthewSchinckel: Başka bir NAT'tan bahsetmek için +1. Aynı zamanda, farklı dış servisler farklı harici IP'leri görebilir, örneğin bir kütüphane sitesine erişmenin farklı bir yol kullanması gerektiğini hatırlıyorum, böylece site farklı (izin verilen) ip görür, yani genel ip hedefe bağlı olabilir. – jfs

1

içe soket

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

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

s.getsockname (adresinin kullanılması)

0

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

notu bunu her 300 saniyede bir kez yapmamak için söylediler – Claudiu

3

0 kaynağında önerdi

''' 
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

jsonip.com'un farkında değildim - teşekkürler. İşte cevabınızın biraz daha "jsonic" varyasyonu (otomatik biçimlendirme URL'yi karıştırıyor): json.loads (urllib2.urlopen (urllib2.Request ('http://jsonip.com/', headers = {'Content- ':' Application/json '})) yazın. Read()) [' ip '] – chacmool

1
print (urllib.urlopen('http://automation.whatismyip.com/n09230945.asp').read()) 
İlgili konular