Методы определения местоположения для 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)
Но как насчет городов?
Ответы
Ответ 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-адреса