Obtenir l'emplacement à partir d'une adresse IP


205

Je souhaite récupérer des informations telles que la ville, l'état et le pays d'un visiteur à partir de son adresse IP, afin de pouvoir personnaliser ma page Web en fonction de son emplacement. Existe-t-il un moyen efficace et fiable de le faire en PHP? J'utilise JavaScript pour les scripts côté client, PHP pour les scripts côté serveur et MySQL pour la base de données.


Ceci est à peu près un doublon de stackoverflow.com/questions/348614/… .
Charlie Martin

Réponses:


255

Vous pouvez télécharger une base de données GeoIP gratuite et rechercher l'adresse IP localement, ou vous pouvez utiliser un service tiers et effectuer une recherche à distance. Il s'agit de l'option la plus simple, car elle ne nécessite aucune configuration, mais elle introduit une latence supplémentaire.

Un service tiers que vous pourriez utiliser est le mien, http://ipinfo.io . Ils fournissent le nom d'hôte, la géolocalisation, le propriétaire du réseau et des informations supplémentaires, par exemple:

$ 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": "CA",
  "country": "US",
  "phone": 650
}

Voici un exemple PHP:

$ip = $_SERVER['REMOTE_ADDR'];
$details = json_decode(file_get_contents("http://ipinfo.io/{$ip}/json"));
echo $details->city; // -> "Mountain View"

Vous pouvez également l'utiliser côté client. Voici un exemple simple de jQuery:

$.get("https://ipinfo.io/json", function (response) {
    $("#ip").html("IP: " + response.ip);
    $("#address").html("Location: " + response.city + ", " + response.region);
    $("#details").html(JSON.stringify(response, null, 4));
}, "jsonp");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<h3>Client side IP geolocation using <a href="http://ipinfo.io">ipinfo.io</a></h3>

<hr/>
<div id="ip"></div>
<div id="address"></div>
<hr/>Full response: <pre id="details"></pre>


1
Vous voudrez peut-être vous assurer d'ajouter un json à la fin de l'URL pour vous assurer de récupérer json au lieu de la page Web complète. $ details = json_decode (file_get_contents (" ipinfo.io {$ ip} / json"));
Doug

1
@Manatax Ce n'est pas le cas, car il serait alors impossible d'analyser la réponse du serveur.
Ja͢ck

3
Ne semble pas être un service très fiable. Je cherche le nom nullde ma ville. Ce n'est pas comme une petite ville ou quelque chose comme ça, mais il n'a toujours pas pu la localiser. Si cela ne fonctionne pas bien aux États-Unis, je doute de la fréquence à laquelle il retournera également null en dehors des États-Unis.
Derek 朕 會 功夫

2
le résultat n'est pas exact .. région, ville postal
Mark Gerryl Mirandilla

2
AVERTISSEMENT: Depuis janvier 2019, certaines personnes ont signalé que cette URL ipinfo n'est pas sûre sur virustotal, en raison de chevaux de Troie. Les votes ont eu lieu entre 2015 et 2018
Ricardo

55

Je pensais que je poste que personne ne semble avoir donné d' informations sur cette API particulière, mais son retour exactement ce que je suis après et vous pouvez l' obtenir pour revenir dans de multiples formats, json, xml and csv.

 $location = file_get_contents('http://freegeoip.net/json/'.$_SERVER['REMOTE_ADDR']);
 print_r($location);

Cela vous donnera toutes les choses que vous pourriez souhaiter:

{
      "ip": "77.99.179.98",
      "country_code": "GB",
      "country_name": "United Kingdom",
      "region_code": "H9",
      "region_name": "London, City of",
      "city": "London",
      "zipcode": "",
      "latitude": 51.5142,
      "longitude": -0.0931,
      "metro_code": "",
      "areacode": ""

}

1
Hey Jamie FreegeoIp.net ne fonctionne pas. Est-ce qu'il y a un autre moyen?
Adi

Désolé pas pour le moment, mais c'est dommage car c'est le service que j'utilise sur mes sites en direct. Espérons qu'ils reviendront un peu de temps
Jamie Hutber

2
principalement vers le bas et donne rarement une région ou une ville
Rahul aman

2
Le service de Tony chez Azure semble fonctionner rapidement et de manière fiable: freegeoip2
Gustav

