Получение страны посетителей от их 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);
?>
Ну, это работает правильно, но дело в том, что это возвращает код страны, как мы или CA., и не все название страны, как Соединенные Штаты или Канада.
Итак, есть ли хорошая альтернатива hostip.info предлагает это?
Я знаю, что могу просто написать код это в конечном итоге превратит эти две буквы в название всей страны, но мне просто лень писать код, который содержит все страны...
P. S: по какой-то причине я не хочу использовать любой готовый CSV-файл или любой код, который будет захватывать эту информацию для меня, что-то вроде готового кода ip2country и CSV.
21 ответов:
попробуйте эту простую функцию 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"); // 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 ) ?>
вы можете использовать простой 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>";
я попробовал ответ Чандры, но моя конфигурация сервера не позволяет file_get_contents ()
PHP Warning: file_get_contents() URL file-access is disabled in the server configurationЯ изменил код Чандры, так что он также работает для таких серверов, как 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('"', '"', $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 ?>надеюсь, что это поможет ;-)
на самом деле, вы можете позвонить http://api.hostip.info/?ip=123.125.114.144 чтобы получить информацию, которая представлена в XML.
используйте MaxMind GeoIP (или GeoIPLite, если вы не готовы платить).
$gi = geoip_open('GeoIP.dat', GEOIP_MEMORY_CACHE); $country = geoip_country_code_by_addr($gi, $_SERVER['REMOTE_ADDR']); geoip_close($gi);
используйте следующие службы
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);
проверить php-ip-2-country из кода.гуглить. База данных, которую они предоставляют, обновляется ежедневно, поэтому нет необходимости подключаться к внешнему серверу для проверки, если вы размещаете свой собственный SQL server. Поэтому, используя код, вам нужно будет только ввести:
<?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; ?>Код(С)
<? 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)); ?>выход
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 )
мы можем использовать geobytes.com чтобы получить местоположение, используя IP-адрес пользователя
$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);он будет возвращать данные, как это
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 )функция для получения IP пользователя
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; }
попробуйте этот простой код в одну строку, Вы получите страну и город посетителей с их IP-удаленного адреса.
$tags = get_meta_tags('http://www.geobytes.com/IpLocator.htm?GetLocation&template=php3.txt&IpAddress=' . $_SERVER['REMOTE_ADDR']); echo $tags['country']; echo $tags['city'];
существует хорошо поддерживаемая плоская версия базы данных ip - > country, поддерживаемая сообществом Perl по адресу CPAN
доступ к этим файлам не требует сервера данных, а сами данные примерно 515k
Higemaru написал на PHP обертку поговорить с Данные: php-ip-country-fast
вы можете использовать веб-сервис от http://ip-api.com
в вашем php-коде выполните следующие действия:<?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'; } ?>запрос имеет много другой информации:
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', )
много различных способов сделать это...
Решение #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: (.*?) #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 ) // Full Country Name
мой сервис ipdata.co предоставляет название страны на 5 языках! А также организация, валюта, часовой пояс, код вызова, флаг, данные мобильного оператора, Прокси-данные и данные о состоянии узла выхода Tor с любого адреса IPv4 или IPv6.
этот ответ использует "тестовый" ключ API, который очень ограничен и предназначен только для тестирования нескольких вызовов. Регистрация для вашего собственного свободного ключа API и получите до 1500 запросов ежедневно для развитие.
Он также чрезвычайно масштабируемый с 10 регионами по всему миру, каждый из которых способен обрабатывать >10 000 запросов в секунду!
варианты включают; английский (en), немецкий (de), японский (ja), французский (fr) и упрощенный китайский (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; //美国
Не уверен, что это новый сервис, но теперь (2016) самый простой способ в php-это использовать веб-сервис php geoplugin:http://www.geoplugin.net/php.gp:
основное использование:
// 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));они также предоставляют готовый встроенный класс: http://www.geoplugin.com/_media/webservices/geoplugin.class.php.tgz?id=webservices%3Aphp&cache=cache
У меня есть короткий ответ на этот вопрос, который я использовал в проекте. В моем ответе я считаю, что у вас есть IP-адрес посетителя
$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; }Если это поможет вам проголосовать за мой ответ.
Я использую
ipinfodb.comapi и получить именно то, что вы ищете.его совершенно бесплатно, вам просто нужно зарегистрироваться с ними, чтобы получить ключ api. Вы можете включить их класс php, загрузив с их веб-сайта или вы можете использовать формат url для получения информации.
вот что я делаю:
Я включил их класс php в свой скрипт и использовал следующий код:
$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'];вот и все.
вы можете использовать http://ipinfo.io/ чтобы получить подробную информацию о ip-адресе его прост в использовании .
<?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; / ?>
заменить
127.0.0.1С IpAddress посетителей.$country = geoip_country_name_by_name('127.0.0.1');инструкция по установке здесь и прочитайте это, чтобы узнать, как получить город, штат, страну, долготу, широту и т. д...
один лайнер с IP-адрес страны API
echo file_get_contents('https://ipapi.co/8.8.8.8/country_name/'); > United Statesпример :
https://ipapi.co/country_name/ - ваша страна
https://ipapi.co/8.8.8.8/country_name/ - страна для IP 8.8.8.8
на API страны пользователя есть именно то, что вам нужно. Вот пример кода с использованием file_get_contents (), как вы изначально делаете:
$result = json_decode(file_get_contents('http://usercountry.com/v1.0/json/'.$cip), true); $result['country']['name']; // this contains what you need
вы можете получить страну и город посетителей с помощью ipstack GEO API.Вам нужно получить свой собственный IPSTACK API, а затем использовать код ниже:
<?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 .""; ?>источник: получить страну и город посетителей в PHP с помощью IPSTACK API
Comments