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?
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.
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 .
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
");
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;
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
.
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.
$country_code = trim(file_get_contents("http://ipinfo.io/{$ip_address}/country"))
vous obtiendrez le code du pays.
Regardez les fonctions GeoIP sous "Autres extensions de base". http://php.net/manual/en/book.geoip.php
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.
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
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
}
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.
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
}
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
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.
Utilisez le widget www.feedsalive.com , pour obtenir également les informations sur le pays et la dernière page.
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>";
?>