1
Malheureusement, ce service sera déconnecté le 1er juillet 2018 selon ce message: "Ce point de terminaison API est obsolète et cessera de fonctionner le 1er juillet 2018. Pour plus d'informations, veuillez visiter: github.com/apilayer/freegeoip#readme \
Julio Bailon

20

Un exemple pur Javascript, utilisant les services de https://geolocation-db.com Ils fournissent une solution de rappel JSON et JSONP.

Aucune jQuery requise!

<!DOCTYPE html>
<html>
<head>
<title>Geo City Locator by geolocation-db.com</title>
</head>
<body>
    <div>Country: <span id="country"></span></div>
    <div>State: <span id="state"></span></div>
    <div>City: <span id="city"></span></div>
    <div>Postal: <span id="postal"></span></div>
    <div>Latitude: <span id="latitude"></span></div>
    <div>Longitude: <span id="longitude"></span></div>
    <div>IP address: <span id="ipv4"></span></div>                             
</body>
<script>

    var country = document.getElementById('country');
    var state = document.getElementById('state');
    var city = document.getElementById('city');
    var postal = document.getElementById('postal');
    var latitude = document.getElementById('latitude');
    var longitude = document.getElementById('longitude');
    var ip = document.getElementById('ipv4');

    function callback(data)
    {
        country.innerHTML = data.country_name;
        state.innerHTML = data.state;
        city.innerHTML = data.city;
        postal.innerHTML = data.postal;
        latitude.innerHTML = data.latitude;
        longitude.innerHTML = data.longitude;
        ip.innerHTML = data.IPv4;
    }

    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = 'https://geoilocation-db.com/json/geoip.php?jsonp=callback';
    var h = document.getElementsByTagName('script')[0];
    h.parentNode.insertBefore(script, h);

</script> 
</html>

Y a-t-il une limite liée à l'utilisation de l' https://geoilocation-db.comAPI?
Priyanka Sharma

16

Utilisation de Google APIS:

<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script>
contry_code = google.loader.ClientLocation.address.country_code
city = google.loader.ClientLocation.address.city
region = google.loader.ClientLocation.address.region
</script>

9
The geolocation functionality in the Loader hasn't been retired, per se. We stopped documenting it several years ago and have recommended the HTML-based solutions due to their improved accuracy, but the functionality itself has not been removed from the Loader at this time. code.google.com/p/google-ajax-apis/issues/detail?id=586
TheFrost

Qu'en est-il de la qualité de cette géolocalisation IP Google APIS? (c'est le cas, ou je me trompe?), par rapport à d'autres services tels que ipinfo.io ?
Basj

J'ai demandé à environ 30 personnes dans différentes villes et la qualité de géolocalisation IP de Google APIS est médiocre par rapport à ipinfo.io
Basj

1
@Basj Google API fonctionne comme un charme tandis que ipinfo.io montre que je suis aux États-Unis alors que je suis en réalité en Europe centrale
patryk

15

Vous devez utiliser un service externe ... tel que http://www.hostip.info/ si vous recherchez google "geo-ip", vous pouvez obtenir plus de résultats.

L'API Host-IP est basée sur HTTP, vous pouvez donc l'utiliser en PHP ou en JavaScript selon vos besoins.


6
J'utilise hostip.info depuis un an maintenant et je ne suis PAS impressionné. Il retourne généralement des chèques 9/10 inconnus
aron

d'accord, ça me dit que j'habite à Woking ... En toute honnêteté, le bit GB est correct ... Mais je suis à Londres.
Jamie Hutber

2
Gardez à l'esprit que tout service ne sera aussi bon que les informations / données publiques disponibles. Pour des raisons de confidentialité, ces informations ne peuvent être "tellement bonnes". Si cela correspond à votre pays, et au moins à l'état / à la province, je considérerais cela comme un GAGNANT. Si vous utilisez cela pour rechercher des informations pour une attaque DOS, gardez à l'esprit que les adresses IP peuvent même ne pas être valides (non attribuées à personne ou en dehors d'une plage IP publique valide).
eselk

Sur leur site Web, je reçois "Emplacement: ... en fait, nous n'avons aucune idée.". Tout ce que je devais savoir
Bojan Kogoj

15

J'ai écrit un bot en utilisant une API de ipapi.co , voici comment vous pouvez obtenir l'emplacement d'une adresse IP (par exemple 1.2.3.4) dansphp :

