web-dev-qa-db-fra.com

Obtenir le pays de l'adresse IP avec PHP

Idéalement, j'essaie de créer un script PHP que je puisse interroger à partir de n'importe quel navigateur Web. Le pays de l'adresse IP qui a accédé au script PHP est renvoyé.

Est-ce possible ou existe-t-il une meilleure solution?

88
Tristan

Vous pouvez utiliser des API simples et gratuites, comme celles-ci:

Ce qui vous semble le plus digne de confiance est à vous :)

Sinon, certains scripts sont basés sur des bases de données locales sur votre serveur. Les données de la base de données doivent cependant être mises à jour régulièrement. Découvrez celui-ci:

HTH!

Edit: Et bien sûr, en fonction de votre projet, vous voudrez peut-être examiner HTML5 Location features. Vous ne pouvez pas encore les utiliser sur Internet Explorer (IE9 le prendra en charge, il reste encore beaucoup à faire), mais si votre public cible est principalement composé d'appareils mobiles ou de Safari/Firefox, n'hésitez pas!

Une fois que vous avez les coordonnées, vous pouvez inverser leur géocodage en un code de pays. Encore une fois, il y a des API comme celle-ci:

Mise à jour, avril 2013
Aujourd'hui, je recommanderais l’utilisation de Geocoder , une bibliothèque PHP qui permet de géocoder très facilement les adresses IP ainsi que les données d’adresses postales.

*** Mise à jour, septembre 2016
La politique de confidentialité de Google ayant changé, vous ne pouvez pas utiliser l'API de géolocalisation HTML5 si votre serveur ne possède pas de certificat HTPPS ou si l'utilisateur ne vous autorise pas à vérifier son emplacement. Alors maintenant, vous pouvez utiliser l’IP de l’utilisateur et vous connecter à PHP ou obtenir un certificat HTTPS.

86
sprain

Il existe différentes API Web qui le feront pour vous. Voici un exemple utilisant mon service, http://ipinfo.io :

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

Les API Web sont une solution simple et rapide, mais si vous devez effectuer beaucoup de recherches, disposer d'une base de données IP -> Pays sur votre propre ordinateur est une meilleure solution. MaxMind propose une base de données free que vous pouvez utiliser avec différentes bibliothèques PHP, y compris GeoIP .

53
Ben Dowling

Vous pouvez télécharger ip-tables depuis MaxMind:

http://www.maxmind.com/app/geolite

Importez le fichier CSV dans votre base de données (veillez à créer un index pour ip_long_from + ip_long_to). Ensuite, vous pouvez simplement faire:

$iplong = ip2long($_SERVER['REMOTE_ADDR']);

// should use mysqli with prepared statements etc, but just an example
mysql_query("
    SELECT country
    FROM ip_table
    WHERE $iplong BETWEEN ip_long_from AND ip_long_to
    LIMIT 1
");
25
quano

Voici un exemple utilisant http://www.geoplugin.net/json.gp

$ip = $_SERVER['REMOTE_ADDR'];
$details = json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip={$ip}"));
echo $details;
9
channasmcs

Vous pouvez obtenir le pays à partir de l'adresse IP avec cette API location

Code

    echo file_get_contents('https://ipapi.co/8.8.8.8/country/');

Réponse

   US 

Voici un violon . La réponse est text lorsque vous interrogez un champ spécifique, par exemple. country ici. Aucun décodage nécessaire, branchez-le simplement dans votre code. 

P.S. Si vous voulez tous les champs, par exemple https://ipapi.co/8.8.8.8/json/, la réponse est JSON.

6
Francis

Je vois qu'il y a beaucoup de réponses, mais aucune d'entre elles ne mentionne https://freegeoip.net/

Vous êtes autorisé jusqu'à 15,000 queries per hour. Je pense que cela suffit dans la plupart des cas. Sinon, vous devriez penser à utiliser les bases de données locales depuis MaxMind GeoIP .

Freegeoip est open-source et vous pouvez trouver des sources sur github , le déployer localement et vous débarrasser des limites de la requête.

De plus, le service fournit latitude/longitude/fuseau horaire et d'autres éléments utiles. 

5
ivan.mylyanyk
$country_code = trim(file_get_contents("http://ipinfo.io/{$ip_address}/country"))

vous obtiendrez le code du pays.

4
Mohammad Anini

Regardez les fonctions GeoIP sous "Autres extensions de base". http://php.net/manual/en/book.geoip.php

4
John Franklin

Je lance le service sur IPLocate.io , auquel vous pouvez vous connecter gratuitement en 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 tels que country, city, etc.

Consultez les docs pour plus d’informations.

1
ttarik

Installez et utilisez l'extension GeoIP de PHP si vous le pouvez. Sur Debian Lenny:

Sudo wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
Sudo gunzip GeoLiteCity.dat.gz
Sudo mkdir -v /usr/share/GeoIP
Sudo mv -v GeoLiteCity.dat /usr/share/GeoIP/GeoIPCity.dat

Sudo apt-get install php5-geoip
# or Sudo apt-get install php-geoip for PHP7

et ensuite l'essayer en PHP:

$ip = $_SERVER['REMOTE_ADDR'];
$country = geoip_country_name_by_name($ip);
echo 'The current user is located in: ' . $country;

résultats:

The current user is located in: Cameroon
1
che-azeh

Vous pouvez utiliser https://ip-api.io/ pour obtenir le nom du pays, le nom de la ville, la latitude et la longitude. Il supporte IPv6.

En prime, il dira si l'adresse IP est un nœud tor, un proxy public ou un spammeur. 

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
}
1
Vindhyachal Kumar

