Obtenir le pays des visiteurs de leur IP

je veux obtenir des visiteurs pays via leur IP... En ce moment j'utilise ceci ( http://api.hostip.info/country.php?ip= ...... )

Voici mon code:

<?php

if (isset($_SERVER['HTTP_CLIENT_IP']))
{
    $real_ip_adress = $_SERVER['HTTP_CLIENT_IP'];
}

if (isset($_SERVER['HTTP_X_FORWARDED_FOR']))
{
    $real_ip_adress = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
else
{
    $real_ip_adress = $_SERVER['REMOTE_ADDR'];
}

$cip = $real_ip_adress;
$iptolocation = 'http://api.hostip.info/country.php?ip=' . $cip;
$creatorlocation = file_get_contents($iptolocation);

?>

Eh bien, ça marche correctement, mais le truc c'est que ça renvoie le code du pays comme nous ou CA., et pas le nom entier du pays comme les États-Unis ou le Canada.

donc, y a-t-il une bonne alternative à hostip.info offre ça?

je sais que je peux juste écrire un code qui finira par transformer ces deux lettres en nom de pays entier, mais je suis juste trop paresseux pour écrire un code qui contient tous les pays...

P. S: pour une raison quelconque, Je ne veux pas utiliser un fichier CSV prêt à l'emploi ou tout autre code qui saisira cette information pour moi, quelque chose comme ip2country ready made code et CSV.

180
demandé sur fedorqui 2012-09-23 18:33:17

21 réponses

essayez cette simple fonction PHP.

<?php

function ip_info($ip = NULL, $purpose = "location", $deep_detect = TRUE) {
    $output = NULL;
    if (filter_var($ip, FILTER_VALIDATE_IP) === FALSE) {
        $ip = $_SERVER["REMOTE_ADDR"];
        if ($deep_detect) {
            if (filter_var(@$_SERVER['HTTP_X_FORWARDED_FOR'], FILTER_VALIDATE_IP))
                $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
            if (filter_var(@$_SERVER['HTTP_CLIENT_IP'], FILTER_VALIDATE_IP))
                $ip = $_SERVER['HTTP_CLIENT_IP'];
        }
    }
    $purpose    = str_replace(array("name", "\n", "\t", " ", "-", "_"), NULL, strtolower(trim($purpose)));
    $support    = array("country", "countrycode", "state", "region", "city", "location", "address");
    $continents = array(
        "AF" => "Africa",
        "AN" => "Antarctica",
        "AS" => "Asia",
        "EU" => "Europe",
        "OC" => "Australia (Oceania)",
        "NA" => "North America",
        "SA" => "South America"
    );
    if (filter_var($ip, FILTER_VALIDATE_IP) && in_array($purpose, $support)) {
        $ipdat = @json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip=" . $ip));
        if (@strlen(trim($ipdat->geoplugin_countryCode)) == 2) {
            switch ($purpose) {
                case "location":
                    $output = array(
                        "city"           => @$ipdat->geoplugin_city,
                        "state"          => @$ipdat->geoplugin_regionName,
                        "country"        => @$ipdat->geoplugin_countryName,
                        "country_code"   => @$ipdat->geoplugin_countryCode,
                        "continent"      => @$continents[strtoupper($ipdat->geoplugin_continentCode)],
                        "continent_code" => @$ipdat->geoplugin_continentCode
                    );
                    break;
                case "address":
                    $address = array($ipdat->geoplugin_countryName);
                    if (@strlen($ipdat->geoplugin_regionName) >= 1)
                        $address[] = $ipdat->geoplugin_regionName;
                    if (@strlen($ipdat->geoplugin_city) >= 1)
                        $address[] = $ipdat->geoplugin_city;
                    $output = implode(", ", array_reverse($address));
                    break;
                case "city":
                    $output = @$ipdat->geoplugin_city;
                    break;
                case "state":
                    $output = @$ipdat->geoplugin_regionName;
                    break;
                case "region":
                    $output = @$ipdat->geoplugin_regionName;
                    break;
                case "country":
                    $output = @$ipdat->geoplugin_countryName;
                    break;
                case "countrycode":
                    $output = @$ipdat->geoplugin_countryCode;
                    break;
            }
        }
    }
    return $output;
}

?>

comment utiliser:

Example1: obtenir l'adresse IP du visiteur

<?php

echo ip_info("Visitor", "Country"); // India
echo ip_info("Visitor", "Country Code"); // IN
echo ip_info("Visitor", "State"); // Andhra Pradesh
echo ip_info("Visitor", "City"); // Proddatur
echo ip_info("Visitor", "Address"); // Proddatur, Andhra Pradesh, India

print_r(ip_info("Visitor", "Location")); // Array ( [city] => Proddatur [state] => Andhra Pradesh [country] => India [country_code] => IN [continent] => Asia [continent_code] => AS )

?>

exemple 2: Obtenir les détails de n'importe quelle adresse IP. [Support IPV4 & IPV6]

<?php

echo ip_info("173.252.110.27", "Country"); // United States
echo ip_info("173.252.110.27", "Country Code"); // US
echo ip_info("173.252.110.27", "State"); // California
echo ip_info("173.252.110.27", "City"); // Menlo Park
echo ip_info("173.252.110.27", "Address"); // Menlo Park, California, United States

print_r(ip_info("173.252.110.27", "Location")); // Array ( [city] => Menlo Park [state] => California [country] => United States [country_code] => US [continent] => North America [continent_code] => NA )

?>
424
répondu Chandra Nakka 2014-10-04 14:02:07

vous pouvez utiliser une API simple de http://www.geoplugin.net /

$xml = simplexml_load_file("http://www.geoplugin.net/xml.gp?ip=".getRealIpAddr());
echo $xml->geoplugin_countryName ;


echo "<pre>";
foreach ($xml as $key => $value)
{
    echo $key , "= " , $value ,  " \n" ;
}
echo "</pre>";

Fonction Utilisée

function getRealIpAddr()
{
    if (!empty($_SERVER['HTTP_CLIENT_IP']))   //check ip from share internet
    {
      $ip=$_SERVER['HTTP_CLIENT_IP'];
    }
    elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))   //to check ip is pass from proxy
    {
      $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
    }
    else
    {
      $ip=$_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}

