Web

Как определить страну посетителя сайта по его IP адресу

Я хочу получить страну посетителей по их IP... Сейчас я использую вот это (http://api.hostip.info/country.php?ip=...... ). Вот мой код:

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

?>

 Этот код работает правильно, но дело в том, что он возвращает код страны, например, US или CA, а не полное название страны, например, США или Канада. Итак, есть ли какая-нибудь хорошая альтернатива hostip.info?

Я знаю, что могу просто написать код, который в конечном итоге превратит эти две буквы в название страны, но мне просто лень писать код, который содержит все страны... По какой-то причине я не хочу использовать готовый CSV файл или код, который возьмет эту информацию для меня, что-то вроде ip2country готовый код и CSV.

 

Ответ 1

Попробуйте использовать эту простую функцию 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;

}

 

?>

 Как использовать:

Пример1: Получение информации об IP-адресе посетителя.

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

 

?>

 Пример 2: Получение сведений о любом IP-адресе [поддержка IPV4 и IPV6].

<?php

 echo ip_info("173.252.110.27", "Country"); // США

echo ip_info("173.252.110.27", "Country Code"); // US

echo ip_info("173.252.110.27", "State"); // Калифорния

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 )

?>

 

Ответ 2

Вы можете использовать простой API с сайта 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>";

 

Используемая функция:

function getRealIpAddr() {

    if (!empty($_SERVER['HTTP_CLIENT_IP']))  {

      //проверить ip из общего доступа в интернете

      $ip=$_SERVER['HTTP_CLIENT_IP'];

    } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {

      //проверить, что ip передан от прокси-сервера

      $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];

    } else {

      $ip=$_SERVER['REMOTE_ADDR'];

    }

    return $ip;

}

Вывод:

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

 

Ответ 3

Я попробовал использовать предыдущий ответ, но конфигурация моего сервера не позволяет применять file_get_contents().

Предупреждение PHP: file_get_contents() URL-доступ к файлам запрещен в конфигурации сервера.

 Я изменил код так, чтобы он работал и на серверах, использующих 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);

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

        $country = $ip_data['geoplugin_countryName'];

    }

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

}

 

echo ip_visitor_country(); // выводит название страны

 

?>

 

Ответ 4

Вы можете использовать веб-сервис с сайта http://ip-api.com в вашем php-коде, сделайте следующее:

<?php

$ip = $_REQUEST['REMOTE_ADDR']; //  запрос IP адреса

$query = @unserialize(file_get_contents('http://ip-api.com/php/'.$ip));

if($query && $query['status'] == 'success') {

  echo 'Привет пользователь из '.$query['country'].', '.$query['city'].'!';

} else {

  echo 'Ошибка получения расположения';

}

?>

 Запрос выводит много другой информации:

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',

)

 

Ответ 5

Проверьте php-ip-2-country с сайта code.google. База данных, которую они предоставляют, обновляется ежедневно, поэтому нет необходимости подключаться к внешнему серверу для проверки, если вы размещаете свой собственный SQL-сервер. Таким образом, используя этот код, вам нужно будет только ввести:

<?php

$ip = $_SERVER['REMOTE_ADDR'];

 if(!empty($ip)){

        require('./phpip2country.class.php');

         /**

         * Новейшие данные (SQL) доступны на веб-сайте проекта

         * @ссылка http://code.google.com/p/php-ip-2-country/

         */

        $dbConfigArray = array(

                'host'                    => 'localhost', //пример имени хоста

                'port'                    => 3306, //3306 номер порта mysql по умолчанию

                'dbName'             => 'ip_to_country', //пример имени базы данных

                'dbUserName'      => 'ip_to_country', //пример имени пользователя

                'dbUserPassword' => 'QrDB9Y8CKMdLDH8Q', //пример пароля пользователя

                'tableName'           => 'ip_to_country', //пример имени таблицы

        );

 

        $phpIp2Country = new phpIp2Country($ip,$dbConfigArray);

        $country = $phpIp2Country->getInfo(IP_COUNTRY_NAME);

        echo $country;

?>

 Вывод будет примерно таким:

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

)

 

Ответ 6

Существует много разных способов...

Решение №1:

Один из сторонних сервисов, который вы можете использовать, — http://ipinfodb.com. Они предоставляют имя хоста, геолокацию и дополнительную информацию. Зарегистрируйтесь для получения API-ключа здесь: http://ipinfodb.com/register.php. Это позволит вам получать результаты с их сервера, без этого он не будет работать. Скопируйте и вставьте следующий PHP-код:

$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'];

 

Недостатки:

Цитирую с их сайта:

Наш бесплатный API использует версию IP2Location Lite, которая обеспечивает более низкую точность.

 

Решение #2:

Эта функция будет возвращать название страны, используя сервис http://www.netip.de/

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

 Вывод:

Array ( [country] => DE - Germany )  // Полное название страны

 

 

Схожие статьи

Web

Транзакции в PHP + MySQL

Django: уязвимости, от которых нужно защитить сайт в первую очередь
Web

Django: уязвимости, от которых нужно защитить сайт в первую очередь

Web

Как я могу измерить скорость кода, написанного на PHP

Как и на чём лучше писать сайты?
Web

Как и на чём лучше писать сайты?

×