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

1 голос
/ 02 марта 2019

Так же просто, как запустить это в Python3:

import os

externalIP  = os.popen('curl -s ifconfig.me').readline()
print(externalIP)
1 голос
/ 22 февраля 2010

Если машина является брандмауэром, то ваше решение очень разумно: альтернатива - возможность запрашивать брандмауэр, который в конечном итоге сильно зависит от типа брандмауэра (если это вообще возможно).

1 голос
/ 25 ноября 2018

Если вы не хотите использовать внешние сервисы (IP-сайты и т. Д.), Вы можете использовать UPnP Protocol .

Для этого мы используем простую клиентскую библиотеку 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'}
1 голос
/ 08 февраля 2019

Использование запросов модуль:

import requests

myip = requests.get('https://www.wikipedia.org').headers['X-Client-IP']

print("\n[+] Public IP: "+myip)
1 голос
/ 19 сентября 2018

Есть несколько других способов, при которых 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

OR

import os
iN, out, err = os.popen3('curl ipinfo.io/ip')
iN.close() ; err.close()
ip = out.read().strip()
print ip

OR

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.

1 голос
/ 26 марта 2018

Работа с 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())
0 голосов
/ 29 февраля 2016

Используйте этот скрипт:

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
0 голосов
/ 05 февраля 2013
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 было не сложно.

0 голосов
/ 19 января 2014

Вот еще один альтернативный скрипт.

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

РЕДАКТИРОВАТЬ: Не забудьте импортировать httplib и json

0 голосов
/ 05 мая 2014

Если вы пишете только для себя, а не для обобщенного приложения, вы можете найти адрес на странице настройки вашего маршрутизатора, а затем убрать его из HTML-кода этой страницы. Это работало хорошо для меня с моим маршрутизатором SMC. Один прочитанный и один простой поиск RE, и я нашел его.

Мой особый интерес в этом заключался в том, чтобы сообщить мне мой домашний IP-адрес, когда я был вдали от дома, чтобы я мог вернуться через VNC. Еще несколько строк Python хранят адрес в Dropbox для внешнего доступа и даже пишут мне по электронной почте, если он видит изменение. Я запланировал, что это произойдет при загрузке и один раз в час после этого.

...