web-dev-qa-db-fra.com

Identifier le pays par son adresse IP

Existe-t-il un moyen de comprendre le nom du pays simplement en regardant une adresse IP? Je veux dire, les pays ont-ils des plages d'adresses IP spécifiques? Par exemple, l'Australie ne peut avoir des adresses IP que dans la plage de 123.45.56.89 - 231.54.65.98 (juste un exemple)

38
skos

Je pense que ce que vous recherchez est une base de données ou un fournisseur de services de géolocalisation IP. Il y en a beaucoup et certains sont gratuits (obtenez ce que vous payez).

Bien que je n'aie jamais utilisé ce service auparavant, il prétend être en temps réel. https://kickfire.com/kf-api

Mais faites simplement une recherche google sur IP geo et vous obtiendrez plus de résultats que vous n'en avez besoin.

13
Chris Gessler

Non, vous ne pouvez pas - Les adresses IP sont réaffectées et réaffectées de temps en temps, de sorte que le mappage de l'IP à l'emplacement changera également au fil du temps.

Si vous souhaitez connaître l'emplacement auquel une adresse IP est actuellement mappée, vous pouvez soit télécharger une base de données de géolocalisation, telle que GeoLite de MaxMind , soit utiliser une API telle que http: // ipinfo .io (mon propre service) qui vous donnera également des détails supplémentaires:

$ curl ipinfo.io/8.8.8.8
{
  "ip": "8.8.8.8",
  "hostname": "google-public-dns-a.google.com",
  "loc": "37.385999999999996,-122.0838",
  "org": "AS15169 Google Inc.",
  "city": "Mountain View",
  "region": "California",
  "country": "US",
  "phone": 650
}
28
Ben Dowling

Ce n'est pas si facile. Les adresses IP ne sont pas attribuées aux pays en tant que tels, mais aux entreprises et organisations.

Mais peut-être que cela peut vous aider: http://www.maxmind.com/app/geolitecountry

3
barsju

Vous pouvez utiliser ipdata.co pour effectuer la recherche

Cette réponse utilise une clé API "test" très limitée et destinée uniquement à tester quelques appels. Inscription pour votre propre clé API gratuite et obtenez jusqu'à 1500 demandes par jour pour le développement.

curl https://api.ipdata.co/23.221.76.66?api-key=test

Ipdata a 10 points de terminaison dans le monde, chacun capable de gérer> 10 000 requêtes par seconde!

Donne

{
    "ip": "23.221.76.66",
    "city": "Cambridge",
    "region": "Massachusetts",
    "region_code": "MA",
    "country_name": "United States",
    "country_code": "US",
    "continent_name": "North America",
    "continent_code": "NA",
    "latitude": 42.3626,
    "longitude": -71.0843,
    "asn": "AS20940",
    "organisation": "Akamai International B.V.",
    "postal": "02142",
    "calling_code": "1",
    "flag": "https://ipdata.co/flags/us.png",
    "emoji_flag": "\ud83c\uddfa\ud83c\uddf8",
    "emoji_unicode": "U+1F1FA U+1F1F8",
    "is_eu": false,
    "languages": [
        {
            "name": "English",
            "native": "English"
        }
    ],
    "currency": {
        "name": "US Dollar",
        "code": "USD",
        "symbol": "$",
        "native": "$",
        "plural": "US dollars"
    },
    "time_zone": {
        "name": "America/New_York",
        "abbr": "EDT",
        "offset": "-0400",
        "is_dst": true,
        "current_time": "2018-04-19T06:32:30.690963-04:00"
    },
    "threat": {
        "is_tor": false,
        "is_proxy": false,
        "is_anonymous": false,
        "is_known_attacker": false,
        "is_known_abuser": false,
        "is_threat": false,
        "is_bogon": false
    }
}⏎ 
3
Jonathan

Les adresses IP sont assez couramment utilisées pour le ciblage géographique, c'est-à-dire la personnalisation du contenu d'un site Web par l'emplacement/le pays du visiteur, mais elles ne sont pas associées de manière permanente à un pays et sont souvent réaffectées.

