Obtention de la localisation à partir D'une adresse IP

je veux récupérer des informations comme la ville, l'état, et le pays d'un visiteur à partir de leur adresse IP, afin que je puisse personnaliser ma page Web en fonction de leur emplacement. Y a-t-il une bonne et fiable façon de faire cela 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.

171
demandé sur Ben Dowling 2009-01-04 01:27:01

24 réponses

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. C'est l'option plus simple, car il ne nécessite pas d'installation, 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 de 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>
211
répondu Ben Dowling 2017-01-03 20:44:09

pensait que je posterais car 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 obtenir de retourner dans les formats alternatifs et / ou substituts, 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 vouloir:

{
      "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": ""

}
56
répondu Jamie Hutber 2016-12-07 15:19:30

vous devez utiliser un service externe... comme http://www.hostip.info / si vous utilisez google pour rechercher" 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 JavaScript selon vos besoins.

15
répondu null 2009-01-03 22:33:54

utilisant 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>
15
répondu Raposo 2012-08-23 18:20:38

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

en-tête de série:

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

Obtenir de 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);
14
répondu Jaimes 2017-07-02 06:08:02

un pur exemple Javascript, en utilisant les services de https://geoip-db.com ils fournissent une solution de rappel JSON et JSONP.

Pas de jQuery nécessaire!

<!DOCTYPE html>
<html>
<head>
<title>Geo City Locator by geoip-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://geoip-db.com/json/geoip.php?jsonp=callback';
    var h = document.getElementsByTagName('script')[0];
    h.parentNode.insertBefore(script, h);

</script> 
</html>
10
répondu Kurt Van den Branden 2017-10-09 12:21:56

je ferai la même réponse que j'ai faite ici car le service est disponible pour PHP aussi:

j'aime la liberté GeoLite City de l' Maxmind qui fonctionne pour la plupart applications et à partir de laquelle vous pouvez mise à niveau vers une version payante si elle est pas assez précis. Il y a un PHP API inclus, ainsi que pour d'autres langue. Et si vous êtes en cours d'exécution Lighttpd en tant que serveur web, vous pouvez même utilisez un module pour obtenir le informations dans la variable SERVER pour chaque visiteur si c'est ce que vous avez besoin.

je devrais ajouter Il ya aussi un libre Geolite Pays (ce qui serait plus vite si vous n'avez pas besoin de préciser la ville de l'adresse IP à partir de) et Geolite L'ASN (si vous voulez savoir à qui appartient le IP) et que finalement tout cela sont téléchargeable sur votre propre serveur, sont mise à jour chaque mois et sont assez rapide à chercher avec les API fournies comme ils disent " des milliers de recherches par seconde".

7
répondu lpfavreau 2017-05-23 12:34:48

regardez L'API de hostip.info - il 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 avez confiance hostip.info il semble être très utile de l'API.

7
répondu Isaac Waller 2014-06-02 09:18:27

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

6
répondu James Cape 2009-01-03 22:39:12

PHP a une extension pour cela.

De PHP.net:

L'extension GeoIP vous permet de trouver l'emplacement d'une adresse IP. Ville, État, Pays, Longitude, Latitude et autres renseignements tous, tels que le type de connexion ISP et peuvent être obtenus à l'aide de GeoIP.

par exemple:

$record = geoip_record_by_name($ip);
echo $record['city'];
6
répondu Ian Hunter 2011-12-12 21:51:07

le service dans la réponse de Ben Dowling a changé, donc c'est maintenant plus simple. Pour trouver l'emplacement, il suffit de faire:

// 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 chaîne simple comme '31, -80', donc de là vous juste:

$coordinates = explode(",", $details->loc); // -> '31,-89' becomes'31','-80'
echo $coordinates[0]; // latitude
echo $coordinates[1]; // longitude
6
répondu Isaac Askew 2014-11-12 17:46:35

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 en montrant ce qu'ils ont d'avoir la même question.

à l'heure actuelle, il existe cinq registres régionaux de l'Internet, dont la fonctionnalité varie d'un registre à l'autre, qui constituent le premier point de contact en ce qui concerne la propriété intellectuelle. Le processus est en évolution, c'est pourquoi les divers services ici fonctionnent parfois et ne fonctionnent pas à d'autres moments.

qui 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 de l'obtenir routé par des connexions louées, par pare-feu...etc.

en ce moment -- la plupart qui est fait via RESTful HTTP et ARIN, RIPE et APNIC ont des services RESTful qui fonctionnent. LACNIC renvoie un 503 et AfriNIC n'a apparemment pas d'API. (Tous ont cependant des services en ligne.)

Cela vous permettra -- l'adresse du propriétaire enregistré de L'IP, mais -- pas l'emplacement de votre client -- vous devez obtenir cela d'eux 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 la notion qu'ils sont suivis, donc -- mes pensées sont -- obtenez-le de votre client directement et avec leur permission et attendez beaucoup à balancer à la notion.

6
répondu jinzai 2016-09-14 14:38:24

