Le suivi et la localisation des adresses IP sont des compétences essentielles dans le monde de l’informatique. Que vous soyez un développeur, un administrateur réseau ou simplement curieux, savoir comment localiser une adresse IP peut s’avérer très utile. Ce guide détaillé vous montrera comment utiliser le langage de programmation Python pour réaliser cette tâche efficacement. Nous aborderons les modules nécessaires, écrirons un script pratique et explorerons différentes approches pour rendre votre code plus robuste.
Les bases : qu’est-ce qu’une adresse IP ?
Avant de plonger dans le codage, comprenons ce qu’est une adresse IP. Le terme “adresse IP” fait référence à une série unique de chiffres assignée à chaque appareil connecté à un réseau informatique utilisant le protocole Internet pour communication. Les adresses IP se présentent généralement sous deux formes :
- IPv4 : Format traditionnel comprenant quatre ensembles de chiffres séparés par des points (ex : 192.168.1.1).
- IPv6 : Nouvelle version conçue pour remplacer IPv4, utilisant des combinaisons de lettres et chiffres (ex : 2001 :0db8 :85a3 :0000 :0000 :8a2e :0370 :7334).
Prérequis : installation des modules nécessaires
Modules standards vs modules tiers
Pour localiser une adresse IP avec Python, nous avons besoin de quelques modules standard et tiers. Voici une liste des modules que nous allons utiliser :
- socket : Un module intégré à Python permettant de gérer les connexions réseau.
- requests : Un module tiers utilisé pour envoyer des requêtes HTTP facilement.
- json : Utilisé pour manipuler des données au format JSON.
Assurons-nous d’avoir installé ces modules avant de poursuivre. Vous pouvez installer le module requests en utilisant pip :
pip install requests
Écriture du script : localisation de l’adresse IP étape par étape
Utilisation du module socket
Commençons par utiliser le module socket pour obtenir l’adresse IP locale de notre machine. Créez un nouveau script Python et ajoutez-y le code suivant :
import socket
def get_local_ip() :
hostname = socket.gethostname()
local_ip = socket.gethostbyname(hostname)
return local_ip
print("IP Locale :", get_local_ip())
Ce simple script utilise socket.gethostname() pour récupérer le nom de l’hôte local, puis socket.gethostbyname() pour résoudre ce nom en une adresse IP.
Localisation d’une adresse IP externe
Pour localiser une adresse IP externe, nous allons utiliser un service web tel que ipinfo.io ou ip-api.com qui retourne des informations sur les adresses IP sous forme de JSON. Ajoutez ce code à votre script :
import requests
import json
def get_ip_location(ip) :
response = requests.get(f"http://ip-api.com/json/{ip}")
data = response.json()
if data['status'] == 'success' :
return data
else :
return None
ip_to_locate = "8.8.8.8"
location_info = get_ip_location(ip_to_locate)
if location_info :
print(json.dumps(location_info, indent=4))
else :
print("Erreur : Impossible de localiser l'adresse IP.")
Dans cet exemple, nous utilisons la librairie requests pour effectuer une requête GET vers l’API ip-api.com, récupérant ainsi des données JSON relatives à l’adresse IP à localiser.
Analyse des données retournées
Compréhension des données JSON
Le service API retourne plusieurs informations utiles telles que :
- Country : Pays où se trouve l’adresse IP
- Region : Région ou état
- City : Ville
- ISP : Fournisseur de services Internet
- Lat/Lon : Latitude et longitude
Le fichier JSON pourrait ressembler à ceci :
{
"country" : "United States",
"regionName" : "California",
"city" : "Mountain View",
"lat" : 37.386,
"lon" : -122.084,
"isp" : "Google LLC"
}
Affichage des informations pertinentes
Il est souvent utile de filtrer et n’afficher que certaines informations des résultats. Mise à jour du précédent code avec une fonction pour afficher les informations spécifiques :
def display_ip_info(data) :
print(f"Pays : {data['country']}")
print(f"Région : {data['regionName']}")
print(f"Ville : {data['city']}")
print(f"Fournisseur d'accès : {data['isp']}")
print(f"Latitude : {data['lat']}")
print(f"Longitude : {data['lon']}")
if location_info :
display_ip_info(location_info)
Avec cette modification, seules les informations spécifiées seront affichées, rendant le résultat plus clair et concis.
Améliorations possibles du script
Gestion des erreurs et exceptions
Lors de l’exécution de requêtes HTTP, il y a toujours des risques de rencontrer des erreurs, comme des problèmes de connexion ou des réponses invalides. Il est donc prudent d’ajouter une gestion des exceptions :
def get_ip_location(ip) :
try :
response = requests.get(f"http://ip-api.com/json/{ip}", timeout=5)
response.raise_for_status()
data = response.json()
if data['status'] == 'success' :
return data
else :
return None
except requests.RequestException as e :
print(f"Erreur lors de la requête : {e}")
return None
Avec cette approche, le script devient capable de gérer gracieusement les erreurs sans planter, tout en informant l’utilisateur de ce qui ne va pas.
Automatisation et extensions du script
Pour automatiser davantage le processus, vous pourriez lire les adresses IP depuis un fichier et traiter chacune d’elles en boucle. Exemple :
def read_ips_from_file(file_path) :
with open(file_path, 'r') as file :
ips = file.readlines()
return [ip.strip() for ip in ips]
ips_list = read_ips_from_file("ips.txt")
for ip in ips_list :
info = get_ip_location(ip)
if info :
display_ip_info(info)
Cela permet d’automatiser la localisation de multiples adresses IP efficacement, en ne nécessitant qu’un fichier texte contenant des adresses IP ligne par ligne.