Définir l'en-tête:

$opts = array('http'=>array('method'=>"GET", 'header'=>"User-Agent: mybot.v0.7.1"));
$context = stream_context_create($opts);

Obtenir une réponse JSON

echo file_get_contents('https://ipapi.co/1.2.3.4/json/', false, $context);

d'obtenir un champ spécifique (pays, fuseau horaire, etc.)

echo file_get_contents('https://ipapi.co/1.2.3.4/country/', false, $context);

1
@Eoin l'a supprimé. Il semble que l'adresse IP de phpfiddle soit restreinte.
Jaimes

10

Cette question est protégée, ce que je comprends. Cependant, je ne vois pas de réponse ici, ce que je vois, c'est que beaucoup de gens montrent ce qu'ils ont trouvé en posant la même question.

Il existe actuellement cinq registres Internet régionaux avec différents degrés de fonctionnalité qui servent de premier point de contact en ce qui concerne la propriété IP. Le processus est en mutation, c'est pourquoi les différents services ici fonctionnent parfois et pas à d'autres moments.

Who Is est (évidemment) un ancien protocole TCP, cependant - la façon dont il fonctionnait à l'origine était par connexion au port 43, ce qui rend difficile son acheminement via des connexions louées, via des pare-feu ... etc.

À l'heure actuelle, la plupart des activités effectuées via RESTful HTTP et ARIN, RIPE et APNIC disposent de services RESTful qui fonctionnent. LACNIC retourne un 503 et AfriNIC n'a apparemment pas une telle API. (Tous ont cependant des services en ligne.)

Cela vous donnera - l'adresse du propriétaire enregistré de l'IP, mais - pas l'emplacement de votre client - vous devez l'obtenir de lui et aussi - vous devez le demander. En outre, les procurations sont le moindre de vos soucis lors de la validation de l'IP que vous pensez être l'initiateur.

Les gens n'apprécient pas l'idée qu'ils sont suivis, alors - mes pensées le sont - obtenez-le directement de votre client et avec sa permission et attendez-vous à beaucoup de rechigner à la notion.


8

Regardez l'API de hostip.info - elle fournit beaucoup d'informations.
Exemple en PHP:

$data = file_get_contents("http://api.hostip.info/country.php?ip=12.215.42.19");
//$data contains: "US"

$data = file_get_contents("http://api.hostip.info/?ip=12.215.42.19");
//$data contains: XML with country, lat, long, city, etc...

Si vous faites confiance à hostip.info, cela semble être une API très utile.


1
unf. par rapport à d' autres services HostIP est waaaay off .. www.ip-adress.com cependant cloue
Scott Evernden

8

Le service dans la réponse de Ben Dowling a changé, c'est donc plus simple. Pour trouver l'emplacement, faites simplement:

// no need to pass ip any longer; ipinfo grabs the ip of the person requesting
$details = json_decode(file_get_contents("http://ipinfo.io/"));
echo $details->city; // city

Les coordonnées reviennent dans une seule chaîne comme '31, -80 ', donc à partir de là, vous venez de:

$coordinates = explode(",", $details->loc); // -> '31,-89' becomes'31','-80'
echo $coordinates[0]; // latitude
echo $coordinates[1]; // longitude

4
Vous avez raison, ipinfo.io renverra les détails de l'adresse IP de l'appelant par défaut. Si vous exécutez un site Web PHP, ce sera l'IP de votre serveur, plutôt que l'IP de l'utilisateur. C'est la raison pour laquelle vous devez transmettre $ _SERVER ['REMOTE_ADDR']. Si vous voulez juste des coordonnées, il sera plus rapide d'ajouter / localiser à l'URL pour obtenir uniquement ce champ.
Ben Dowling

Ah, c'est vrai! Et je ne connaissais pas le / loc - je le corrigerai immédiatement sur mon propre site.
Isaac Askew

7

En supposant que vous vouliez le faire vous-même et ne pas compter sur d'autres fournisseurs, IP2Nation fournit une base de données MySQL des mappages qui sont mis à jour à mesure que les registres régionaux changent les choses.


J'utilisais un service externe et soudain, mon site Web est devenu très lent. Le service externe prenait 20 bonnes secondes pour renvoyer l'information - ce qui est évidemment désastreux pour les visiteurs. J'ai donc décidé de le faire moi-même, et c'est une solution parfaite. Merci beaucoup.
Williamz902

