Работа с 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}")
Преимущества кода
- Простота: Программа легко читается и модифицируется.
- Надежность: Обработка ошибок минимизирует вероятность падения скрипта.
- Интерактивность: Пользователь может вводить 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}")
Пока нет комментариев. Будьте первым!