Python проверка и получения данных по IP-адресу

Python проверка и получения данных по IP-адресу

Работа с IP-адресами часто требуется для множества задач, начиная от сетевого администрирования и заканчивая аналитикой пользовательских данных. В этой статье мы рассмотрим, как создать простой и функциональный Python-скрипт для проверки IP-адресов и получения информации о них с использованием API сервиса ip-api.com.

Пошаговое руководство кода

Импорт необходимых модулей

import json
import requests

В коде используются две библиотеки:

  • json: для работы с JSON-данными, которые возвращает API.
  • requests: для отправки HTTP-запросов.

Функция проверки корректности IP-адреса

def is_valid_ip(ip_str: str) -> bool:
    parts = ip_str.split('.')
    if len(parts) != 4:
        return False
    for part in parts:
        if not part.isdigit():
            return False
        num = int(part)
        if num < 0 or num > 255:
            return False
    return True

Эта функция проверяет, соответствует ли строка формату IPv4. Она делит IP-адрес на четыре части, проверяя, являются ли они числами в диапазоне от 0 до 255.

Основной цикл программы

while True:
    ip = input("Введите IP-адрес (или 'exit' для выхода): ")
    if ip.lower() == 'exit':
        break

Программа работает в бесконечном цикле, пока пользователь не введет команду exit. Это удобно, если нужно проверить несколько IP-адресов подряд.

Проверка IP и вызов API

Если IP-адрес некорректный, программа уведомляет об этом пользователя. Для корректного IP формируется URL для запроса к API:

url = f"http://ip-api.com/json/{ip}"

Отправка запроса и обработка ответа

try:
    response = requests.get(url, timeout=5)
    response.raise_for_status()
    data = response.json()
except requests.RequestException as e:
    print(f"Ошибка при запросе к серверу: {e}")
    continue
except json.JSONDecodeError:
    print("Не удалось декодировать ответ от сервера.")
    continue
  • Программа отправляет GET-запрос к сервису ip-api.com с таймаутом в 5 секунд.
  • Проверяется успешность ответа. Если что-то идет не так, пользователю выводится ошибка.

Проверка данных и вывод информации

if data.get("status") != "success":
    print(f"Не удалось получить данные для IP: {ip}. Причина: {data.get('message', 'неизвестна')}")
    continue

Если API возвращает status: fail, это означает, что данные о данном IP отсутствуют.

В случае успеха выводятся основные сведения:

  • IP-адрес
  • Город
  • Провайдер (ISP)
  • Страна
  • Регион
  • Часовой пояс

Пример кода для вывода:

print(f"IP: {query}")
print(f"City: {city}")
print(f"ISP: {isp}")
print(f"Country: {country}")
print(f"Region: {region}")
print(f"Timezone: {timezone}")

Преимущества кода

  1. Простота: Программа легко читается и модифицируется.
  2. Надежность: Обработка ошибок минимизирует вероятность падения скрипта.
  3. Интерактивность: Пользователь может вводить IP-адресы и получать мгновенные результаты.

Пример использования

Ввод:

Введите IP-адрес (или ‘exit’ для выхода): 8.8.8.8

Вывод:

IP: 8.8.8.8

City: Mountain View

ISP: Google LLC

Country: United States

Region: California

Timezone: America/Los_Angeles

 

Заключение

Скрипт на Python, описанный в этой статье, подходит для начинающих разработчиков и демонстрирует, как использовать API для получения полезных данных. Вы можете использовать его в аналитике, для проверки пользователей или даже для геолокационных приложений.

Полный код:

import json
import requests  # Если возможно использовать requests

def is_valid_ip(ip_str: str) -> bool:
    # Простая проверка формата IPv4
    parts = ip_str.split('.')
    if len(parts) != 4:
        return False
    for part in parts:
        if not part.isdigit():
            return False
        num = int(part)
        if num < 0 or num > 255:
            return False
    return True

while True:
    ip = input("Введите IP-адрес (или 'exit' для выхода): ")
    if ip.lower() == 'exit':
        break

    if not is_valid_ip(ip):
        print("Некорректный IP-адрес. Повторите попытку.")
        continue

    url = f"http://ip-api.com/json/{ip}"
    
    try:
        response = requests.get(url, timeout=5)  # Таймаут для ожидания ответа
        response.raise_for_status()  # Проверяем статус-код HTTP
        data = response.json()
    except requests.RequestException as e:
        print(f"Ошибка при запросе к серверу: {e}")
        continue
    except json.JSONDecodeError:
        print("Не удалось декодировать ответ от сервера.")
        continue

    # Проверяем статус, который возвращает ip-api.com
    # Если status == 'fail', значит данные отсутствуют или IP некорректен
    if data.get("status") != "success":
        print(f"Не удалось получить данные для IP: {ip}. Причина: {data.get('message', 'неизвестна')}")
        continue

    # Безопасно получаем нужные поля. Если поля гарантированно приходят, можно обращаться напрямую
    query = data.get("query", "N/A")
    city = data.get("city", "N/A")
    isp = data.get("isp", "N/A")
    country = data.get("country", "N/A")
    region = data.get("regionName", "N/A")  # Обратите внимание, иногда используют regionName
    timezone = data.get("timezone", "N/A")

    print(f"IP: {query}")
    print(f"City: {city}")
    print(f"ISP: {isp}")
    print(f"Country: {country}")
    print(f"Region: {region}")
    print(f"Timezone: {timezone}")
Комментарии

Пока нет комментариев. Будьте первым!

Оставить комментарий

Чтобы оставить комментарий, пожалуйста, войдите или зарегистрируйтесь.