Как отслеживать местоположение/регион пользователей в PHP

Я пытаюсь получить страну, из которой пользователь просматривает веб-сайт, чтобы определить, какую валюту отображать на веб-сайте. Я пытался использовать сценарии GET, доступные по адресу: http://api.hostip.info, но они просто возвращают XX, когда Я проверяю это.

Если кто-то знает какие-либо более эффективные методы, пожалуйста, поделитесь.

Спасибо.


person diggersworld    schedule 14.10.2010    source источник
comment
Волшебное слово — геолокация: stackoverflow.com/search?q=php+geolocation.   -  person Pekka    schedule 14.10.2010
comment
Вы также можете использовать локаль браузера, чтобы угадать, что пользователь может предпочесть в качестве валюты.   -  person Gordon    schedule 14.10.2010


Ответы (6)


Попробуйте это:

http://ip-to-country.webhosting.info/

http://www.ip2location.com/

Оба являются базами данных IP-адресов по странам, которые позволяют вам искать страну происхождения данного IP-адреса.

Однако важно отметить, что эти базы данных не являются точными на 100%. Это хороший ориентир, но вы получите ложные результаты по целому ряду причин.

  • Многие люди используют прокси, чтобы обойти блокировки и фильтры, зависящие от страны.
  • Многие диапазоны IP-адресов назначены компаниям с большим географическим охватом; вы просто получите страну, в которой они базируются, а не то, где находится реальная машина (это всегда было большой проблемой для отслеживания пользователей AOL, потому что все они, по-видимому, жили в Вирджинии)
  • Контроль диапазонов IP-адресов иногда передается между странами, поэтому вы можете получить ложные результаты (особенно для небольших/менее хорошо связанных стран).

Поддержание вашей базы данных в актуальном состоянии смягчит некоторые из этих проблем, но не решит их полностью (особенно проблему проксирования), поэтому вы всегда должны учитывать тот факт, что вы получите ложные результаты.

person Spudley    schedule 14.10.2010

Я использую это:

  $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
  $ip = $_SESSION['ip'];
  $try1 = "http://ipinfodb.com/ip_query.php?ip=".$ip."&output=xml";
  $try2 = "http://backup.ipinfodb.com/ip_query.php?ip=".$ip."&output=xml";
  $XML = @simplexml_load_file($try1,NULL,TRUE);
  if(!$XML) { $XML = @simplexml_load_file($try2,NULL,TRUE); }
  if(!$XML) { return false; }

  //Retrieve location, set time
  if($XML->City=="") { $loc = "Localhost / Unknown"; }
  else { $loc = $XML->City.", ".$XML->RegionName.", ".$XML->CountryName; }
  $_SESSION['loc'] = $loc;
person Ben    schedule 14.10.2010
comment
Это делает запрос каждый раз, когда он запускается (без локального кэширования уже разрешенных IP-адресов). Если внешний веб-сайт не работает, загрузка страницы займет 30 или 60 секунд. - person Pekka; 14.10.2010
comment
То, что вы описываете, потребует автономного кеша IP-адресов, что, насколько я понимаю, противоречит цели упражнения. - person Ben; 15.10.2010

Вам следует использовать библиотеку geoip.

Maxmind предоставляет бесплатные базы данных и коммерческие базы данных, с разницей в дате последнего обновления и точности, причем коммерческие базы данных имеют лучшее качество.

Бесплатную базу данных см. на http://www.maxmind.com/app/geolitecountry.

Я думаю, что этого должно быть достаточно для основных нужд.

person SirDarius    schedule 14.10.2010

Вы можете использовать геолокацию, чтобы получить координаты, а затем какую-либо службу, чтобы получить из нее страну, но API геолокации основан на браузере, поэтому вы можете получить к нему доступ только через JavaScript, а затем каким-то образом передать эту информацию в PHP, я написал что-то на JS Часть один раз:

http://www.lautr.com/utilizing-html5-геолокация-api-and-yahoo-placefinder-example

Когда дело доходит до получения местоположения через IP, существует множество сервисов, которые предлагают базы данных для этого, некоторые бесплатные, некоторые платные, некоторые с большим количеством сохраненных IP-адресов и данных, некоторые с меньшим количеством, например, один вы упомянули, отлично работает:

http://api.hostip.info/?ip=192.0.32.10

Таким образом, вы можете использовать API геолокации, который довольно удобен, но требует разрешения пользователей, работает через JS и не работает в IE (пока) или вам нужно искать службу определения местоположения IPÜ, которая соответствует вашим потребностям :)

person Hannes    schedule 14.10.2010

Попробуйте это:

$key="9dcde915a1a065fbaf14165f00fcc0461b8d0a6b43889614e8acdb8343e2cf15"; $ip= "198.168.1230.122";

$url = "http://api.ipinfodb.com/v3/ip-city/?key=$key&ip=$ip&format=xml";

// загружаем xml-файл

$xml = simplexml_load_file($url); // печатаем имя первого элемента

эхо $xml->getName() . "
"; // создаем цикл для вывода имени элемента и данных для каждого узла

foreach($xml->children() как $child)

{

echo $child->getName() . ": " . $child . "<br />";

}

person dinesh    schedule 24.02.2015

Есть много способов сделать это, как было предложено ранее. Но я предлагаю вам взглянуть на PHP-библиотеку IP2, доступную по адресу https://github.com/ip2iq/ip2-lib-php, который мы разработали.

Вы можете использовать его, как показано ниже:

<?php
    require_once("Ip2.php");

    $ip2 = new \ip2iq\Ip2();
    $country_code = $ip2->country('8.8.8.8');
    //$country_code === 'US'
?>

Ему не нужен поиск SQL или веб-сервиса, только локальный файл данных. Это быстрее, чем почти все другие методы там. База обновляется ежемесячно, скачать ее можно бесплатно.

Единственное, что вам нужно сделать сейчас, если вам нужно название страны на вашем языке, — это сопоставить его с ассоциативным массивом из чего-то вроде этого https://gist.github.com/DHS/1340150

person IP2IQ    schedule 26.06.2017