Как получить внешний IP-адрес сокета в Python?
Вопрос
Когда я звоню socket.getsockname()
для объекта сокета он возвращает кортеж внутреннего IP-адреса и порта моей машины.Однако я хотел бы получить свой внешний IP-адрес.Какой самый дешевый и эффективный способ сделать это?
Решение
Это невозможно без сотрудничества с внешним сервером, поскольку между вами и другим компьютером может быть любое количество NAT.Если это собственный протокол, вы можете попросить другую систему сообщить, к какому адресу она подключена.
Другие советы
Единственный способ, который я могу придумать, чтобы гарантировать вам это, - это воспользоваться службой типа http://whatismyip.com/ чтобы получить это.
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()
импорт сокета
s = сокет.сокет(сокет.AF_INET, сокет.SOCK_STREAM)
s.connect(("msn.com",80))
s.getsockname()
print (urllib.urlopen('http://automation.whatismyip.com/n09230945.asp').read())
Для этого вам нужно будет использовать внешнюю систему.
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)
Используя адрес, предложенный в источнике http://whatismyip.com
import urllib
def get_my_ip_address():
whatismyip = 'http://www.whatismyip.com/automation/n09230945.asp'
return urllib.urlopen(whatismyip).readlines()[0]
Вам необходимо подключиться к внешнему серверу и получить свой публичный IP-адрес из ответа.
так:
import requests
myPublic_IP = requests.get("http://wtfismyip.com/text").text.strip()
print("\n[+] My Public IP: "+ myPublic_IP+"\n")