sortie

United States
geoplugin_city= San Antonio
geoplugin_region= TX
geoplugin_areaCode= 210
geoplugin_dmaCode= 641
geoplugin_countryCode= US
geoplugin_countryName= United States
geoplugin_continentCode= NA
geoplugin_latitude= 29.488899230957
geoplugin_longitude= -98.398696899414
geoplugin_regionCode= TX
geoplugin_regionName= Texas
geoplugin_currencyCode= USD
geoplugin_currencySymbol= $
geoplugin_currencyConverter= 1

il vous fait avoir tant d'options que vous pouvez jouer autour avec

Merci

:)

44
répondu Baba 2014-11-13 18:56:52

j'ai essayé la réponse de Chandra mais la configuration de mon serveur ne permet pas file_get_contents ()

PHP Warning: file_get_contents() URL file-access is disabled in the server configuration

j'ai modifié le code de Chandra pour qu'il fonctionne aussi pour des serveurs comme celui utilisant cURL:

function ip_visitor_country()
{

    $client  = @$_SERVER['HTTP_CLIENT_IP'];
    $forward = @$_SERVER['HTTP_X_FORWARDED_FOR'];
    $remote  = $_SERVER['REMOTE_ADDR'];
    $country  = "Unknown";

    if(filter_var($client, FILTER_VALIDATE_IP))
    {
        $ip = $client;
    }
    elseif(filter_var($forward, FILTER_VALIDATE_IP))
    {
        $ip = $forward;
    }
    else
    {
        $ip = $remote;
    }
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "http://www.geoplugin.net/json.gp?ip=".$ip);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    $ip_data_in = curl_exec($ch); // string
    curl_close($ch);

    $ip_data = json_decode($ip_data_in,true);
    $ip_data = str_replace('&quot;', '"', $ip_data); // for PHP 5.2 see stackoverflow.com/questions/3110487/

    if($ip_data && $ip_data['geoplugin_countryName'] != null) {
        $country = $ip_data['geoplugin_countryName'];
    }

    return 'IP: '.$ip.' # Country: '.$country;
}

echo ip_visitor_country(); // output Coutry name

?>

Espère que ça aide ;-)

20
répondu Kai Noack 2014-02-19 12:46:30

en fait, vous pouvez appeler http://api.hostip.info/?ip=123.125.114.144 pour obtenir l'information, qui est présentée en XML.

12
répondu Marcus 2012-09-23 14:38:54

utilisez MaxMind GeoIP (ou GeoIPLite si vous n'êtes pas prêt à payer).

$gi = geoip_open('GeoIP.dat', GEOIP_MEMORY_CACHE);
$country = geoip_country_code_by_addr($gi, $_SERVER['REMOTE_ADDR']);
geoip_close($gi);
10
répondu Joyce Babu 2012-09-23 14:39:47

Use services suivants

1) http://api.hostip.info/get_html.php?ip=12.215.42.19