Pour accomplir ce que vous voulez, vous devez garder une recherche à jour pour mapper une adresse IP à un pays avec une base de données ou une API de géolocalisation. Voici un exemple:

> https://ipapi.co/8.8.8.8/country
US

> https://ipapi.co/8.8.8.8/country_name
United States

Ou vous pouvez utiliser l'API complète pour terminer emplacement de l'adresse IP par exemple.

https://ipapi.co/8.8.8.8/json

{
    "ip": "8.8.8.8",
    "city": "Mountain View",
    "region": "California",
    "region_code": "CA",
    "country": "US",
    "country_name": "United States",
    "continent_code": "NA",
    "postal": "94035",
    "latitude": 37.386,
    "longitude": -122.0838,
    "timezone": "America/Los_Angeles",
    "utc_offset": "-0800",
    "country_calling_code": "+1",
    "currency": "USD",
    "languages": "en-US,es-US,haw,fr",
    "asn": "AS15169",
    "org": "Google Inc."
}
2
Francis

Vous pouvez essayer d'utiliser https://ip-api.io - api de géolocalisation qui renvoie le pays parmi d'autres informations IP.

Par exemple avec Node.js

const request = require('request-promise')

request('http://ip-api.io/api/json/1.2.3.4')
  .then(response => console.log(JSON.parse(response)))
  .catch(err => console.log(err))
2
Andrey E

Oui, les pays ont des plages d'adresses IP spécifiques comme vous l'avez mentionné.

Par exemple, l'Australie se situe entre 16777216 et 16777471. La Chine se situe entre 16777472 et 16778239. Mais un pays peut avoir plusieurs plages. Par exemple, l'Australie a également cette plage entre 16778240 et 16779263.

(Ce sont des conversions numériques d'adresses IP. Cela dépend si vous utilisez IPv4 ou IPv6)

Plus d'informations sur ces plages peuvent être consultées ici: http://software77.net/cidr-101.html

Nous obtenons les adresses IP des visiteurs de notre site Web et souhaitons parfois faire une campagne pertinente pour un pays spécifique. Nous utilisions des outils de conversion en masse, mais nous avons décidé plus tard de définir les règles dans un fichier Excel et de les convertir dans l'outil. Et nous avons construit ce modèle Excel: https://www.someka.net/Excel-template/ip-to-country-converter/

Maintenant, nous l'utilisons pour nos propres besoins et le vendons également. Je ne veux pas que ce soit un argumentaire de vente, mais pour ceux qui recherchent une solution simple, ils peuvent en bénéficier.

2
Onur

Oui, vous pouvez télécharger les plages d'adresses IP par pays à partir de https://lite.ip2location.com/ip-address-ranges-by-country

Vous pouvez voir que chaque pays a plusieurs plages et change fréquemment.

1
Michael C.
1
rcky

Je suis d'accord avec les réponses ci-dessus, la meilleure façon d'obtenir le pays depuis l'adresse IP est Maxmind.

Si vous voulez écrire du code en Java, vous voudrez peut-être utiliser les fichiers dat geoip-api-1.2.10.jar et geoIP (GeoIPCity.dat), qui peuvent être trouvés via google.

Le code suivant peut vous être utile pour obtenir presque toutes les informations relatives à l'emplacement, j'utilise également le même code.

public static String getGeoDetailsUsingMaxmind(String ipAddress, String desiredValue) 
    {
        Location getLocation;
        String returnString = "";
        try
        {
            String geoIPCity_datFile = System.getenv("AUTOMATION_HOME").concat("/tpt/GeoIP/GeoIPCity.dat");
            LookupService isp = new LookupService(geoIPCity_datFile);
            getLocation = isp.getLocation(ipAddress);
            isp.close();

            //Getting all location details 
            if(desiredValue.equalsIgnoreCase("latitude") || desiredValue.equalsIgnoreCase("lat"))
            {
                returnString = String.valueOf(getLocation.latitude);
            }
            else if(desiredValue.equalsIgnoreCase("longitude") || desiredValue.equalsIgnoreCase("lon"))
            {
                returnString = String.valueOf(getLocation.longitude);
            }
            else if(desiredValue.equalsIgnoreCase("countrycode") || desiredValue.equalsIgnoreCase("country"))
            {
                returnString = getLocation.countryCode;
            }
            else if(desiredValue.equalsIgnoreCase("countryname"))
            {
                returnString = getLocation.countryName;
            }
            else if(desiredValue.equalsIgnoreCase("region"))
            {
                returnString = getLocation.region;
            }
            else if(desiredValue.equalsIgnoreCase("metro"))
            {
                returnString = String.valueOf(getLocation.metro_code);
            }
            else if(desiredValue.equalsIgnoreCase("city"))
            {
                returnString = getLocation.city;
            }
            else if(desiredValue.equalsIgnoreCase("Zip") || desiredValue.equalsIgnoreCase("postalcode"))
            {
                returnString = getLocation.postalCode;
            }
            else
            {
                returnString = "";
                System.out.println("There is no value found for parameter: "+desiredValue);
            }

            System.out.println("Value of: "+desiredValue + " is: "+returnString + " for ip address: "+ipAddress);
        }
        catch (Exception e) 
        {
            System.out.println("Exception occured while getting details from max mind. " + e);
        }
        finally
        {
            return returnString;
        }
    }
1

Le réseau de diffusion de contenu CloudFront d'Amazon peut désormais être configuré pour transmettre ces informations en tant qu'en-tête. Compte tenu de la taille d'Amazon (ils sont grands et stables, ne vont nulle part) et il s'agit d'une configuration sur du code (pas d'API tierce à apprendre ou de code à maintenir), tout le monde pense que c'est la meilleure option.

