Подтвердить что ты не робот

Методы определения местоположения для IP-адресов

Каковы методы определения местоположения для IP-адресов?
Я знаю, как смотреть $_SERVER['HTTP_ACCEPT_LANGUAGE'] (неточно, но в основном полезно определить местоположение, например, если пользователи диапазона IP устанавливают французский в свой браузер, то это означает, что этот диапазон) принадлежит Франции
и
gethostbyaddr($_SERVER['REMOTE_ADDR']) (посмотреть домен верхнего уровня страны)
то может быть whois gethostbyaddr($_SERVER['REMOTE_ADDR'])
иногда:
$HTTP_USER_AGENT (строка пользовательского агента Firefox содержит код языка, не точный, но в основном может использоваться для обнаружения местоположения)

Также я знаю, как получить часовой пояс, но он не работает в новых браузерах. Кроме того, css issue, который определяет историю посетителей, его можно использовать для просмотра страниц google и wikipedia, которые он посетил (google.co.uk, google.com.tr)

Но как насчет городов?

4b9b3361

Ответ 1

Вы не можете сделать это без базы данных, которая отображает IP-адреса в города/страны/провайдеры. Существуют коммерческие предложения, такие как ip2location, которые вы могли бы использовать. AFAIK нет никакой бесплатной альтернативы, хотя, поскольку сохранение такой базы данных IP - это довольно много работы. Свободная альтернатива: GeoIP2

Update: Есть несколько вещей, которые позволяют вам создать такой db, если вы инвестируете достаточно времени:

  • Используйте базы данных, предоставленные региональные и локальные реестры, чтобы найти владельца IP.
  • Многие интернет-провайдеры используют схему именования, которая позволяет вам найти пользователя. Иногда вы можете даже прочитайте название города в виде обычного текста, если вы выполните обратный DNS-поиск. Иногда это более загадочным. Например, у меня в настоящее время есть p5dcf6c4a.dip.t-dialin.net, и у меня нет идея, что схема именования...
  • Используйте трассировку. Если вы не можете определить местоположение пользователя, вы все равно можете узнать расположение его восходящей линии связи

Ответ 2

Если вы ищете какое-то решение для копирования и вставки, я буду использовать этот код:

    function countryCityFromIP($ipAddr)
{
//function to find country and city from IP address
//Developed by Roshan Bhattarai http://roshanbh.com.np

//verify the IP address for the
ip2long($ipAddr)== -1 || ip2long($ipAddr) === false ? trigger_error("Invalid IP", E_USER_ERROR) : "";
$ipDetail=array(); //initialize a blank array

//get the XML result from hostip.info
$xml = file_get_contents("http://api.hostip.info/?ip=".$ipAddr);

//get the city name inside the node <gml:name> and </gml:name>
preg_match("@<Hostip>(\s)*<gml:name>(.*?)</gml:name>@si",$xml,$match);

//assing the city name to the array
$ipDetail['city']=$match[2]; 

//get the country name inside the node <countryName> and </countryName>
preg_match("@<countryName>(.*?)</countryName>@si",$xml,$matches);

//assign the country name to the $ipDetail array
$ipDetail['country']=$matches[1];

//get the country name inside the node <countryName> and </countryName>
preg_match("@<countryAbbrev>(.*?)</countryAbbrev>@si",$xml,$cc_match);
$ipDetail['country_code']=$cc_match[1]; //assing the country code to array

//return the array containing city, country and country code
return $ipDetail;

}

Надеюсь, это поможет кому-то.

Ответ 3

Существуют базы данных (некоторые из них бесплатны), которые могут быть использованы для преобразования IP в города:

например: http://www.maxmind.com/app/geolitecity

Ответ 4

Вместо использования стороннего API я предлагаю вам использовать собственную запись IP-адреса. Это сообщение объясняет вам больше

http://www.techsirius.com/2014/05/simple-geo-tracking-system.html

В основном они используют запись базы данных IP-адресов страны maxmind [http://dev.maxmind.com/geoip/geoip2/geolite2/] с небольшими изменениями. После этого пример запроса

$ip =  $_SERVER['REMOTE_ADDR'];
$long = sprintf('%u', ip2long($ip));
$sql = "SELECT * FROM `geo_ips` WHERE '$long' BETWEEN `ip_start` AND `ip_end`";

Ответ 5

Один из способов, с помощью которого эти базы данных скомпилированы, - это информация whois. Например, чтобы определить местоположение 69.59.196.211:

fmark @home: ~ $host 69.59.196.211 211.196.59.69.in-addr.arpa указатель имени домена stackoverflow.com. fmark @home: ~ $whois stackoverflow.com

Whois Server Version 2.0

Доменные имена в .com и .net теперь можно регистрировать домены много разных конкурирующих регистраторов.

 <SNIP>

Регистрант: stackoverflow.com llc
410 Clayton Ave El Cerrito, Калифорния 94530 США

 <SNIP>

Очевидно, что это не очень точно, поэтому используются более сложные методы.

Ответ 6

Если функция геолокации не является большим требованием для вашего проекта, вы можете использовать что-то простое:

$geotxt='';
$dt=json_decode(@file_get_contents('https://freegeoip.net/json/'.$_SERVER['REMOTE_ADDR']));
if ($dt!=null) $geotxt=$dt->country_name.', '.$dt->region_name.', '.$dt->city;
echo $geotxt;

Вы должны учитывать, что freegeoip имеет ограничение в 10 000 запросов/час.

Ответ 7

U может использовать эту функцию

 function ip_info(){
            return $data = json_decode(file_get_contents('http://ip-api.com/json/'),true);
        }

Вызвать функцию

$info = ip_info();
var_dump($info);

Ответ 8

В большинстве существующих баз данных используется агрегирование данных из международных реестров ARIN, AFRINIC, ANIC и т.д., а также локализованных местоположений пользователей. Более сложные методы включают топологию и ограничения геолокации.

Я запускаю свой собственный API https://ipdata.co, который содержит несколько точек данных, включая страну, город, регион, лат/долго и другие.

php > $data = json_decode(file_get_contents('https://api.ipdata.co/69.59.196.211'),true);
php > echo $data['country_name'];
//United States
php > echo $data['city'];
//Albany

Ответ 9

Вы можете сопоставить IP-адрес с его местоположением (город, страна, почтовый индекс), часовой пояс и т.д. С помощью базы данных или API (размещенной базы данных).

Вот пример использования API

curl https://ipapi.co/city/ 
> Mountain View

curl https://ipapi.co/country/
> US

curl https://ipapi.co/timezone/
> America/Los_Angeles 

здесь: Местоположение с IP-адреса