Comment localiser une adresse IP en utilisant Python ?

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 :

  1. socket  : Un module intégré à Python permettant de gérer les connexions réseau.
  2. requests  : Un module tiers utilisé pour envoyer des requêtes HTTP facilement.
  3. 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.