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 )  // Полное название страны

 

 

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

Нейронная сеть Google: что нового и какие возможности у сети Гугла?
Web

Нейронная сеть Google: что нового и какие возможности у сети Гугла?

Web

Заменить уведомление о невыполнении заказа на количество невыполненных заказов для каждого элемента корзины на странице WooCommerce

Что такое видеохостинги типа Ютуба, как на них можно загружать видео
Web

Что такое видеохостинги типа Ютуба, как на них можно загружать видео

Web

Как сделать списки HTML, какой из них называется неупорядоченным, как с ними работать