Подтвердить что ты не робот

Получение внешнего 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)
4b9b3361

Ответ 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)