7

J'exécute le service sur IPLocate.io , auquel vous pouvez vous connecter gratuitement en un seul appel:

<?php
$res = file_get_contents('https://www.iplocate.io/api/lookup/8.8.8.8');
$res = json_decode($res);

echo $res->country; // United States
echo $res->continent; // North America
echo $res->latitude; // 37.751
echo $res->longitude; // -97.822

var_dump($res);

L' $resobjet contiendra vos champs de géolocalisation commecountry , cityetc.

Consultez la documentation pour plus d'informations.


7

J'aime la GeoLite City gratuite de Maxmind qui fonctionne pour la plupart des applications et à partir de laquelle vous pouvez passer à une version payante si elle n'est pas assez précise. Il y a une API PHP incluse, ainsi que pour d'autres langages. Et si vous exécutez Lighttpd en tant que serveur Web, vous pouvez même utiliser un module pour obtenir les informations dans la variable SERVER pour chaque visiteur si c'est ce dont vous avez besoin.

Je dois ajouter qu'il existe également un pays Geolite gratuit (qui serait plus rapide si vous n'avez pas besoin de localiser la ville d'où provient l'IP) et l'ASN Geolite (si vous voulez savoir à qui appartient l'IP) et que finalement tout cela est téléchargeables sur votre propre serveur, sont mis à jour tous les mois et sont assez rapides à rechercher avec les API fournies car elles indiquent "des milliers de recherches par seconde".


1
Vous pouvez considérer l'IP2Location LITE lite.ip2location.com qui est gratuit. Il contient jusqu'à des informations de code postal, ce qui est très utile.
Michael C.

6

PHP a une extension pour ça.

Depuis PHP.net:

L'extension GeoIP vous permet de trouver l'emplacement d'une adresse IP. La ville, l'état, le pays, la longitude, la latitude et d'autres informations, comme le FAI et le type de connexion, peuvent être obtenus à l'aide de GeoIP.

Par exemple:

$record = geoip_record_by_name($ip);
echo $record['city'];

3
Ce n'est qu'un module php pour la base de données MaxMind, qui est un payware. (Les versions gratuites "lite" sont très imprécises.) Je ne dis pas que c'est une mauvaise chose, mais c'est vraiment seulement utile à des fins commerciales.
Quelqu'un

6

Ipdata.co est une API de géolocalisation IP rapide et hautement disponible avec des performances fiables.

Il est extrêmement évolutif avec 10 points de terminaison dans le monde, chacun capable de gérer> 10 000 demandes par seconde!

Cette réponse utilise une clé API «test» très limitée et destinée uniquement à tester quelques appels. Inscrivez -vous à votre propre clé API gratuite et recevez jusqu'à 1500 demandes par jour pour le développement.

En php

php > $ip = '8.8.8.8';
php > $details = json_decode(file_get_contents("https://api.ipdata.co/{$ip}?api-key=test"));
php > echo $details->region;
California
php > echo $details->city;
Mountain View
php > echo $details->country_name;
United States
php > echo $details->latitude;
37.751

Voici un exemple côté client montrant comment vous obtiendrez le pays, la région et la ville;

$.get("https://api.ipdata.co?api-key=test", function (response) {
	$("#response").html(JSON.stringify(response, null, 4));
  $("#country").html('Country: ' + response.country_name);
  $("#region").html('Region ' + response.region);
  $("#city").html('City' + response.city);  
}, "jsonp");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="country"></div>
<div id="region"></div>
<div id="city"></div>
<pre id="response"></pre>

Avertissement;

J'ai construit le service.

Pour des exemples en plusieurs langues, voir la documentation

Voir également cette analyse détaillée des meilleures API de géolocalisation IP.


5

Au cas où quelqu'un tomberait sur ce fil, voici une autre solution. Sur timezoneapi.io, vous pouvez demander une adresse IP et obtenir plusieurs objets en retour (j'ai créé le service). Il a été créé parce que j'avais besoin de savoir dans quel fuseau horaire mes utilisateurs se trouvaient, où dans le monde et quelle heure il était actuellement.

En PHP - renvoie l'emplacement, le fuseau horaire et la date / heure:

// Get IP address
$ip_address = getenv('HTTP_CLIENT_IP') ?: getenv('HTTP_X_FORWARDED_FOR') ?: getenv('HTTP_X_FORWARDED') ?: getenv('HTTP_FORWARDED_FOR') ?: getenv('HTTP_FORWARDED') ?: getenv('REMOTE_ADDR');

// Get JSON object
$jsondata = file_get_contents("http://timezoneapi.io/api/ip/?" . $ip_address);

// Decode
$data = json_decode($jsondata, true);

// Request OK?
if($data['meta']['code'] == '200'){

    // Example: Get the city parameter
    echo "City: " . $data['data']['city'] . "<br>";

    // Example: Get the users time
    echo "Time: " . $data['data']['datetime']['date_time_txt'] . "<br>";

}

Utilisation de jQuery:

// Get JSON object
$.getJSON('https://timezoneapi.io/api/ip', function(data){

    // Request OK?
    if(data.meta.code == '200'){

        // Log
        console.log(data);

        // Example: Get the city parameter
        var city = data.data.city;
        alert(city);

        // Example: Get the users time
        var time = data.data.datetime.date_time_txt;
        alert(time);

    }

});

4

Ce qui suit est une version modifiée d'un extrait que j'ai trouvé qui utilise http://ipinfodb.com/ip_locator.php pour obtenir ses informations. Gardez à l'esprit que vous pouvez également demander une clé API avec eux et utiliser l'API directement pour obtenir les informations fournies comme bon vous semble.

Fragment

function detect_location($ip=NULL, $asArray=FALSE) {
    if (empty($ip)) {
        if (!empty($_SERVER['HTTP_CLIENT_IP'])) { $ip = $_SERVER['HTTP_CLIENT_IP']; }
        elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; }
        else { $ip = $_SERVER['REMOTE_ADDR']; }
    }
    elseif (!is_string($ip) || strlen($ip) < 1 || $ip == '127.0.0.1' || $ip == 'localhost') {
        $ip = '8.8.8.8';
    }

    $url = 'http://ipinfodb.com/ip_locator.php?ip=' . urlencode($ip);
    $i = 0; $content; $curl_info;

    while (empty($content) && $i < 5) {
        $ch = curl_init();
        $curl_opt = array(
            CURLOPT_FOLLOWLOCATION => 1,
            CURLOPT_HEADER => 0,
            CURLOPT_RETURNTRANSFER  => 1,
            CURLOPT_URL => $url,
            CURLOPT_TIMEOUT => 1,
            CURLOPT_REFERER => 'http://' . $_SERVER['HTTP_HOST'],
        );
        if (isset($_SERVER['HTTP_USER_AGENT'])) $curl_opt[CURLOPT_USERAGENT] = $_SERVER['HTTP_USER_AGENT'];
        curl_setopt_array($ch, $curl_opt);
        $content = curl_exec($ch);
        if (!is_null($curl_info)) $curl_info = curl_getinfo($ch);
        curl_close($ch);
    }

    $araResp = array();
    if (preg_match('{<li>City : ([^<]*)</li>}i', $content, $regs)) $araResp['city'] = trim($regs[1]);
    if (preg_match('{<li>State/Province : ([^<]*)</li>}i', $content, $regs)) $araResp['state'] = trim($regs[1]);
    if (preg_match('{<li>Country : ([^<]*)}i', $content, $regs)) $araResp['country'] = trim($regs[1]);
    if (preg_match('{<li>Zip or postal code : ([^<]*)</li>}i', $content, $regs)) $araResp['zip'] = trim($regs[1]);
    if (preg_match('{<li>Latitude : ([^<]*)</li>}i', $content, $regs)) $araResp['latitude'] = trim($regs[1]);
    if (preg_match('{<li>Longitude : ([^<]*)</li>}i', $content, $regs)) $araResp['longitude'] = trim($regs[1]);
    if (preg_match('{<li>Timezone : ([^<]*)</li>}i', $content, $regs)) $araResp['timezone'] = trim($regs[1]);
    if (preg_match('{<li>Hostname : ([^<]*)</li>}i', $content, $regs)) $araResp['hostname'] = trim($regs[1]);

    $strResp = ($araResp['city'] != '' && $araResp['state'] != '') ? ($araResp['city'] . ', ' . $araResp['state']) : 'UNKNOWN';

    return $asArray ? $araResp : $strResp;
}

