Comment obtenir l’IP externe d’un socket en Python ?
Question
Quand j'appelle socket.getsockname()
sur un objet socket, il renvoie un tuple de l'adresse IP interne de ma machine et du port.Cependant, je souhaite récupérer mon IP externe.Quelle est la manière la moins chère et la plus efficace de procéder ?
La solution
Cela n'est pas possible sans la coopération d'un serveur externe, car il peut y avoir n'importe quel nombre de NAT entre vous et l'autre ordinateur.S'il s'agit d'un protocole personnalisé, vous pouvez demander à l'autre système d'indiquer à quelle adresse il est connecté.
Autres conseils
La seule façon à laquelle je peux penser d'être sûr de vous le donner est d'accéder à un service comme http://whatismyip.com/ pour l'obtenir.
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()
prise d'importation
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("msn.com",80))
s.getsockname()
print (urllib.urlopen('http://automation.whatismyip.com/n09230945.asp').read())
Vous devrez utiliser un système externe pour ce faire.
La réponse IP de DuckDuckGo vous donnera exactement ce que vous voulez, et en JSON !
import requests
def detect_public_ip():
try:
# Use a get request for api.duckduckgo.com
raw = requests.get('https://api.duckduckgo.com/?q=ip&format=json')
# load the request as json, look for Answer.
# split on spaces, find the 5th index ( as it starts at 0 ), which is the IP address
answer = raw.json()["Answer"].split()[4]
# if there are any connection issues, error out
except Exception as e:
return 'Error: {0}'.format(e)
# otherwise, return answer
else:
return answer
public_ip = detect_public_ip()
print(public_ip)
En utilisant l'adresse suggérée dans la source 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]
Vous devez vous connecter à un serveur externe et obtenir votre adresse IP publique à partir de la réponse
comme ça:
import requests
myPublic_IP = requests.get("http://wtfismyip.com/text").text.strip()
print("\n[+] My Public IP: "+ myPublic_IP+"\n")