Как мне получить внешний IP сокета в Python? - PullRequest
9 голосов
/ 12 сентября 2008

Когда я вызываю socket.getsockname() для объекта сокета, он возвращает кортеж внутреннего IP-адреса моей машины и порта. Тем не менее, я хотел бы получить свой внешний IP. Какой самый дешевый и эффективный способ сделать это?

Ответы [ 8 ]

8 голосов
/ 12 сентября 2008

Это невозможно без взаимодействия с внешним сервером, поскольку между вами и другим компьютером может быть любое количество NAT. Если это собственный протокол, вы можете попросить другую систему сообщить, к какому адресу она подключена.

5 голосов
/ 12 сентября 2008

Единственный способ, которым я могу придумать, что дать вам это, - это воспользоваться услугой типа http://whatismyip.com/, чтобы получить ее.

3 голосов
/ 29 ноября 2011

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()
1 голос
/ 08 апреля 2018

Для этого вам понадобится внешняя система.

Ответ IP от DuckDuckGo даст вам именно то, что вы хотите, и в формате 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)
1 голос
/ 13 января 2012
1 голос
/ 02 ноября 2008

гнездо для импорта

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

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

s.getsockname ()

0 голосов
/ 04 января 2019

Вам необходимо установить соединение с внешним сервером и получить ваш публичный IP-адрес из ответа


как это :

   import requests

   myPublic_IP = requests.get("http://wtfismyip.com/text").text.strip()

   print("\n[+] My Public IP: "+ myPublic_IP+"\n")
0 голосов
/ 15 апреля 2010

Используя адрес, предложенный в источнике http://whatismyip.com

import urllib
def get_my_ip_address():
    whatismyip = 'http://www.whatismyip.com/automation/n09230945.asp'
    return urllib.urlopen(whatismyip).readlines()[0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...