Utiliser

detect_location();
//  returns "CITY, STATE" based on user IP

detect_location('xxx.xxx.xxx.xxx');
//  returns "CITY, STATE" based on IP you provide

detect_location(NULL, TRUE);    //   based on user IP
//  returns array(8) { ["city"] => "CITY", ["state"] => "STATE", ["country"] => "US", ["zip"] => "xxxxx", ["latitude"] => "xx.xxxxxx", ["longitude"] => "-xx.xxxxxx", ["timezone"] => "-07:00", ["hostname"] => "xx-xx-xx-xx.host.name.net" }

detect_location('xxx.xxx.xxx.xxx', TRUE);   //   based on IP you provide
//  returns array(8) { ["city"] => "CITY", ["state"] => "STATE", ["country"] => "US", ["zip"] => "xxxxx", ["latitude"] => "xx.xxxxxx", ["longitude"] => "-xx.xxxxxx", ["timezone"] => "-07:00", ["hostname"] => "xx-xx-xx-xx.host.name.net" }

4

Si vous avez besoin d'obtenir l'emplacement à partir d'une adresse IP, vous pouvez utiliser un service geo ip fiable, vous pouvez obtenir plus de détails ici . Il prend en charge IPv6.

En prime, il permet de vérifier si l'adresse IP est un nœud tor, un proxy public ou un spammeur.

Vous pouvez utiliser javascript ou php comme ci-dessous.

Code Javascript:

$(document).ready(function () {
        $('#btnGetIpDetail').click(function () {
            if ($('#txtIP').val() == '') {
                alert('IP address is reqired');
                return false;
            }
            $.getJSON("http://ip-api.io/json/" + $('#txtIP').val(),
                 function (result) {
                     alert('City Name: ' + result.city)
                     console.log(result);
                 });
        });
    });

Code Php:

$result = json_decode(file_get_contents('http://ip-api.io/json/64.30.228.118'));
var_dump($result);

Production:

{
"ip": "64.30.228.118",
"country_code": "US",
"country_name": "United States",
"region_code": "FL",
"region_name": "Florida",
"city": "Fort Lauderdale",
"zip_code": "33309",
"time_zone": "America/New_York",
"latitude": 26.1882,
"longitude": -80.1711,
"metro_code": 528,
"suspicious_factors": {
"is_proxy": false,
"is_tor_node": false,
"is_spam": false,
"is_suspicious": false
}

3

J'ai créé un wrapper pour ipinfo.io . Vous pouvez l'installer à l'aide de composer.

Vous pouvez l'utiliser de cette manière:

$ipInfo = new DavidePastore\Ipinfo\Ipinfo();

//Get all the properties
$host = $ipInfo->getFullIpDetails("8.8.8.8");

//Read all the properties
$city = $host->getCity();
$country = $host->getCountry();
$hostname = $host->getHostname();
$ip = $host->getIp();
$loc = $host->getLoc();
$org = $host->getOrg();
$phone = $host->getPhone();
$region = $host->getRegion();

2

Vous pouvez également utiliser le service "smart-ip":

$.getJSON("http://smart-ip.net/geoip-json?callback=?",
    function (data) {
        alert(data.countryName);
        alert(data.city);
    }
);

2

J'ai fait un tas de tests avec les services d'adresse IP et voici quelques façons de le faire moi-même. Tout d'abord, un tas de liens vers des sites Web utiles que j'utilise:

https://db-ip.com/db A un service gratuit de recherche d'ip et a quelques fichiers csv gratuits que vous pouvez télécharger. Cela utilise une clé api gratuite qui est jointe à votre e-mail. Il limite à 2000 requêtes par jour.

http://ipinfo.io/ Service gratuit de recherche d'ip sans fonctions PHP à clé api:

//uses http://ipinfo.io/.
function ip_visitor_country($ip){
    $ip_data_in = get_web_page("http://ipinfo.io/".$ip."/json"); //add the ip to the url and retrieve the json data
    $ip_data = json_decode($ip_data_in['content'],true); //json_decode it for php use

    //this ip-lookup service returns 404 if the ip is invalid/not found so return false if this is the case.
    if(empty($ip_data) || $ip_data_in['httpcode'] == 404){
        return false;
    }else{
        return $ip_data; 
    }
}

function get_web_page($url){
    $user_agent = 'Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20100101 Firefox/8.0';

    $options = array(
        CURLOPT_CUSTOMREQUEST  =>"GET",        //set request type post or get
        CURLOPT_POST           =>false,        //set to GET
        CURLOPT_USERAGENT      => $user_agent, //set user agent
        CURLOPT_RETURNTRANSFER => true,     // return web page
        CURLOPT_HEADER         => false,    // don't return headers
        CURLOPT_FOLLOWLOCATION => true,     // follow redirects
        CURLOPT_ENCODING       => "",       // handle all encodings
        CURLOPT_AUTOREFERER    => true,     // set referer on redirect
        CURLOPT_CONNECTTIMEOUT => 120,      // timeout on connect
        CURLOPT_TIMEOUT        => 120,      // timeout on response
        CURLOPT_MAXREDIRS      => 10,       // stop after 10 redirects
    );
    $ch = curl_init( $url );
    curl_setopt_array( $ch, $options );
    $content = curl_exec( $ch );
    $err     = curl_errno( $ch );
    $errmsg  = curl_error( $ch );
    $header  = curl_getinfo( $ch );
    $httpCode = curl_getinfo( $ch, CURLINFO_HTTP_CODE );
    curl_close( $ch );  
    $header['errno']   = $err; //curl error code
    $header['errmsg']  = $errmsg; //curl error message
    $header['content'] = $content; //the webpage result (In this case the ip data in json array form)
    $header['httpcode'] = $httpCode; //the webpage response code
    return $header; //return the collected data and response codes
}

En fin de compte, vous obtenez quelque chose comme ceci:

Array
(
    [ip] => 1.1.1.1
    [hostname] => No Hostname
    [city] => 
    [country] => AU
    [loc] => -27.0000,133.0000
    [org] => AS15169 Google Inc.
)

http://www.geoplugin.com/ Un peu plus ancien mais ce service vous donne un tas d'informations utiles supplémentaires telles que la devise du pays, le code du continent, la longitude et plus encore.


http://lite.ip2location.com/database-ip-country-region-city-latitude-longitude Propose un tas de fichiers téléchargeables avec des instructions pour les importer dans votre base de données. Une fois que vous avez un de ces fichiers dans votre base de données, vous pouvez sélectionner les données assez facilement.

SELECT * FROM `ip2location_db5` WHERE IP > ip_from AND IP < ip_to

Utilisez la fonction php ip2long (); pour transformer l'adresse IP en une valeur numérique. Par exemple, 1.1.1.1 devient 16843009. Cela vous permet de rechercher les plages d'adresses IP fournies par le fichier de base de données.

Donc, pour savoir où 1.1.1.1 appartient à tout ce que nous faisons, lancez cette requête:

SELECT * FROM `ip2location_db5` WHERE 16843009 > ip_from AND 16843009 < ip_to;

Cela renvoie ces données à titre d'exemple.

FROM: 16843008
TO: 16843263
Country code: AU
Country: Australia
Region: Queensland
City: Brisbane
Latitude: -27.46794
Longitude: 153.02809

2

Il existe 2 grandes approches pour effectuer la géolocalisation IP: l'une consiste à télécharger un ensemble de données, à l'héberger sur votre infrastructure et à le maintenir à jour. Cela nécessite du temps et des efforts, surtout si vous devez prendre en charge un grand nombre de demandes. Une autre solution consiste à utiliser un service API existant qui gère tout le travail pour vous et plus encore.

Il existe de nombreux services de géolocalisation API: MaxMind, ip2location, Ipstack, IpInfo, etc. Récemment, l'entreprise où je travaille est passé à Ipregistry ( https://ipregistry.co ) et je participais à la décision et d'exécution. Voici quelques éléments à prendre en compte lors de la recherche d'une API de géolocalisation IP:

  • Le service est-il précis? utilisent-ils une seule source d'information?
  • Peuvent-ils vraiment gérer votre charge?
  • Fournissent-ils des temps de réponse rapides et cohérents dans le monde entier (sauf si vos utilisateurs sont spécifiques à un pays)?
  • Quel est leur modèle de tarification?

Voici un exemple pour obtenir des informations de géolocalisation IP (mais aussi des données de menace et d'agent utilisateur à l'aide d'un seul appel):

$ip = $_SERVER['REMOTE_ADDR'];
$details = json_decode(file_get_contents("https://api.ipregistry.co/{$ip}?key=tryout"));
echo $details->location;

Remarque: je ne suis pas ici pour promouvoir Ipregistry et dire que c'est le meilleur, mais j'ai passé beaucoup de temps à analyser les solutions existantes et leur solution est vraiment prometteuse.


-1

Si vous recherchez une base de données mise à jour / précise, je recommande d'utiliser celle-ci ici car elle montrait mon emplacement exact qui n'était pas inclus dans de nombreux autres services lorsque je testais.
(Ma ville était Rashtet mon pays était Iranavec cette adresse IP: 2.187.21.235quand je testais.)

Je recommande d'utiliser la base de données plutôt que les méthodes API, car elle sera traitée beaucoup plus rapidement localement.


-1

Ok, les gars, merci pour vos suggestions; Bien que j'ai 6k + d'IP, certains services échouent à mes demandes en raison de certaines limitations; Vous pouvez donc tous les utiliser en mode de repli;

Si nous avons un fichier source au format suivant:

user_id_1  ip_1
user_id_2  ip_2
user_id_3  ip_1

que vous pourriez utiliser cette simple commande d'exemple (PoC) pour Yii:

class GeoIPCommand extends CConsoleCommand
{

public function actionIndex($filename = null)
{
    //http://freegeoip.net/json/{$ip} //10k requests per hour
    //http://ipinfo.io/{$ip}/json //1k per day
    //http://ip-api.com/json/{$ip}?fields=country,city,regionName,status //150 per minute

    echo "start".PHP_EOL;

    $handle      = fopen($filename, "r");
    $destination = './good_locations.txt';
    $bad         = './failed_locations.txt';
    $badIP       = [];
    $goodIP      = [];

    $destHandle = fopen($destination, 'a+');
    $badHandle  = fopen($bad, 'a+');

    if ($handle)
    {
        while (($line = fgets($handle)) !== false)
        {
            $result = preg_match('#(\d+)\s+(\d+\.\d+\.\d+\.\d+)#', $line, $id_ip);
            if(!$result) continue;

            $id = $id_ip[1];
            $ip = $id_ip[2];
            $ok = false;

            if(isset($badIP[$ip])) 
            {
                fputs($badHandle, sprintf('%u %s'. PHP_EOL, $id, $ip));
                continue;
            }

            if(isset($goodIP[$ip]))
            {
                fputs($destHandle, sprintf('"id":"%u","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, $goodIP[$ip]));
                echo sprintf('"id":"%s","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, $goodIP[$ip]);
                continue;
            }

            $query = @json_decode(file_get_contents('http://freegeoip.net/json/'.$ip));
            $city = property_exists($query, 'region_name')? $query->region_name : '';
            $city .= property_exists($query, 'city') && $query->city && ($query->city != $city) ? ', ' . $query->city : '';

            if($city)
            {
                fputs($destHandle, sprintf('"id":"%u","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, $city));
                echo sprintf('"id":"%s","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, $city);
                $ok = true;
            }

            if(!$ok)
            {
                $query = @json_decode(file_get_contents('http://ip-api.com/json/'. $ip.'?fields=country,city,regionName,status'));
                if($query && $query->status == 'success')
                {
                    $city = property_exists($query, 'regionName')? $query->regionName : '';
                    $city .= property_exists($query, 'city') && $query->city ? ',' . $query->city : '';

                    if($city)
                    {
                        fputs($destHandle, sprintf('"id":"%u","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, $city));
                        echo sprintf('"id":"%s","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, $city);
                        $ok = true;
                    }
                }
            }

            if(!$ok)
            {
                $badIP[$ip] = false;
                fputs($badHandle, sprintf('%u %s'. PHP_EOL, $id, $ip));
                echo sprintf('"id":"%s","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, 'Unknown');
            }

            if($ok)
            {
                $goodIP[$ip] = $city;
            }
        }

        fclose($handle);
        fclose($badHandle);
        fclose($destHandle);
    }else{
        echo 'Can\'t open file' . PHP_EOL; 
        return;
    }

    return;
}

}

C'est une sorte de code de merde, mais ça marche. usage:

./yiic geoip index --filename="./source_id_ip_list.txt"

N'hésitez pas à l'utiliser, à le modifier et à le faire mieux)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.