2)

$json = file_get_contents('http://freegeoip.appspot.com/json/66.102.13.106');
$expression = json_decode($json);
print_r($expression);

3) http://ipinfodb.com/ip_location_api.php

10
répondu GBD 2012-09-23 14:40:27

Check out php-ip-2-pays à partir du code.Google. La base de données est mise à jour quotidiennement, de sorte qu'il n'est pas nécessaire de se connecter à un serveur extérieur pour vérifier si vous hébergez votre propre serveur SQL. Ainsi, en utilisant le code, vous n'auriez qu'à taper:

<?php
$ip = $_SERVER['REMOTE_ADDR'];

if(!empty($ip)){
        require('./phpip2country.class.php');

        /**
         * Newest data (SQL) avaliable on project website
         * @link http://code.google.com/p/php-ip-2-country/
         */
        $dbConfigArray = array(
                'host' => 'localhost', //example host name
                'port' => 3306, //3306 -default mysql port number
                'dbName' => 'ip_to_country', //example db name
                'dbUserName' => 'ip_to_country', //example user name
                'dbUserPassword' => 'QrDB9Y8CKMdLDH8Q', //example user password
                'tableName' => 'ip_to_country', //example table name
        );

        $phpIp2Country = new phpIp2Country($ip,$dbConfigArray);
        $country = $phpIp2Country->getInfo(IP_COUNTRY_NAME);
        echo $country;
?>

exemple de Code (tiré de la ressource)

<?
require('phpip2country.class.php');

$dbConfigArray = array(
        'host' => 'localhost', //example host name
        'port' => 3306, //3306 -default mysql port number
        'dbName' => 'ip_to_country', //example db name
        'dbUserName' => 'ip_to_country', //example user name
        'dbUserPassword' => 'QrDB9Y8CKMdLDH8Q', //example user password
        'tableName' => 'ip_to_country', //example table name
);

$phpIp2Country = new phpIp2Country('213.180.138.148',$dbConfigArray);

print_r($phpIp2Country->getInfo(IP_INFO));
?>

Sortie

Array
(
    [IP_FROM] => 3585376256
    [IP_TO] => 3585384447
    [REGISTRY] => RIPE
    [ASSIGNED] => 948758400
    [CTRY] => PL
    [CNTRY] => POL
    [COUNTRY] => POLAND
    [IP_STR] => 213.180.138.148
    [IP_VALUE] => 3585378964
    [IP_FROM_STR] => 127.255.255.255
    [IP_TO_STR] => 127.255.255.255
)
10
répondu AbsoluteƵERØ 2013-11-13 04:22:12

nous pouvons utiliser geobytes.com pour obtenir l'emplacement en utilisant l'adresse IP de l'utilisateur

$user_ip = getIP();
$meta_tags = get_meta_tags('http://www.geobytes.com/IPLocator.htm?GetLocation&template=php3.txt&IPAddress=' . $user_ip);
echo '<pre>';
print_r($meta_tags);

il retournera des données comme ceci

Array(
    [known] => true
    [locationcode] => USCALANG
    [fips104] => US
    [iso2] => US
    [iso3] => USA
    [ison] => 840
    [internet] => US
    [countryid] => 254
    [country] => United States
    [regionid] => 126
    [region] => California
    [regioncode] => CA
    [adm1code] =>     
    [cityid] => 7275
    [city] => Los Angeles
    [latitude] => 34.0452
    [longitude] => -118.2840
    [timezone] => -08:00
    [certainty] => 53
    [mapbytesremaining] => Free
)

fonction pour obtenir L'IP de l'utilisateur

function getIP(){
if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])){
    $pattern = "/^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/";
    if(preg_match($pattern, $_SERVER["HTTP_X_FORWARDED_FOR"])){
            $userIP = $_SERVER["HTTP_X_FORWARDED_FOR"];
    }else{
            $userIP = $_SERVER["REMOTE_ADDR"];
    }
}
else{
  $userIP = $_SERVER["REMOTE_ADDR"];
}
return $userIP;
}
10
répondu Ram Sharma 2014-09-01 10:06:14

essayez ce simple code d'une ligne, vous obtiendrez le pays et la ville des visiteurs de leur adresse IP distante.

$tags = get_meta_tags('http://www.geobytes.com/IpLocator.htm?GetLocation&template=php3.txt&IpAddress=' . $_SERVER['REMOTE_ADDR']);
echo $tags['country'];
echo $tags['city'];
9
répondu Sankar Jay 2014-07-22 09:24:40

il existe une version flat-file bien tenue de la base de données ip->country maintenue par la communauté Perl à CPAN

L'accès à ces fichiers ne nécessite pas un serveur de données, et les données elles-mêmes est d'environ 515k

Higemaru a écrit un PHP wrapper pour parler à ces données: php-ip-country-fast

8
répondu djsadinoff 2014-07-25 13:03:45

vous pouvez utiliser un service web de http://ip-api.com

dans votre code php, faites comme suit:

<?php
$ip = $_REQUEST['REMOTE_ADDR']; // the IP address to query
$query = @unserialize(file_get_contents('http://ip-api.com/php/'.$ip));
if($query && $query['status'] == 'success') {
  echo 'Hello visitor from '.$query['country'].', '.$query['city'].'!';
} else {
  echo 'Unable to get location';
}
?>

la requête ont beaucoup d'autres informations:

array (
  'status'      => 'success',
  'country'     => 'COUNTRY',
  'countryCode' => 'COUNTRY CODE',
  'region'      => 'REGION CODE',
  'regionName'  => 'REGION NAME',
  'city'        => 'CITY',
  'zip'         => ZIP CODE,
  'lat'         => LATITUDE,
  'lon'         => LONGITUDE,
  'timezone'    => 'TIME ZONE',
  'isp'         => 'ISP NAME',
  'org'         => 'ORGANIZATION NAME',
  'as'          => 'AS NUMBER / NAME',
  'query'       => 'IP ADDRESS USED FOR QUERY',
)
7
répondu Halayem Anis 2014-10-05 13:40:01

plusieurs façons de le faire...

Solution n ° 1:

un service tiers que vous pouvez utiliser est http://ipinfodb.com . Ils fournissent le nom d'hôte, la géolocalisation et des informations supplémentaires.

Enregistrer pour une clé API ici: http://ipinfodb.com/register.php . Cela vous permettra de récupérer les résultats de leur serveur, sans cela il ne sera pas travail.

copier et passer le code PHP suivant:

$ipaddress = $_SERVER['REMOTE_ADDR'];
$api_key = 'YOUR_API_KEY_HERE';

$data = file_get_contents("http://api.ipinfodb.com/v3/ip-city/?key=$api_key&ip=$ipaddress&format=json");
$data = json_decode($data);
$country = $data['Country'];

Inconvénients:

citant de leur site web:

notre API gratuite utilise la version IP2Location Lite qui fournit des exactitude.

Solution n ° 2:

cette fonction renvoie le nom du pays en utilisant le http://www.netip.de / service.

$ipaddress = $_SERVER['REMOTE_ADDR'];
function geoCheckIP($ip)
{
    $response=@file_get_contents('http://www.netip.de/search?query='.$ip);

    $patterns=array();
    $patterns["country"] = '#Country: (.*?)&nbsp;#i';

    $ipInfo=array();

    foreach ($patterns as $key => $pattern)
    {
        $ipInfo[$key] = preg_match($pattern,$response,$value) && !empty($value[1]) ? $value[1] : 'not found';
    }

        return $ipInfo;
}

print_r(geoCheckIP($ipaddress));

sortie:

Array ( [country] => DE - Germany )  // Full Country Name
6
répondu imbondbaby 2014-07-10 13:24:01

Mon service ipdata.co fournit le nom du pays en 5 langues! Ainsi que l'organisation, la devise, le fuseau horaire, le code d'appel, le drapeau, les données de porteuse Mobile, les données de Procuration et les données de statut de noeud de sortie de Tor à partir de n'importe quelle adresse IPv4 ou IPv6.

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 requêtes par jour pour le développement.

c'est aussi extrêmement évolutif avec 10 régions à travers le monde chacune capable de traiter plus de 10.000 requêtes par seconde!

Les options comprennent l'anglais (en), allemand (de), Japonais (ja), français (fr) et le Chinois Simplifié (za-CH)

$ip = '74.125.230.195';
$details = json_decode(file_get_contents("https://api.ipdata.co/{$ip}?api-key=test"));
echo $details->country_name;
//United States
echo $details->city;
//Mountain View
$details = json_decode(file_get_contents("https://api.ipdata.co/{$ip}?api-key=test/zh-CN"));
echo $details->country_name;
//美国
5
répondu Jonathan 2018-08-29 16:00:07

Je ne suis pas sûr qu'il s'agisse d'un nouveau service mais maintenant (2016) la manière la plus facile en php est d'utiliser le service web php de geoplugin: http://www.geoplugin.net/php.gp :

usage de base:

// GET IP ADDRESS
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
    $ip = $_SERVER['HTTP_CLIENT_IP'];
} else if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else if (!empty($_SERVER['REMOTE_ADDR'])) {
    $ip = $_SERVER['REMOTE_ADDR'];
} else {
    $ip = false;
}

// CALL THE WEBSERVICE
$ip_info = unserialize(file_get_contents('http://www.geoplugin.net/php.gp?ip='.$ip));

ils fournissent également une classe prête à l'emploi: http://www.geoplugin.com/_media/webservices/geoplugin.class.php.tgz?id=webservices%3Aphp&cache=cache

4
répondu billynoah 2016-10-27 13:39:26

j'ai une réponse courte à cette question que j'ai utilisé dans un projet. Dans ma réponse j'ai considérer que vous avez l'adresse IP du visiteur

$ip = "202.142.178.220";
$ipdat = @json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip=" . $ip));
//get ISO2 country code
if(property_exists($ipdat, 'geoplugin_countryCode')) {
    echo $ipdat->geoplugin_countryCode;
}
//get country full name
if(property_exists($ipdat, 'geoplugin_countryName')) {
    echo $ipdat->geoplugin_countryName;
}

si cela vous aide à voter ma réponse.

3
répondu Shahbaz 2016-01-06 13:23:52

j'utilise l'api ipinfodb.com et j'obtiens exactement ce que vous recherchez.

C'est complètement gratuit, vous avez juste besoin de vous enregistrer avec eux pour obtenir votre clé api. Vous pouvez inclure leur classe php en téléchargeant à partir de leur site web ou vous pouvez utiliser le format d'url pour récupérer des informations.

voilà ce que je fais:

j'ai inclus leur classe php dans mon script et en utilisant le code ci-dessous:

$ipLite = new ip2location_lite;
$ipLite->setKey('your_api_key');
if(!$_COOKIE["visitorCity"]){ //I am using cookie to store information
  $visitorCity = $ipLite->getCity($_SERVER['REMOTE_ADDR']);
  if ($visitorCity['statusCode'] == 'OK') {
    $data = base64_encode(serialize($visitorCity));
    setcookie("visitorCity", $data, time()+3600*24*7); //set cookie for 1 week
  }
}
$visitorCity = unserialize(base64_decode($_COOKIE["visitorCity"]));
echo $visitorCity['countryName'].' Region'.$visitorCity['regionName'];

Thats it.

2
répondu Miraj 2014-09-03 07:14:26

vous pouvez utiliser http://ipinfo.io / pour obtenir des détails de l'adresse ip son facile à utiliser .

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

    $details = ip_details(YoUR IP ADDRESS); 

    echo $details->city;
    echo "<br>".$details->country; 
    echo "<br>".$details->org; 
    echo "<br>".$details->hostname; /

    ?>
2
répondu Aqib1604 2014-10-15 06:44:03

remplacer 127.0.0.1 par l'adresse IP des visiteurs.

$country = geoip_country_name_by_name('127.0.0.1');

les instructions D'Installation sont ici , et lisez ceci pour savoir comment obtenir la ville, L'État, le pays, la Longitude, la Latitude, etc...

2
répondu Jack M. 2014-11-01 12:55:09

en Une seule ligne avec un adresse IP de pays API

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

> United States

exemple:

https://ipapi.co/country_name / - votre pays

https://ipapi.co/8.8.8.8/country_name / - pays pour la PI 8.8.8.8

2
répondu user6885709 2018-02-08 04:14:16

le user Country API a exactement ce dont vous avez besoin. Voici un exemple de code utilisant file_get_contents() comme vous le faites à l'origine:

$result = json_decode(file_get_contents('http://usercountry.com/v1.0/json/'.$cip), true);
$result['country']['name']; // this contains what you need
0
répondu byl83 2017-08-10 04:05:07

vous pouvez obtenir des visiteurs pays et ville en utilisant IPSTACK API geo.Vous devez obtenir votre propre API ipstack et ensuite utiliser le code ci-dessous:

<?php
 $ip = $_SERVER['REMOTE_ADDR']; 
 $api_key = "YOUR_API_KEY";
 $freegeoipjson = file_get_contents("http://api.ipstack.com/".$ip."?access_key=".$api_key."");
 $jsondata = json_decode($freegeoipjson);
 $countryfromip = $jsondata->country_name;
 echo "Country: ". $countryfromip ."";
?>

Source: Obtenir les visiteurs du pays et de la ville en PHP à l'aide de ipstack API

0
répondu Faruque Ahamed Mollick 2018-07-13 15:14:00