Получение внешнего IP-адреса компьютера с помощью Python
22 ответа
Если вы находитесь за маршрутизатором, который получает внешний IP, я боюсь, у вас нет другого выбора, кроме как использовать внешний сервис, как вы. Если у самого маршрутизатора есть некоторый интерфейс запросов, вы можете использовать его, но решение будет очень специфичным для среды и ненадежным.
Если машина является брандмауэром, то ваше решение является очень разумным: альтернатива заключается в том, чтобы запросить брандмауэр, который в конечном итоге сильно зависит от типа брандмауэра (если это вообще возможно).
Я предпочитаю эту конечную точку Amazon AWS:
Я попробовал большинство других ответов на этот вопрос здесь и пришел к выводу, что большинство использованных сервисов перестали существовать, кроме одного.
Вот скрипт, который должен сделать трюк и загрузить только минимальное количество информации:
Если вы не заинтересованы в нажатии на любой URL, чтобы получить публичный ip, я думаю, что следующий код может помочь вам получить публичный ip с использованием python вашей машины.
Я столкнулся с той же проблемой, мне был нужен публичный IP-адрес устройства iot, который поражает мой сервер. но публичный ip полностью отличается в команде ifconfig, и ip я получаю на сервере из объекта запроса. после этого я добавляю дополнительный параметр в свой запрос на отправку ip устройства на мой сервер.
Надеюсь, что это будет полезно
Самое простое (не python) рабочее решение, которое я могу придумать,
Я хотел бы добавить очень короткое решение Python3, использующее API-интерфейс JSON http://hostip.info.
Конечно, вы можете добавить проверку ошибок, условие тайм-аута и некоторое удобство:
Вот еще один альтернативный скрипт.
РЕДАКТИРОВАТЬ: не забудьте импортировать httplib и json
Если вы пишете только для себя, а не для обобщенного приложения, возможно, вы сможете найти адрес на странице настройки вашего маршрутизатора, а затем убрать его из html этой страницы. Это работало хорошо для меня с моим маршрутизатором SMC. Один прочитанный и один простой поиск RE, и я нашел это.
Мой особый интерес к этому состоял в том, чтобы сообщить мне мой домашний IP-адрес, когда я был вдали от дома, чтобы я мог вернуться через VNC. Еще несколько строк Python хранят адрес в Dropbox для внешнего доступа и даже отправляют мне электронные письма, если он видит изменение. Я запланировал, что это произойдет при загрузке и один раз в час после этого.
Статья Сбор информации об IP и пробиваем номер сотового. [Python для хакера] Часть 3
Ciao, дорогие участники нашего форума) Давненько от меня не выходило статей. Но это все по тому, что я совместно с @BadBlackHat и @r0hack создаем курс по веб пентесту. Думаю вам понравится. А теперь перейдем непосредственно к сути. Сегодня, мы напишем 2 не больших скрипта на Python, которые не много облегчат вам сбор информации. Первый скрипт получает информацию об IP, а второй не много о номере сотового.
Для начала определимся с тем, какую информацию хотим получить. В основном, это будет город, страна, континент (а вдруг) и провайдер. Также не плохо было бы получить информацию whois. Для написания нашего скрипта, я составил простенький алгоритм.
Прописав этот URL, вы как будто говорите серверу «Предоставь мне информацию об IP адресе 101.50.1.2 в виде JSON». Данный IP является прокси сервером.
Так вот, когда мы из JSON переформируем данные в словарь, то чтобы получить, например информацию о городе, существует ключ «city». Более обширная информация о регионе, то ключ «region». Надеюсь, что на этом моменте все понятно. Приступим к написанию непосредственно кода.
Теперь же, нам необходимо запросить у пользователя IP адрес, о котором собственно и будет собрана информация.
Составляем необходимый URL, дабы в дальнейшем запросить с него информацию.
Как раз, после выполнения данной строки, если IP был найден в базе сайта и мы корректно подключились к нему, нужно преобразовать данные из JSON в словарь. Для этого воспользуемся опять таки одной строкой))
Данные получены, но не спешите выводить всю информацию, это мы сделаем в последнюю очередь. А теперь получаем whois информацию. Здесь все еще проще.
После того, как мы собрали всю информацию, нам необходимо красиво вывести ее.
Код я не много видоизменил и «продекорировал». Вот, что получилось в итоге
Здесь, все строиться практически на таком же алгоритме. За исключением whois))) В число интересующей нас информации входит город, страна, сотовый оператор.
Брать информацию мы будем в виде JSON. Для начала, посмотрим на ее «внешний вид». Для этого пропишите какой-либо номер используя следующий URL.
Я возьму телефон с ресурса onlinesim.
Думаю, что при конвертации этого из JSON получится многомерный словарь)) Т.е. нужно будет использовать ключи 2 раза. Например словарькак узнать айпи через pythonкак узнать айпи через python
Приступим конечно же к кодингу. Ничего не меняется, мы импортируем все те же библиотеки, за исключением os.
Далее, запрашиваем у пользователя номер сотового телефона
Формируем URL для запроса
Запрашиваем у ресурса информацию о сотовом в json формате
Из полученной информации, которая храниться в виде json создаем многомерный словарь)
И, конечно, красиво выводим все полученную информацию.
На вход программе давайте номер сотового, но без +
Поиск локальных IP-адресов с помощью stdlib Python
Как я могу найти локальные IP-адреса (т. е. 192.168.X. x или 10.0.X. x) в платформе Python самостоятельно и с использованием только стандартной библиотеки?
30 ответов
Я только что нашел это, но это кажется немного взломанным, однако они говорят, что попробовали его на *nix, и я сделал на windows, и это сработало.
предполагается, что у вас есть доступ в интернет и что нет локального прокси-сервера.
то же, что и выше, но только Python код:
версия, которая также будет работать на LANs без подключения к интернету:
это была моя первая попытка, которая отсеивает все адреса, начиная с «127.» :
это работает с Python 2 и 3, на Linux и Windows, но не имеет дело с несколькими сетевыми устройствами или IPv6. Однако он перестал работать на последних дистрибутивах Linux,поэтому я попробовал этот альтернативный метод. Он пытается подключиться к DNS-серверу Google по адресу 8.8.8.8 в порт 53 :
затем я объединил два вышеуказанных метода в один лайнер, который должен работать везде, и создал myip псевдоним и фрагмент Python в верхней части этого ответа.
С ростом популярности IPv6 и для серверов с несколькими сетевыми интерфейсами использование стороннего модуля Python для поиска IP-адреса, вероятно, является более надежным и надежным, чем любой из перечисленных здесь методов.
этот метод возвращает «основной» IP-адрес в локальном поле (с маршрутом по умолчанию).
Это возвращает один IP-адрес, который является основным (с маршрутом по умолчанию). Если вам нужны все IP-адреса, подключенные ко всем интерфейсам (включая localhost и т. д.), см. ответ.
Если вы находитесь за брандмауэром NAT, как ваш wifi box дома, то это не покажет ваш публичный NAT IP, но вместо вашего частного NAT IP на локальном сеть, которая имеет маршрут по умолчанию к локальному маршрутизатору WIFI; получение внешнего IP-адреса маршрутизатора wifi потребует либо запуска этого на этом поле, либо подключения к внешней службе, такой как whatismyip.com/whatismyipaddress.com это может отражать IP-адрес. но это полностью отличается от первоначального вопроса. 🙂
обновленный вызов connect () в соответствии с предложением Педро в комментариях. (Если вам нужна конкретная лицензия, это общественное достояние / бесплатно для любого использования, или MIT / CC2-BY-SA на лицензию кода/содержимого переполнения стека по вашему выбору.)
можно использовать netifaces модуль. Просто введите:
в вашей командной оболочке, и он установит себя на установку Python по умолчанию.
тогда вы можете использовать его следующим образом:
на моем компьютере она напечатала:
автор этого модуля утверждает, что он должен работать на Windows, UNIX и Mac OS X.
метод API сокета
отражатель метод
(обратите внимание, что это не отвечает на вопрос OP о локальном IP-адресе, например 192.168. ; это дает вам ваш публичный IP-адрес, который может быть более желательным в зависимости от варианта использования.)
вы можете запросить какой-то сайт, как whatismyip.com (но с API), например:
или при использовании python2:
недостатки (и их решения):
Модуль ipaddress в Python [ Простые примеры ]
Эй, ребята! Сегодня мы узнаем о модуле ipaddress в Python. Итак, без лишних слов, давайте начнем.
Эй, ребята! Сегодня мы узнаем о модуле ipaddress в Python. Итак, без лишних слов, давайте начнем.
Что такое IP-адрес?
IP расшифровывается как интернет-протокол. Он используется для идентификации узла в любой сети. Поэтому любое устройство, которое подключается к Интернету, должно иметь IP-адрес.
Существует две версии IP-адресов: IPv4 и IPv6. В настоящее время используется IPv4, в то время как IPv6 внедряется крупными сетевыми провайдерами медленно из-за нехватки адресов IPv4 по сравнению с устройствами в сети.
Как использовать модуль ipaddress в Python?
Эта функция автоматически определяет, какая версия будет использоваться на основе переданных значений. Он либо возвращает адрес IPv4, либо адрес IPv6.
1. Как создать действительный IPv4-адрес?
IPv4 проверяет значения в диапазоне от 0 до 255. Целое число, которое помещается в 32 бита, представляет октет в адресе. Целое число, упакованное в байтовый объект длиной 4.
2. Как создать действительный IPv6-адрес?
IPv6 проверяет значения в диапазоне от 0 до ffff. Целое число, которое укладывается в 128 бит. Целое число, упакованное в байтовый объект длиной 16.
Работа с IP-адресами в Python с помощью модуля ipaddress
IP-адреса сопровождаются набором правил. Диапазонам IP-адресов назначаются различные функции.
Например, 127.0.0.1-это адрес обратной связи, назначенный сетевому модулю на вашем компьютере. Когда вы отправляете пинг-пакет на этот IP-адрес, вы, по сути, пингуете свой собственный компьютер.
1. Основные функции IP
Давайте посмотрим, как мы можем проверить, какие адреса являются петлевыми, многоадресными, локальными ссылками или зарезервированы с помощью модуля ipaddress в Python
2. Обратный поиск IP-адресов
Функция обратного указателя запрашивает DNS для разрешения IP-адреса, добавленного в качестве аргумента здесь. Если DNS сможет разрешить IP-адрес, вы получите вывод с назначенным именем.
Если вы пропингуете IP-адрес, назначенный доменному имени, вы, скорее всего, получите имя сервера, на котором существует домен. Однако это может измениться в зависимости от настройки брандмауэра.
Сеть IPv4 и сеть IPv6 могут помочь нам определить и проверить определения IP-сетей.
Мы можем получить IP-сеть в требуемом формате без написания пользовательского кода.
1. Проверьте, является ли IP-адрес IPv4 или IPv6
ip-адрес.функция ip_network( ) используется для возврата типа сети адреса. Он подтверждает, находится ли IP-адрес в сети IP4 или сети IP6.
2. Идентификация хостов в IP-сети
Хосты-это все IP-адреса, принадлежащие сети, за исключением сетевого адреса и широковещательного адреса сети.
host( ) возвращает итератор по используемым хостам в сети.
Сети, длина маски которых равна 31, сетевой адрес и широковещательный адрес сети также включены в результат, а сети, длина маски которых равна 32, возвращают список возвращаемых адресов одного хоста.
3. Определение широковещательного адреса для сетей
С помощью broadcast_address мы можем запросить DNS-сервер ответить широковещательным адресом в сети.
4. Определение перекрытий IP-сетей
Эта функция говорит нам, что если сеть частично или полностью содержится в другой сети. Он возвращает либо true, либо false.
5. Подсети в IP-сетях
Он возвращает итератор сетевых объектов. prefixlen_diff-это сумма длины префикса, которая должна быть увеличена, new_prefix-это новый префикс подсетей и больше нашего префикса.
6. Создание суперсетей с помощью модуля ipaddress
7. Проверьте, является ли IP-сеть суперсетью/подсетью другой IP-сети
Возвращает true, если сеть является подсетью другого, если сеть является суперсетью другого. Возвращает либо true, либо false.
8. Работа с объектами интерфейса IPv4
Объекты интерфейса можно использовать в качестве ключей в словарях, поскольку они хэшируются.
Интерфейс IPv4 наследует все атрибуты от адреса IPv4, поскольку интерфейс IPv4 является подклассом адреса IPv4.
Вот, 199.167.1.6 IP-адрес находится в сети 199.167.1.0/24
Мы можем представить сетевой интерфейс в префиксной нотации, как сетевую маску и как маску хоста.
Различные операции с IP-адресами
Мы можем добавлять или вычитать целые числа из объектов IP-адресов.
Адреса могут быть преобразованы в строки или целые числа с помощью встроенных функций ул( ) и int( ).
IPv6-адреса преобразуются в строки без идентификатора зоны.
Вывод
В этом уроке мы узнали об адресах IPv4 и IPv6, сети и интерфейсе. Для получения большего количества такого контента следите за обновлениями. Счастливого Обучения! 🙂
Модуль ipaddress¶
Модуль ipaddress упрощает работу с IP-адресами.
С версии Python 3.3 модуль ipaddress входит в стандартную библиотеку Python.
ipaddress.ip_address ¶
Функция ipaddress.ip_address позволяет создавать объект IPv4Address или IPv6Address соответственно:
У объекта есть несколько методов и атрибутов:
С помощью атрибутов is_ можно проверить, к какому диапазону принадлежит адрес:
С полученными объектами можно выполнять различные операции:
ipaddress.ip_network ¶
Функция ipaddress.ip_network позволяет создать объект, который описывает сеть (IPv4 или IPv6):
Как и у адреса, у сети есть различные атрибуты и методы:
Метод hosts возвращает генератор, поэтому, чтобы посмотреть все хосты, надо применить функцию list :
Метод subnets позволяет разбивать на подсети. По умолчанию он разбивает сеть на две подсети:
Параметр prefixlen_diff позволяет указать количество бит для подсетей:
С помощью параметра new_prefix можно указать, какая маска должна быть у подсетей:
По IP-адресам в сети можно проходиться в цикле:
Или обращаться к конкретному адресу:
Таким образом можно проверять, находится ли IP-адрес в сети:
ipaddress.ip_interface ¶
Функция ipaddress.ip_interface позволяет создавать объект IPv4Interface или IPv6Interface соответственно:
Используя методы объекта IPv4Interface, можно получать адрес, маску или сеть интерфейса:
Пример использования модуля¶
Так как в модуль встроены проверки корректности адресов, можно ими пользоваться, например, чтобы проверить, является ли адрес адресом сети или хоста:


