2010-02-22 9 views
31

Cercare un modo migliore per ottenere un IP esterno corrente di macchine ... Di seguito funziona, ma preferirei non affidarsi a un sito esterno per raccogliere le informazioni ... Sono limitato a utilizzando standard di Python 2.5.1 librerie in bundle con Mac OS X 10.5.xOttenere l'indirizzo IP esterno di una macchina con Python

import os 
import urllib2 

def check_in(): 

    fqn = os.uname()[1] 
    ext_ip = urllib2.urlopen('http://whatismyip.org').read() 
    print ("Asset: %s " % fqn, "Checking in from IP#: %s " % ext_ip) 
+0

correlati: [Alla scoperta IP pubblico programatically] (http://stackoverflow.com/q/613471/4279) – jfs

risposta

19

Se si è dietro un router che ottiene l'IP esterno, temo che non abbia altra opzione che utilizzare il servizio esterno come si fa. Se il router stesso ha un'interfaccia di query, è possibile utilizzarlo, ma la soluzione sarà molto specifica per l'ambiente e inaffidabile.

1

Se la macchina è in corso un firewall, allora la soluzione è molto sensibile uno: l'alternativa di essere in grado di interrogare il firewall che finisce-up essere molto dipendenti dal tipo di firewall (se possibile).

6

Se pensate che la fonte esterna sia troppo inaffidabile, potreste raggruppare alcuni servizi diversi. Per la maggior parte delle pagine di ricerca IP che richiedono di raschiare html, ma alcuni di loro che hanno creato pagine magre per gli script come la vostra - anche in modo che possano ridurre i colpi sui loro siti:

+1

Il collegamento di automazione è stato utile mentre è durato, grazie – Anake

+12

Questo potrebbe essere l'ideale: http://icanhazip.com/ –

0

Come Soleggiato ha suggerito, la sua non è possibile, in generale, per ottenere indirizzo IP esterno di essere all'interno di una rete senza alcun aiuto da servizi esterni. Dai un'occhiata al seguente tutorial che copre esattamente la stessa cosa. Immagino che funzioni per Python 2.5.X. http://codetempo.com/programming/python/monitoring-ip-addresses-of-your-computer-start-up-script-on-linux-ubuntu

Dice che il tutorial è per Linux ma funziona anche per altre piattaforme con python.

0
ipWebCode = urllib.request.urlopen("http://ip.nefsc.noaa.gov").read().decode("utf8") 
ipWebCode=ipWebCode.split("color=red> ") 
ipWebCode = ipWebCode[1] 
ipWebCode = ipWebCode.split("</font>") 
externalIp = ipWebCode[0] 

questo è uno snippet breve che avevo scritto per un altro programma. Il trucco era trovare un sito web abbastanza semplice in modo che la dissezione dell'html non fosse un dolore.

2

Ho provato la maggior parte delle altre risposte su questa domanda qui e sono venuto a scoprire che la maggior parte dei servizi utilizzati erano defunti tranne uno.

Ecco uno script che dovrebbe fare il trucco e scaricare solo una minima quantità di informazioni:

#!/usr/bin/env python 

import urllib 
import re 

def get_external_ip(): 
    site = urllib.urlopen("http://checkip.dyndns.org/").read() 
    grab = re.findall('([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)', site) 
    address = grab[0] 
    return address 

if __name__ == '__main__': 
    print(get_external_ip()) 
+0

Regex è rotto. Dovrebbe essere \ d {1,3}. –

0

Ecco un altro script alternativa.

def track_ip(): 
    """ 
    Returns Dict with the following keys: 
    - ip 
    - latlong 
    - country 
    - city 
    - user-agent 
    """ 

    conn = httplib.HTTPConnection("www.trackip.net") 
    conn.request("GET", "/ip?json") 
    resp = conn.getresponse() 
    print resp.status, resp.reason 

    if resp.status == 200: 
     ip = json.loads(resp.read()) 
    else: 
     print 'Connection Error: %s' % resp.reason 

    conn.close() 
    return ip 

EDIT: Non dimenticare di importare httplib e JSON

+0

Questa risposta funzionava per me, ma i pacchetti si interrompono quando si aggiorna usando conda, quindi ho abbandonato questa risposta per una soluzione più semplice @Hors Sujet in http://stackoverflow.com/questions/24508730/finding-network-external -ip-addresses-using-python – nagordon

38

ho scritto un modulo per questo: ipgetter. È progettato per recuperare il tuo indirizzo IP esterno da internet. È usato principalmente quando dietro un NAT. Seleziona il tuo IP in modo casuale da una lista server per minimizzare il sovraccarico della richiesta su un singolo server. In realtà con 44 server e funzione di test per verificare se i server stanno restituendo lo stesso IP.

https://github.com/phoemur/ipgetter

va in questo modo:

>>> import ipgetter 
>>> IP = ipgetter.myip() 
>>> print(IP) 
'xxx.xxx.xxx.xxx' 

>>> ipgetter.IPgetter().test() 
Number of servers: 44 
IP's : 
'xxx.xxx.xxx.xxx' = 44 ocurrencies 
+0

Funziona alla grande! Python 2 e 3 compatibili. –

+0

Bel modulo! Grazie uomo! – pinogun

1
In [1]: import stun 

stun.get_ip_info() 
('Restric NAT', 'xx.xx.xx.xx', 55320) 
0

Se sei solo scrivere per se stessi e non per un'applicazione generalizzata, si potrebbe essere in grado di trovare l'indirizzo nella pagina di configurazione per il router e quindi raschiare dal html di quella pagina. Questo ha funzionato bene per me con il mio router SMC. Una lettura e una semplice ricerca RE e l'ho trovata.

Il mio particolare interesse nel fare ciò è stato farmi sapere il mio indirizzo IP di casa quando ero lontano da casa, così ho potuto tornare via VNC. Poche righe in più di Python memorizzano l'indirizzo in Dropbox per l'accesso esterno e mi inviano anche email se vedono una modifica. Ho programmato che succedesse al boot e una volta ogni ora successiva.

1

Il più semplice (non python) lavora soluzione che posso pensare è

wget -q -O- icanhazip.com 

mi piacerebbe aggiungere un brevissimo soluzione python3 che fa uso delle API JSON di http://hostip.info.

from urllib.request import urlopen 
import json 
url = 'http://api.hostip.info/get_json.php' 
info = json.loads(urlopen(url).read().decode('utf-8')) 
print(info['ip']) 

Ovviamente si può aggiungere un po 'di controllo degli errori, una condizione di timeout e un po' di praticità:

#!/usr/bin/env python3 
from urllib.request import urlopen 
from urllib.error import URLError 
import json 

try: 
    url = 'http://api.hostip.info/get_json.php' 
    info = json.loads(urlopen(url, timeout = 15).read().decode('utf-8')) 
    print(info['ip']) 
except URLError as e: 
    print(e.reason, end=' ') # e.g. 'timed out' 
    print('(are you connected to the internet?)') 
except KeyboardInterrupt: 
    pass 
1

A mio parere la soluzione più semplice è

f = requests.request('GET', 'http://myip.dnsomatic.com') 
    ip = f.text 

Questo è tutto.

+0

Probabilmente è importante menzionare che è necessario "importare le richieste". Vedi https://pypi.python.org/pypi/requests – John

+0

Non risponde tecnicamente alla domanda poiché "[Richieste] (https://pypi.python.org/pypi/requests) supporta ufficialmente Python 2.6-2.7 e 3.3- 3.7 e funziona alla grande su PyPy. " Tuttavia, è ancora utile per gli altri. – Jerod

0

Usa questo script:

import urllib, json 

data = json.loads(urllib.urlopen("http://ip.jsontest.com/").read()) 
print data["ip"] 

Senza JSON:

import urllib, re 

data = re.search('"([0-9.]*)"', urllib.urlopen("http://ip.jsontest.com/").read()).group(1) 
print data 
17

Mi è piaciuto il http://ipify.org. Forniscono anche il codice Python per l'utilizzo della loro API.

# This example requires the requests library be installed. You can learn more 
# about the Requests library here: http://docs.python-requests.org/en/latest/ 

from requests import get 

ip = get('https://api.ipify.org').text 
print 'My public IP address is:', ip 
3

È necessario utilizzare UPnP protocol per richiedere al router queste informazioni. Soprattutto, questo non si basa su un servizio esterno, che tutte le altre risposte a questa domanda sembrano suggerire.

C'è una libreria Python chiamata miniupnp che può fare ciò, vedere ad es. https://github.com/miniupnp/miniupnp/blob/master/miniupnpc/testupnpigd.py#L52. Sulla base della loro esempio si dovrebbe essere in grado di fare qualcosa del genere:

import miniupnpc 

u = miniupnpc.UPnP() 
u.discoverdelay = 200; 
u.discover() 
u.selectigd() 
print 'external ip address:', u.externalipaddress() 
8

python3, utilizzando nient'altro che la libreria standard

Come accennato prima, non si può andare in giro con un external service di alcune specie, al fine di per scoprire l'indirizzo IP esterno del router.

Ecco come si è fatto con python3, utilizzando nient'altro che the standard library:

import urllib.request 

external_ip = urllib.request.urlopen('https://ident.me').read().decode('utf8') 

print(external_ip) 
2
import requests 
import re 


def getMyExtIp(): 
    try: 
     res = requests.get("http://whatismyip.org") 
     myIp = re.compile('(\d{1,3}\.){3}\d{1,3}').search(res.text).group() 
     if myIp != "": 
      return myIp 
    except: 
     pass 
    return "n/a" 
+0

Accidenti questo è un po 'più veloce di usare semplicemente BeautifulSoup, grazie –

Problemi correlati