Получение внешнего IP-адреса устройства с помощью Python
Ищете лучший способ получить текущие внешние IP-адреса компьютеров... Ниже работает, но скорее не будет полагаться на внешний сайт для сбора информации... Я ограничен использованием стандартных библиотек Python 2.5.1 в комплекте с Mac OS X 10.5.x
import os
import urllib2
def check_in():
fqn = os.uname()[1]
ext_ip = urllib2.urlopen('http://whatismyip.org').read()
print ("Asset: %s " % fqn, "Checking in from IP#: %s " % ext_ip)
Ответы
Ответ 1
Если вы находитесь за маршрутизатором, который получает внешний IP-адрес, я боюсь, что у вас нет другого выбора, кроме как использовать внешний сервис, как вы. Если у маршрутизатора есть некоторый интерфейс запроса, вы можете его использовать, но решение будет очень специфичным для среды и ненадежным.
Ответ 2
Мне понравился http://ipify.org. Они даже предоставляют код Python для использования своего API.
# This example requires the requests library be installed. You can learn more
# about the Requests library here: http://docs.python-requests.org/en/latest/
from requests import get
ip = get('https://api.ipify.org').text
print 'My public IP address is:', ip
Ответ 3
Я написал для этого модуль: ipgetter.
Предназначен для получения внешнего IP-адреса из Интернета. Он используется, главным образом, за NAT. Он выбирает ваш IP случайным образом из списка серверов, чтобы минимизировать накладные расходы на одном сервере.
На самом деле с 44 сервером и тестовой функцией, чтобы проверить, вернули ли серверы тот же IP-адрес.
https://github.com/phoemur/ipgetter
выглядит следующим образом:
>>> import ipgetter
>>> IP = ipgetter.myip()
>>> print(IP)
'xxx.xxx.xxx.xxx'
>>> ipgetter.IPgetter().test()
Number of servers: 44
IP :
'xxx.xxx.xxx.xxx' = 44 ocurrencies
Ответ 4
Python3, использующий только стандартную библиотеку
Как упоминалось ранее, можно использовать внешний сервис, такой как https://ident.me, чтобы обнаружить внешний IP-адрес вашего маршрутизатора.
Вот как это делается с python3
, не используя ничего, кроме стандартной библиотеки:
import urllib.request
external_ip = urllib.request.urlopen('https://ident.me').read().decode('utf8')
print(external_ip)
Ответ 5
Вы должны использовать протокол UPnP, чтобы запросить у вашей роутера эту информацию. Самое главное, что это не зависит от внешней службы, которая, как представляется, предлагает все другие ответы на этот вопрос.
Есть библиотека Python с именем miniupnp, которая может это сделать, см., Например, miniupnpc/testupnpigd.py.
pip install miniupnpc
Основываясь на их примере, вы сможете сделать что-то вроде этого:
import miniupnpc
u = miniupnpc.UPnP()
u.discoverdelay = 200
u.discover()
u.selectigd()
print('external ip address: {}'.format(u.externalipaddress()))
Ответ 6
Если вы считаете, что внешний источник слишком ненадежный, вы можете объединить несколько разных сервисов. Для большинства страниц поиска ip они требуют, чтобы вы очищали html, но некоторые из них создавали скудные страницы для таких скриптов, как ваши, - поэтому они могут уменьшить количество просмотров на своих сайтах:
Ответ 7
На мой взгляд, самым простым решением является
f = requests.request('GET', 'http://myip.dnsomatic.com')
ip = f.text
Вот и все.
Ответ 8
Я попробовал большинство других ответов на этот вопрос здесь и пришел к выводу, что большинство используемых услуг были несуществующими, кроме одного.
Вот script, который должен сделать трюк и загрузить только минимальный объем информации:
#!/usr/bin/env python
import urllib
import re
def get_external_ip():
site = urllib.urlopen("http://checkip.dyndns.org/").read()
grab = re.findall('([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)', site)
address = grab[0]
return address
if __name__ == '__main__':
print( get_external_ip() )
Ответ 9
import requests
import re
def getMyExtIp():
try:
res = requests.get("http://whatismyip.org")
myIp = re.compile('(\d{1,3}\.){3}\d{1,3}').search(res.text).group()
if myIp != "":
return myIp
except:
pass
return "n/a"
Ответ 10
Есть несколько других способов, которые не полагаются на проверку Python внешнего веб-сайта, однако ОС может. Ваша основная проблема здесь заключается в том, что даже если вы не использовали Python, если вы использовали командную строку, не существует "встроенных" команд, которые могут просто сообщить вам внешний (WAN) IP. Такие команды, как "ip addr show" и "ifconfig -a", показывают IP-адрес сервера в сети. Только маршрутизатор фактически держит внешний IP. Однако есть способы найти внешний IP-адрес (WAN IP) из командной строки.
Эти примеры:
http://ipecho.net/plain ; echo
curl ipinfo.io/ip
dig +short myip.opendns.com @resolver1.opendns.com
dig TXT +short o-o.myaddr.l.google.com @ns1.google.com
Следовательно, код Python будет:
import os
ip = os.popen('wget -qO- http://ipecho.net/plain ; echo').readlines(-1)[0].strip()
print ip
ИЛИ ЖЕ
import os
iN, out, err = os.popen3('curl ipinfo.io/ip')
iN.close() ; err.close()
ip = out.read().strip()
print ip
ИЛИ ЖЕ
import os
ip = os.popen('dig +short myip.opendns.com @resolver1.opendns.com').readlines(-1)[0].strip()
print ip
Или подключите любой другой из приведенных выше примеров к такой команде, как os.popen, os.popen2, os.popen3 или os.system.
Ответ 11
Если машина является брандмауэром, то ваше решение очень разумно: альтернатива может запрашивать брандмауэр, который в конечном итоге сильно зависит от типа брандмауэра (если это вообще возможно).
Ответ 12
In [1]: import stun
stun.get_ip_info()
('Restric NAT', 'xx.xx.xx.xx', 55320)
Ответ 13
Самое простое (не python) рабочее решение, о котором я могу думать, -
wget -q -O- icanhazip.com
Я хотел бы добавить очень короткое решение Python3, которое использует API JSON http://hostip.info.
from urllib.request import urlopen
import json
url = 'http://api.hostip.info/get_json.php'
info = json.loads(urlopen(url).read().decode('utf-8'))
print(info['ip'])
Вы можете, конечно, добавить некоторую проверку ошибок, условие ожидания и некоторое удобство:
#!/usr/bin/env python3
from urllib.request import urlopen
from urllib.error import URLError
import json
try:
url = 'http://api.hostip.info/get_json.php'
info = json.loads(urlopen(url, timeout = 15).read().decode('utf-8'))
print(info['ip'])
except URLError as e:
print(e.reason, end=' ') # e.g. 'timed out'
print('(are you connected to the internet?)')
except KeyboardInterrupt:
pass
Ответ 14
Работа с Python 2.7.6 и 2.7.13
import urllib2
req = urllib2.Request('http://icanhazip.com', data=None)
response = urllib2.urlopen(req, timeout=5)
print(response.read())
Ответ 15
Если вы не хотите использовать внешние сервисы (IP-сайты и т.д.), Вы можете использовать протокол UPnP.
Для этого мы используем простую клиентскую библиотеку UPnP (https://github.com/flyte/upnpclient)
Установить:
pip install upnpclient
Простой код:
import upnpclient
devices = upnpclient.discover()
if(len(devices) > 0):
externalIP = devices[0].WANIPConn1.GetExternalIPAddress()
print(externalIP)
else:
print('No Connected network interface detected')
Полный код (чтобы получить больше информации, как указано в readme github)
In [1]: import upnpclient
In [2]: devices = upnpclient.discover()
In [3]: devices
Out[3]:
[<Device 'OpenWRT router'>,
<Device 'Harmony Hub'>,
<Device 'walternate: root'>]
In [4]: d = devices[0]
In [5]: d.WANIPConn1.GetStatusInfo()
Out[5]:
{'NewConnectionStatus': 'Connected',
'NewLastConnectionError': 'ERROR_NONE',
'NewUptime': 14851479}
In [6]: d.WANIPConn1.GetNATRSIPStatus()
Out[6]: {'NewNATEnabled': True, 'NewRSIPAvailable': False}
In [7]: d.WANIPConn1.GetExternalIPAddress()
Out[7]: {'NewExternalIPAddress': '123.123.123.123'}
Ответ 16
Использовать модуль запросов:
import requests
myip = requests.get('https://www.wikipedia.org').headers['X-Client-IP']
print("\n[+] Public IP: "+myip)
Ответ 17
Так же просто, как запустить это в Python3:
import os
externalIP = os.popen('curl -s ifconfig.me').readline()
print(externalIP)
Ответ 18
Я предпочитаю эту конечную точку Amazon AWS:
import requests
ip = requests.get('https://checkip.amazonaws.com').text.strip()
Ответ 19
Как альтернатива. Здесь script вы можете попробовать.
Ответ 20
Как предположил Sunny, его вообще невозможно получить внешний ip-адрес внутри сети без какой-либо помощи внешних служб.
Посмотрите на следующий учебник, который охватывает точно то же самое. Я думаю, это работает для Python 2.5.X.
http://codetempo.com/programming/python/monitoring-ip-addresses-of-your-computer-start-up-script-on-linux-ubuntu
В нем говорится, что учебник предназначен для Linux, но работает и для других платформ с помощью python.
Ответ 21
ipWebCode = urllib.request.urlopen("http://ip.nefsc.noaa.gov").read().decode("utf8")
ipWebCode=ipWebCode.split("color=red> ")
ipWebCode = ipWebCode[1]
ipWebCode = ipWebCode.split("</font>")
externalIp = ipWebCode[0]
это короткий фрагмент, который я написал для другой программы. Трюк заключался в том, чтобы найти достаточно простой сайт, чтобы рассекать html не было болью.
Ответ 22
Здесь другая альтернатива script.
def track_ip():
"""
Returns Dict with the following keys:
- ip
- latlong
- country
- city
- user-agent
"""
conn = httplib.HTTPConnection("www.trackip.net")
conn.request("GET", "/ip?json")
resp = conn.getresponse()
print resp.status, resp.reason
if resp.status == 200:
ip = json.loads(resp.read())
else:
print 'Connection Error: %s' % resp.reason
conn.close()
return ip
EDIT: не забудьте импортировать httplib и json
Ответ 23
Если вы просто пишете для себя, а не для обобщенного приложения, вы можете найти адрес на странице настройки для своего маршрутизатора, а затем очистить его от этой страницы html. Это работало отлично для меня с моим маршрутизатором SMC. Один прочитанный и один простой запрос RE, и я его нашел.
Моя особая заинтересованность в этом заключалась в том, чтобы сообщить мне мой домашний IP-адрес, когда я был вне дома, поэтому я мог бы вернуться через VNC. Еще несколько строк Python хранят адрес в Dropbox для внешнего доступа и даже отправляют мне сообщения по электронной почте, если он видит изменение. Я планировал, что это произойдет при загрузке и один раз в час после этого.
Ответ 24
Используйте этот script:
import urllib, json
data = json.loads(urllib.urlopen("http://ip.jsontest.com/").read())
print data["ip"]
Без json:
import urllib, re
data = re.search('"([0-9.]*)"', urllib.urlopen("http://ip.jsontest.com/").read()).group(1)
print data
Ответ 25
Решение только для Linux.
В системах Linux вы можете использовать Python для выполнения команды в оболочке. Я думаю, что это может кому-то помочь.
Примерно так (при условии, что dig работает на ОС)
import os
command = '''dig TXT +short o-o.myaddr.l.google.com @ns1.google.com | awk -F'"' '{ print $2}'''
ip = os.system(command)