Получение внешнего IP-адреса компьютера с помощью Python - PullRequest
47 голосов
/ 22 февраля 2010

В поисках лучшего способа получения машины с текущим внешним IP #с 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)

Ответы [ 20 ]

43 голосов
/ 24 марта 2016

Мне понравились 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
30 голосов
/ 02 января 2017

Python3, не используя ничего, кроме стандартной библиотеки

Как упоминалось ранее, можно использовать внешний сервис , такой как https://ident.me, для обнаружения внешнего IP-адреса вашего маршрутизатора.

Вот как это делается с python3, не используя ничего, кроме стандартной библиотеки:

import urllib.request

external_ip = urllib.request.urlopen('https://ident.me').read().decode('utf8')

print(external_ip)
26 голосов
/ 22 февраля 2010

Если вы находитесь за маршрутизатором, который получает внешний IP, я боюсь, что у вас нет другого выбора, кроме как использовать внешний сервис, как вы. Если у самого маршрутизатора есть какой-либо интерфейс запросов, вы можете использовать его, но решение будет очень специфичным для среды и ненадежным.

18 голосов
/ 29 декабря 2016

Вы должны использовать протокол 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 голосов
/ 22 февраля 2010

Если вы считаете, что внешний источник слишком ненадежен, вы можете объединить несколько различных служб. Для большинства страниц поиска по ip требуется, чтобы вы просмотрели html, но некоторые из них создали скудные страницы для таких скриптов, как ваш, а также чтобы уменьшить количество обращений на свои сайты:

3 голосов
/ 27 июня 2015

На мой взгляд, самое простое решение -

    f = requests.request('GET', 'http://myip.dnsomatic.com')
    ip = f.text

Вот и все.

2 голосов
/ 06 июня 2013

Я попробовал большинство других ответов на этот вопрос здесь и пришел к выводу, что большинство использованных сервисов не функционировали, кроме одного.

Вот скрипт, который должен выполнить трюк и загрузить только минимальное количество информации:

#!/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() )
2 голосов
/ 31 марта 2017
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"
1 голос
/ 09 мая 2014

Самое простое (не python) рабочее решение, которое я могу придумать, это

wget -q -O- icanhazip.com

Я хотел бы добавить очень короткое решение Python3, которое использует JSON API: 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
1 голос
/ 27 марта 2014
In [1]: import stun

stun.get_ip_info()
('Restric NAT', 'xx.xx.xx.xx', 55320)
...