si quelqu'un tombe sur ce fil, voici une autre solution. À 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 je devais savoir dans quel fuseau horaire mes utilisateurs étaient, où dans le monde et quelle heure il est 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>";

}

utilisant 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);

    }

});
5
répondu Michael Nilsson 2017-01-06 02:39:57

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

c'est extrêmement évolutif avec 10 endpoints à travers le monde, chacun capable de traiter plus de 10 000 requêtes par seconde!

cette réponse utilise une clé API 'test' qui est très limitée et qui ne sert qu'à tester quelques appels. S'inscrire pour votre propre clé API gratuite et obtenir jusqu'à 1500 demandes par jour pour 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 obtiendriez 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 le Docs

Voir Aussi ce analyse détaillée de la meilleure IP Geolocation Api.

5
répondu Jonathan 2018-08-30 15:29:03

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.

Extrait de

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
répondu SpYk3HH 2013-08-29 13:42:27

j'ai créé un wrapper pour ipinfo.io . Vous pouvez l'installer en utilisant composer.

Vous pouvez l'utiliser de cette façon:

$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();
3
répondu Davide Pastore 2014-11-19 10:21:48

je dirige le service à IPLocate.io , dans lequel vous pouvez vous connecter gratuitement avec un simple 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'objet $res contiendra vos champs de géolocalisation comme country , city , etc.

consultez le docs pour plus d'information.

3
répondu ttarik 2017-11-15 01:00:02

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
répondu Roman Pushkin 2013-12-23 15:55:33

j'ai fait un tas de tests avec des services d'adresses 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 de recherche ip gratuit et a quelques fichiers csv gratuits que vous pouvez télécharger. Cela utilise une clé api gratuite qui est attachée à votre email. Il limite à 2000 requêtes par jour.

http://ipinfo.io / Recherche ip gratuite service sans clé api Fonctions PHP:

//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
}

À la fin 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 vieux mais ce service vous donne un tas d'informations utiles supplémentaires tels que la monnaie hors du pays, le code continent, la longitude et plus encore.


http://lite.ip2location.com/database-ip-country-region-city-latitude-longitude Offre 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 valeur numérique. Par exemple 1.1.1.1 devient 16843009. Cela vous permet de rechercher les plages d'adresses ip fournies par la base de données fichier.

donc pour trouver où 1.1.1.1 appartient à tout ce que nous faisons est d'exécuter cette requête:

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

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
répondu Crecket 2015-09-04 11:53:33

si vous avez besoin d'obtenir l'emplacement d'une adresse IP, vous pouvez utiliser le service fiable geo ip, vous pouvez obtenir plus de détails ici . Il supporte IPv6.

en bonus, il permet de vérifier si l'adresse ip est un noeud tor, un proxy public ou un spammer.

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);

Sortie:

{
"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
}
2
répondu Vindhyachal Kumar 2017-07-29 14:08:06

j'ai écrit cet article il y a quelques mois et je pourrais vous être utile. L'article décrit sur l'utilisation de la base de données open source du pays ip 2 et décrit également à propos d'une classe php que j'ai écrit pour obtenir que la base de données open source fonctionne. Voici le lien

http://www.samundra.com.np/find-visitors-country-using-his-ip-address/1018

si vous avez besoin d'aide à ce sujet s'il vous plaît laisser-moi un commentaire dans le site.

J'espère que ça vous aidera.

0
répondu Samundra 2012-08-23 18:27:44

si vous cherchez une base de données mise à jour/précise, je vous recommande d'utiliser celle-ci ici parce qu'elle indiquait mon emplacement exact qui n'était pas inclus dans beaucoup d'autres services lorsque j'ai été tester.

(Ma ville était Rasht et mon pays était Iran avec cette adresse ip: 2.187.21.235 quand je testais.)

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

0
répondu Mojtaba Rezaeian 2015-06-09 15:04:16

Ok, les gars, merci pour vos suggestions; Bien que j'ai 6k+ de IPs, certains services échoueront à mes demandes en raison de certaines limites; Ainsi, vous pourriez les utiliser tous en mode de repli;

si nous avons le 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 expample (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 merdique, mais ça marche. usage:

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

se Sentir libre de l'utiliser, de le modifier, et de le faire mieux )

0
répondu alexglue 2015-12-15 12:30:28

vieux post mais encore, j'ai essayé presque tous les services suggérés ici et le plus précis et rapide que j'utilise pour la production est: https://ip2location-api.com

ils ont des solutions Côté Serveur et Client, JSON/XML/CSV / PHP formats, JSON ajax ou javascript fonction callback, consultez la documentation ici

{"as":"AS15169 Google LLC","city":"Newark","country":"United States","countryCode":"US","isp":"Google Cloud","lat":40.7357,"lon":-74.1724,"org":"Google Cloud","query":"35.188.125.133","region":"NJ","regionName":"New Jersey","status":"success","timezone":"America/New_York","zip":"07175"}
-2
répondu Jay Cohen 2018-10-02 12:55:03