Question

Quelqu'un connaît-il un moyen simple de récupérer le pays pour une adresse IP donnée ?De préférence au format ISO_3166-1 ?

Était-ce utile?

La solution

Beaucoup de gens (y compris mon entreprise) semblent utiliser MaxMind GeoIP.

Ils ont une version gratuite GéoLite qui n'est pas aussi précise que la version payante, mais si vous recherchez juste quelque chose de simple, cela peut suffire.

Autres conseils

Il existe deux approches :en utilisant un service Internet et en utilisant une sorte de liste locale (peut-être enveloppée dans une bibliothèque).Ce que vous voulez dépendra de ce que vous construisez.

Pour les prestations :

Pour les listes :

Voici un joli service gratuit avec une API publique :http://www.hostip.info/use.html

ipinfodb fournit une base de données gratuite et une API pour la propriété intellectuelle dans le pays et vice versa.Ils utilisent les données gratuites de MaxMind.Les données sont mises à jour chaque mois et constituent une excellente alternative gratuite avec une précision décente.

Je ne sais pas à quel point ce site hostip.info est précis.Je viens de visiter ce site et il indique que mon pays est le Canada.Je suis aux États-Unis et le FAI utilisé par mon bureau fonctionne uniquement depuis les États-Unis.Cela vous permet de corriger votre hypothèse, mais si vous utilisez ce service pour suivre les visiteurs de sites Web par pays, vous n'aurez aucun moyen de savoir si les données sont correctes.Bien sûr, je ne suis qu'un point de données.J'ai téléchargé la base de données GeoLite Country, qui n'est qu'un fichier .csv, et mon adresse IP a été correctement identifiée comme étant celle des États-Unis.

Un autre avantage de la gamme de produits MaxMind (payants ou gratuits) est que vous disposez des données et que vous ne subissez pas de pertes de performances liées à un appel de service Web vers un autre système.

Le plus précis est Digital Elements NetAcuity... pas gratuit mais vous en avez pour votre argent la plupart du temps....Élément numérique

Google retours de localisation client (mon exemple)

latlng = new google.maps.LatLng(google.loader.ClientLocation.latitude, google.loader.ClientLocation.longitude);
location = "IP location: " + getFormattedLocation();
document.getElementById("location").innerHTML = location;

Vous pouvez utiliser la solution fournie cette question.

Mais il renvoie un code de pays à 2 chiffres.

Essayez ce code php

  <?php  $ip = $_SERVER['REMOTE_ADDR'];
    $json = file_get_contents("http://api.easyjquery.com/ips/?ip=".$ip."&full=true");
    $json = json_decode($json,true);
    $timezone = $json[localTimeZone];?>

Vous pouvez utiliser mon service, http://ipinfo.io, pour ça.L'API renvoie tout un tas de détails différents sur une adresse IP :

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

Si vous recherchez uniquement le code du pays, il vous suffit d'ajouter /country à l'URL :

$ curl ipinfo.io/8.8.8.8/country
US

Voici une fonction PHP générique que vous pouvez utiliser :

function ip_details($ip) {
    $json = file_get_contents("http://ipinfo.io/{$ip}");
    $details = json_decode($json);
    return $details;
}

$details = ip_details("8.8.8.8");

echo $details->city;     // => Mountain View
echo $details->country;  // => US
echo $details->org;      // => AS15169 Google Inc.
echo $details->hostname; // => google-public-dns-a.google.com

J'ai utilisé l'adresse IP 8.8.8.8 dans ces exemples, mais si vous voulez des détails sur l'adresse IP de l'utilisateur, transmettez-les simplement $_SERVER['REMOTE_ADDR'] plutôt.Plus de détails sont disponibles sur http://ipinfo.io/developers

utilisez la fonction ipToCountry($ip) de http://www.mmtutorialvault.com/php-ip-to-country-function/

vous pouvez utiliser des API de service Web qui effectuent ce travail comme :

see example of service: http://ip-api.com and usage: http://whatmyip.info

Voir ipdata.co qui vous donne plusieurs points de données à partir d'une adresse IP.

L'API est assez rapide, avec 10 points de terminaison mondiaux chacun capable de gérer plus de 800 millions d'appels par jour.

Voici un exemple de curl ;

curl https://api.ipdata.co/78.8.53.5
{
    "ip": "78.8.53.5",
    "city": "G\u0142og\u00f3w",
    "region": "Lower Silesia",
    "region_code": "DS",
    "country_name": "Poland",
    "country_code": "PL",
    "continent_name": "Europe",
    "continent_code": "EU",
    "latitude": 51.6461,
    "longitude": 16.1678,
    "asn": "AS12741",
    "organisation": "Netia SA",
    "postal": "67-200",
    "currency": "PLN",
    "currency_symbol": "z\u0142",
    "calling_code": "48",
    "flag": "https://ipdata.co/flags/pl.png",
    "emoji_flag": "\ud83c\uddf5\ud83c\uddf1",
    "time_zone": "Europe/Warsaw",
    "is_eu": true,
    "suspicious_factors": {
        "is_tor": false
    }
}⏎  

Vous pouvez essayer gratuitement Base de données IP2Location LITE

Pour créer la table dans MySQL

CREATE DATABASE ip2location;
USE ip2location;
CREATE TABLE `ip2location_db1`(
    `ip_from` INT(10) UNSIGNED,
    `ip_to` INT(10) UNSIGNED,
    `country_code` CHAR(2),
    `country_name` VARCHAR(64),
    INDEX `idx_ip_to` (`ip_to`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

Pour importer les données

LOAD DATA LOCAL
    INFILE 'IP2LOCATION-LITE-DB1.CSV'
INTO TABLE
    `ip2location_db1`
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 0 LINES;

Code PHP pour interroger MySQL

<?php
// Replace this MYSQL server variables with actual configuration
$mysql_server = "mysql_server.com";
$mysql_user_name = "UserName";
$mysql_user_pass = "Password";

// Retrieve visitor IP address from server variable REMOTE_ADDR
$ipaddress = $_SERVER["REMOTE_ADDR"];

// Convert IP address to IP number for querying database
$ipno = Dot2LongIP($ipaddress);

// Connect to the database server
$link = mysql_connect($mysql_server, $mysql_user_name, $mysql_user_pass) or die("Could not connect to MySQL database");

// Connect to the IP2Location database
mysql_select_db("ip2location") or die("Could not select database");

// SQL query string to match the recordset that the IP number fall between the valid range
$query = "SELECT * FROM ip2location_db1 WHERE $ipno <= ip_to LIMIT 1";

// Execute SQL query
$result = mysql_query($query) or die("IP2Location Query Failed");

// Retrieve the recordset (only one)
$row = mysql_fetch_object($result);

// Keep the country information into two different variables
$country_code = $row->country_code;
$country_name = $row->country_name;

echo "Country_code: " . $country_code . "<br/>";
echo "Country_name: " . $country_name . "<br />";

// Free recordset and close database connection
mysql_free_result($result);
mysql_close($link);

// Function to convert IP address (xxx.xxx.xxx.xxx) to IP number (0 to 256^4-1)
function Dot2LongIP ($IPaddr) {
 if ($IPaddr == "")
 {
   return 0;
 } else {
   $ips = explode(".", $IPaddr);
   return ($ips[3] + $ips[2] * 256 + $ips[1] * 256 * 256 + $ips[0] * 256 * 256 * 256);
 }
}
?>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top