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

18

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

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

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

    
задан ilhan 11.12.2017 в 05:43
источник
  • Несколько дубликатов, включая stackoverflow.com/questions/283016/... и stackoverflow.com/questions/2244989/... –  skaffman 04.04.2010 в 16:39
  • Нет, они просят услуги, я спрашиваю, как эти службы обнаружили местоположения. –  ilhan 07.04.2010 в 20:16

9 ответов

8

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

  • Многие интернет-провайдеры используют схему именования, которая позволяет вам найти пользователя. Иногда вы можете даже прочитайте название города в виде обычного текста, если вы выполните обратный DNS-поиск. Иногда это более загадочным. Например, у меня в настоящее время есть p5dcf6c4a.dip.t-dialin.net, и у меня нет идея, что схема именования ...
  • Используйте трассировку. Если вы не можете определить местоположение пользователя, вы все равно можете узнать расположение его восходящей линии связи
  • ответ дан Tim Jansen 17.01.2017 в 09:03
    • Да, я знаю их, но я хочу узнать, как они создают свою собственную базу данных. –  ilhan 04.04.2010 в 16:00
    4

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

        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;
    
    }
    

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

        
    ответ дан eric.itzhak 07.07.2012 в 20:55
    • api.hostip.info кажется уже недоступным –  shenkwen 04.05.2016 в 23:55
    3

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

    например: Ссылка

        
    ответ дан iNPUTmice 04.04.2010 в 15:48
    • Я это знаю, это очень полезно для больших стран, но это не точно для Болгарии. Все мои посетители из юго-восточной Болгарии, но они показывают их, как будто они находятся с центрального запада (столица). –  ilhan 04.04.2010 в 15:59
    1

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

    Ссылка

    В основном они используют запись базы данных IP города страны maxmind [ Ссылка с небольшими изменениями. После этого пример запроса

    $ip =  $_SERVER['REMOTE_ADDR'];
    $long = sprintf('%u', ip2long($ip));
    $sql = "SELECT * FROM 'geo_ips' WHERE '$long' BETWEEN 'ip_start' AND 'ip_end'";
    
        
    ответ дан Webby 30.07.2014 в 07:30
    0

    Вы можете сопоставить 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-адреса

        
    ответ дан Alexis 08.02.2018 в 05:35
    0

    Один из способов, с помощью которого эти базы данных скомпилированы, - это информация 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>
    
         

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

     <SNIP>
    

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

        
    ответ дан fmark 08.04.2010 в 08:52
    0

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

    $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 запросов / час.

        
    ответ дан MazarD 17.02.2015 в 19:54
    0

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

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

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

    $info = ip_info();
    var_dump($info);
    
        
    ответ дан shah 30.06.2016 в 11:45
    • Как вы передаете IP-адрес этой функции, отличной от вашего текущего IP-адреса? Я регистрирую IP-адрес, когда кто-то вводит данные в форму, я только хочу проверить пользователей, которые вводят спам или нежелательные сообщения –  Kim Wilson 20.05.2017 в 01:12
    • @KimWilson см. мой ответ ниже –  Jonathan 05.09.2017 в 20:13
    0

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

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

    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
    
        
    ответ дан Jonathan 12.10.2017 в 13:14