161 votes

Obtenir l'adresse IP externe d'une machine avec Python

Vous cherchez un meilleur moyen d'obtenir le numéro IP externe actuel d'une machine... La méthode ci-dessous fonctionne, mais je préférerais ne pas dépendre d'un site externe pour obtenir l'information... Je suis limité à l'utilisation des bibliothèques Python 2.5.1 standard fournies avec Mac OS X 10.5.x.

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 votes

193voto

mario1ua Points 674

J'ai aimé le http://ipify.org . Ils fournissent même du code Python pour utiliser leur 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').content.decode('utf8')
print('My public IP address is: {}'.format(ip))

121voto

Serge Stroobandt Points 525

Python3, en n'utilisant rien d'autre que la bibliothèque standard

Comme mentionné précédemment, on peut utiliser un service externe comme ident.me afin de découvrir l'adresse IP externe de votre routeur.

Voici comment procéder avec python3 en n'utilisant rien d'autre que la bibliothèque standard :

import urllib.request

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

print(external_ip)

Les adresses IPv4 et IPv6 peuvent être renvoyées, en fonction de leur disponibilité et des préférences du client. https://v4.ident.me/ pour IPv4 uniquement, ou https://v6.ident.me/ pour IPv6 uniquement.

51voto

Shemhamforasch Points 153

Je préfère ce point de terminaison Amazon AWS :

import requests
ip = requests.get('https://checkip.amazonaws.com').text.strip()

0 votes

Surtout pour ceux qui utilisent le boto3 !

49voto

Sunny Milenov Points 10978

Si vous êtes derrière un routeur qui obtient l'IP externe, je crains que vous n'ayez pas d'autre choix que d'utiliser le service externe comme vous le faites. Si le routeur lui-même possède une interface de requête, vous pouvez l'utiliser, mais la solution sera très spécifique à l'environnement et peu fiable.

0 votes

Oui, d'accord. Ces serveurs cloud fournis par AWS&GoogleGCP ne fournissent que l'adresse IP interne dans leur interface locale. Nous devons utiliser l'interface externe pour demander son adresse IP publique.

42voto

Vegard Points 1156

Vous devez utiliser le Protocole UPnP pour demander cette information à votre routeur. Plus important encore, cette méthode ne dépend pas d'un service externe, ce que toutes les autres réponses à cette question semblent suggérer.

Il existe une bibliothèque Python appelée miniupnp qui peut faire cela, voir par exemple miniupnpc/testupnpigd.py .

pip install miniupnpc

En vous basant sur leur exemple, vous devriez être en mesure de faire quelque chose comme ceci :

import miniupnpc

u = miniupnpc.UPnP()
u.discoverdelay = 200
u.discover()
u.selectigd()
print('external ip address: {}'.format(u.externalipaddress()))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X