Si vous n'utilisez pas AWS CloudFront, j'examinerais si votre CDN a une option d'en-tête similaire qui peut être activée. Habituellement, les grands fournisseurs poussent rapidement à la parité des fonctionnalités. Et si vous n'utilisez pas de CDN, vous pouvez placer CloudFront devant votre infrastructure et simplement définir l'origine pour résoudre ce que vous utilisez actuellement.

En outre, il est également judicieux de résoudre ce problème au niveau CDN. Votre CDN doit déjà déterminer l'emplacement géographique pour acheminer l'utilisateur vers le nœud de contenu le plus proche, pourrait aussi bien transmettre ces informations et ne pas le comprendre deux fois via une API tierce (cela devient un point d'étranglement pour votre application, en attendant une géo recherche d'emplacement à résoudre). Pas besoin de faire ce travail deux fois (et la deuxième fois, sans doute moins résilient [par exemple, recherche géographique tierce]).

https://aws.Amazon.com/blogs/aws/enhanced-cloudfront-customization/

Ciblage géographique - CloudFront détectera le pays d'origine de l'utilisateur et vous transmettra le code du comté dans le CloudFront-Viewer-Country entête. Vous pouvez utiliser ces informations pour personnaliser vos réponses sans avoir à utiliser des URL spécifiques à chaque pays.

1
Joshua Robinson

Voici ma solution en Python 3.x pour retourner géo-localisation info étant donné une trame de données contenant adresse (s) IP; efficace parallélisé l'application de la fonction sur pd.series/dataframe vectorisées est la voie à suivre.

Contrastera les performances de deux bibliothèques populaires pour retourner location.

TLDR: utilisez la méthode geolite2.

1.geolite2 package de geolite2 bibliothèque

entrée

# !pip install maxminddb-geolite2
import time
from geolite2 import geolite2
geo = geolite2.reader()
df_1 = train_data.loc[:50,['IP_Address']]

def IP_info_1(ip):
    try:
        x = geo.get(ip)
    except ValueError:   #Faulty IP value
        return np.nan
    try:
        return x['country']['names']['en'] if x is not None else np.nan
    except KeyError:   #Faulty Key value
        return np.nan

