10 votes

Comment obtenir l'IP externe d'une socket en Python ?

Quand j'appelle socket.getsockname() sur un objet socket, il renvoie un tuple de l'IP interne de ma machine et du port. Cependant, j'aimerais récupérer mon IP externe. Quelle est la manière la plus économique et la plus efficace de le faire ?

9voto

John Millikin Points 86775

Cela n'est pas possible sans la coopération d'un serveur externe, car il peut y avoir un nombre quelconque de NATs entre vous et l'autre ordinateur. S'il s'agit d'un protocole personnalisé, vous pouvez demander à l'autre système de signaler l'adresse à laquelle il est connecté.

6voto

Cody Brocious Points 24042

Le seul moyen auquel je pense et qui est garanti de vous le donner est de faire appel à un service tel que http://whatismyip.com/ pour l'obtenir.

5voto

Rafael Lopes Points 43

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()

3voto

Scott Points 143

Pour ce faire, vous devrez utiliser un système externe.

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)

2voto

Importation de la prise

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

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

s.getsockname()

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