Как мне получить внешний IP-адрес сокета в Python?

#sql-server #iis #asp.net

Вопрос:

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

Комментарии:

1. Еще один отличный веб-сайт, который предлагает решение без излишеств, — это получение HTTP-запроса от icanhazip.com

Ответ №1:

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

Ответ №2:

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

Комментарии:

1. Не совсем понимаю, почему за это проголосовали. Это ИМХО единственный способ получить внешний IP-адрес любой системы. Просто потому, что маршрутизатор сообщает вам, что он думает о вашем IP-адресе, или о том, что он думает, что это IP-адрес, не означает, что нет другого NAT.

2. @MatthewSchinckel: 1 за упоминание другого NAT. Кроме того, разные внешние службы могут видеть разные внешние IP-адреса, например, я помню, что для доступа к сайту библиотеки мне пришлось использовать другой маршрут, чтобы сайт видел другой (разрешенный) ip-адрес, т. Е. Общедоступный ip-адрес может зависеть от места назначения.

Ответ №3:

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. Не знал о jsonip.com—спасибо. Вот еще немного «json» варианта вашего ответа (автоматическое форматирование портит URL): json.loads(urllib2.urlopen(urllib2.Request(‘ jsonip.com ‘, заголовки = {‘Тип содержимого’: ‘приложение/json’})).read())[‘ip’]

2. @Рафаэль Лопес, Ссылка была перенесена на https://jsonip.com/ (301 навсегда). Кстати. для меня это работает идеально. В моем случае внешний IP-адрес в ответе указан в формате IPv6, и это нормально. Хорошенькая.

Ответ №4:

Для этого вам потребуется использовать внешнюю систему.

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=ipamp;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)
 

Ответ №5:

импорт сокета

s = гнездо.розетка(розетка.AF_INET, сокет.SOCK_STREAM)

s.подключение((«msn.com»,80))

s.getsockname()

Ответ №6:

 print (urllib.urlopen('http://automation.whatismyip.com/n09230945.asp').read())
 

Ответ №7:

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

 import urllib
def get_my_ip_address():
    whatismyip = 'http://www.whatismyip.com/automation/n09230945.asp'
    return urllib.urlopen(whatismyip).readlines()[0]
 

Комментарии:

1. обратите внимание, что они говорят, чтобы не делать этого чаще, чем раз в 300 секунд

Ответ №8:


Вам нужно подключиться к внешнему Серверу И Получить Свой Публичный IP-адрес Из Ответа


подобный этому:

    import requests

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

   print("n[ ] My Public IP: "  myPublic_IP "n")
 

Ответ №9:

Самый простой способ получить общедоступный IP-адрес-это использовать этот

 import requests

IP = requests.get('https://api.ipify.org/').text
print(f'Your IP is: {IP}')