Voici une autre API gratuite pour les requêtes de géolocalisation: http://geoip.nekudo.com

Les réponses sont au format JSON. De plus, le code source de l'API est disponible sur github au cas où vous auriez besoin de configurer votre propre API.

1
nekudo

J'ai trouvé ce blog très utile. Cela m'a sauvé la journée. http://www.techsirius.com/2014/05/simple-geo-tracking-system.html

Fondamentalement, vous devez installer la table de base de données IP puis faire une requête mysql pour l’adresse IP.

<?php
include 'config.php';
mysql_connect(DB_Host, DB_USER, DB_PASSWORD) OR die(mysql_error());
mysql_select_db(DB_NAME) OR die(mysql_error());
$ip =  $_SERVER['REMOTE_ADDR'];
$long = sprintf('%u', ip2long($ip));
$sql = "SELECT * FROM `geo_ips` WHERE '$long' BETWEEN `ip_start` AND `ip_end`";
$result = mysql_query($sql) OR die(mysql_error());
$ip_detail = mysql_fetch_assoc($result);
if($ip_detail){
    echo $ip_detail['country']."', '".$ip_detail['state']."', '".$ip_detail['city'];
}
else{
    //Something wrong with IP
}
1
Webby

Si vous avez besoin d’une bonne base de données mise à jour, de meilleures performances et de ne pas solliciter de services externes de votre site Web, ici il existe un bon endroit pour télécharger des bases de données actualisées et précises. 

Je recommande cela parce que, selon mon expérience, il fonctionnait très bien, y compris pour les adresses IP de ma ville et de mon pays, que la plupart des autres bases de données/apis n’ont pas renseignées/indiquent mon emplacement sauf ce service qui m’a dirigé vers cette base de données.
(Mon adresse IP était de "Rasht" Ville en "Iran" lorsque je testais et l'adresse IP était: 2.187.21.235 égal à 45815275)

Par conséquent, je vous recommande d'utiliser ces services si vous ne savez pas quel service est le plus précis:

Base de données: http://lite.ip2location.com/databases

Service API: http://ipinfodb.com/ip_location_api.php

0
Mojtaba Rezaeian

Ipdata.co fournit une API évolutive pour le faire. Avec 10 points de terminaison globaux, chacun pouvant traiter plus de 800 millions de demandes par jour!

Il vous indique également l'organisation, la devise, le fuseau horaire, le code d'appel, l'indicateur et les données d'état du noeud de sortie Tor à partir de toute adresse IPv4 ou IPv6.

En php

php > $ip = '8.8.8.8';
php > $details = json_decode(file_get_contents("https://api.ipdata.co/{$ip}"));
php > echo $details->region;
California
php > echo $details->city;
Mountain View
php > echo $details->country_name;
United States
php > echo $details->location;
37.405991,-122.078514

Avertissement

J'ai construit ce service.

0
Jonathan

Utilisez le widget www.feedsalive.com , pour obtenir également les informations sur le pays et la dernière page.

0
Sha

Vous pouvez essayer les services de https://www.geoip-db.com Ils fournissent une solution de rappel JSON ou JSONP.

<?php

    $json = file_get_contents("https://www.geoip-db.com/json");
    $data = json_decode($json);

    print $data->country_code . "<br>";
    print $data->country_name . "<br>";
    print $data->state . "<br>";
    print $data->city . "<br>";
    print $data->postal . "<br>";
    print $data->latitude . "<br>";
    print $data->longitude . "<br>";
    print $data->IPv4 . "<br>";

?>
0