s_time = time.time()
# map IP --> country
#apply(fn) applies fn. on all pd.series elements
df_1['country'] = df_1.loc[:,'IP_Address'].apply(IP_info_1)
print(df_1.head(), '\n')
print('Time:',str(time.time()-s_time)+'s \n')

print(type(geo.get('48.151.136.76')))

Sortie

       IP_Address         country
0   48.151.136.76   United States
1    94.9.145.169  United Kingdom
2   58.94.157.121           Japan
3  193.187.41.186         Austria
4   125.96.20.172           China 

Time: 0.09906983375549316s 

<class 'dict'>

2.DbIpCity package de ip2geotools bibliothèque

entrée

# !pip install ip2geotools
import time
s_time = time.time()
from ip2geotools.databases.noncommercial import DbIpCity
df_2 = train_data.loc[:50,['IP_Address']]
def IP_info_2(ip):
    try:
        return DbIpCity.get(ip, api_key = 'free').country
    except:
        return np.nan
df_2['country'] = df_2.loc[:, 'IP_Address'].apply(IP_info_2)
print(df_2.head())
print('Time:',str(time.time()-s_time)+'s')

print(type(DbIpCity.get('48.151.136.76',api_key = 'free')))

Sortie

       IP_Address country
0   48.151.136.76      US
1    94.9.145.169      GB
2   58.94.157.121      JP
3  193.187.41.186      AT
4   125.96.20.172      CN

Time: 80.53318452835083s 

<class 'ip2geotools.models.IpLocation'>

Une raison pour laquelle l'énorme différence de temps pourrait être due à la structure des données de la sortie, ie sous-ensemble direct de dictionnaires semble bien plus efficace que l'indexation à partir de la spécicialisation ip2geotools.models.IpLocation objet.

De plus, la sortie de la 1ère méthode est un dictionnaire contenant des données de géolocalisation, sous-ensemble pour obtenir les informations nécessaires:

x = geolite2.reader().get('48.151.136.76')
print(x)

>>>
    {'city': {'geoname_id': 5101798, 'names': {'de': 'Newark', 'en': 'Newark', 'es': 'Newark', 'fr': 'Newark', 'ja': 'ニューアーク', 'pt-BR': 'Newark', 'ru': 'Ньюарк'}},

 'continent': {'code': 'NA', 'geoname_id': 6255149, 'names': {'de': 'Nordamerika', 'en': 'North America', 'es': 'Norteamérica', 'fr': 'Amérique du Nord', 'ja': '北アメリカ', 'pt-BR': 'América do Norte', 'ru': 'Северная Америка', 'zh-CN': '北美洲'}}, 

'country': {'geoname_id': 6252001, 'iso_code': 'US', 'names': {'de': 'USA', 'en': 'United States', 'es': 'Estados Unidos', 'fr': 'États-Unis', 'ja': 'アメリカ合衆国', 'pt-BR': 'Estados Unidos', 'ru': 'США', 'zh-CN': '美国'}}, 

'location': {'accuracy_radius': 1000, 'latitude': 40.7355, 'longitude': -74.1741, 'metro_code': 501, 'time_zone': 'America/New_York'}, 

'postal': {'code': '07102'}, 

'registered_country': {'geoname_id': 6252001, 'iso_code': 'US', 'names': {'de': 'USA', 'en': 'United States', 'es': 'Estados Unidos', 'fr': 'États-Unis', 'ja': 'アメリカ合衆国', 'pt-BR': 'Estados Unidos', 'ru': 'США', 'zh-CN': '美国'}}, 

'subdivisions': [{'geoname_id': 5101760, 'iso_code': 'NJ', 'names': {'en': 'New Jersey', 'es': 'Nueva Jersey', 'fr': 'New Jersey', 'ja': 'ニュージャージー州', 'pt-BR': 'Nova Jérsia', 'ru': 'Нью-Джерси', 'zh-CN': '新泽西州'}}]}
0
Sumanth Lazarus