Идентификация страны по IP-адресу - PullRequest
36 голосов
/ 21 марта 2012

Есть ли способ узнать название страны, просто посмотрев на IP-адрес? Я имею в виду, есть ли в странах конкретные диапазоны IP-адресов? Например, Австралия может иметь IP-адреса только в диапазоне 123.45.56.89 - 231.54.65.98 (просто пример)

Ответы [ 12 ]

26 голосов
/ 07 августа 2014

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

Если вы хотите узнать местоположение, в котором находится IP-адресадрес, который в данный момент отображается на карте, вы можете либо загрузить базу данных геолокации, такую ​​как GeoLite из MaxMind , либо использовать API, такой как http://ipinfo.io (мой собственный сервис), который также предоставит вам дополнительную информацию:

$ curl ipinfo.io/8.8.8.8
{
  "ip": "8.8.8.8",
  "hostname": "google-public-dns-a.google.com",
  "loc": "37.385999999999996,-122.0838",
  "org": "AS15169 Google Inc.",
  "city": "Mountain View",
  "region": "California",
  "country": "US",
  "phone": 650
}
13 голосов
/ 21 марта 2012

Я думаю, что вы ищете базу данных IP-геолокации или поставщика услуг. Их там много, и некоторые из них бесплатны (получите то, за что платите).

Хотя я раньше не пользовался этим сервисом, он утверждает, что работает в режиме реального времени. https://kickfire.com/kf-api

Но просто выполните поиск в Google по IP-гео, и вы получите больше результатов, чем нужно.

2 голосов
/ 22 ноября 2018

Да, страны имеют конкретные диапазоны IP-адресов, как вы упомянули.

Например, Австралия между 16777216 - 16777471. Китай - между 16777472 - 16778239. Но одна страна может иметь несколько диапазонов.Например, Австралия также имеет этот диапазон между 16778240 - 16779263

(Это числовые преобразования IP-адресов. Это зависит от того, используете ли вы IPv4 или IPv6)

Дополнительная информацияОб этих диапазонах можно узнать здесь: http://software77.net/cidr-101.html

Мы получаем IP-адреса посетителей нашего веб-сайта и иногда хотим провести соответствующую кампанию для конкретной страны.Мы использовали инструменты массового преобразования, но позже решили определить правила в файле Excel и преобразовать его в инструменте.И мы создали этот шаблон Excel: https://www.someka.net/excel-template/ip-to-country-converter/

Теперь мы используем его для собственных нужд и продаем.Я не хочу, чтобы это было коммерческое предложение, но для тех, кто ищет простое решение, может извлечь выгоду из этого.

2 голосов
/ 06 ноября 2017

Вы можете использовать ipdata.co для выполнения поиска

В этом ответе используется «тестовый» ключ API, который очень ограничен и предназначен только для тестирования нескольких вызовов. Зарегистрируйтесь для получения своего бесплатного ключа API и получите до 1500 запросов в день на разработку.

curl https://api.ipdata.co/23.221.76.66?api-key=test

Ipdata имеет 10 конечных точек, каждая из которых может обрабатывать> 10000 запросов в секунду!

Дает

{
    "ip": "23.221.76.66",
    "city": "Cambridge",
    "region": "Massachusetts",
    "region_code": "MA",
    "country_name": "United States",
    "country_code": "US",
    "continent_name": "North America",
    "continent_code": "NA",
    "latitude": 42.3626,
    "longitude": -71.0843,
    "asn": "AS20940",
    "organisation": "Akamai International B.V.",
    "postal": "02142",
    "calling_code": "1",
    "flag": "https://ipdata.co/flags/us.png",
    "emoji_flag": "\ud83c\uddfa\ud83c\uddf8",
    "emoji_unicode": "U+1F1FA U+1F1F8",
    "is_eu": false,
    "languages": [
        {
            "name": "English",
            "native": "English"
        }
    ],
    "currency": {
        "name": "US Dollar",
        "code": "USD",
        "symbol": "$",
        "native": "$",
        "plural": "US dollars"
    },
    "time_zone": {
        "name": "America/New_York",
        "abbr": "EDT",
        "offset": "-0400",
        "is_dst": true,
        "current_time": "2018-04-19T06:32:30.690963-04:00"
    },
    "threat": {
        "is_tor": false,
        "is_proxy": false,
        "is_anonymous": false,
        "is_known_attacker": false,
        "is_known_abuser": false,
        "is_threat": false,
        "is_bogon": false
    }
}⏎ 
2 голосов
/ 06 августа 2017

Вы можете попробовать использовать https://ip -api.io - API географического местоположения, который возвращает страну среди другой информации IP.

Например, с Node.js

const request = require('request-promise')

request('http://ip-api.io/api/json/1.2.3.4')
  .then(response => console.log(JSON.parse(response)))
  .catch(err => console.log(err))
2 голосов
/ 21 марта 2012

Это не так просто. IP-адреса присваиваются не странам как таковым, а компаниям и организациям.

Но, возможно, это поможет вам: http://www.maxmind.com/app/geolitecountry

1 голос
/ 28 февраля 2018

Да, вы можете загрузить диапазоны IP-адресов по странам из https://lite.ip2location.com/ip-address-ranges-by-country

Вы можете видеть, что каждая страна имеет несколько диапазонов и часто меняется.

1 голос
/ 09 февраля 2018

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

Чтобы выполнить то, что вы хотите, вам нужно иметь актуальный поиск, чтобы сопоставить IP-адрес с страной либо с базой данных, либо с API геолокации.Вот пример:

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

> https://ipapi.co/8.8.8.8/country_name
United States

Или вы можете использовать полный API для получения полного местоположения для IP-адреса например

https://ipapi.co/8.8.8.8/json

{
    "ip": "8.8.8.8",
    "city": "Mountain View",
    "region": "California",
    "region_code": "CA",
    "country": "US",
    "country_name": "United States",
    "continent_code": "NA",
    "postal": "94035",
    "latitude": 37.386,
    "longitude": -122.0838,
    "timezone": "America/Los_Angeles",
    "utc_offset": "-0800",
    "country_calling_code": "+1",
    "currency": "USD",
    "languages": "en-US,es-US,haw,fr",
    "asn": "AS15169",
    "org": "Google Inc."
}
1 голос
/ 21 декабря 2017

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

Если вы не используете AWS CloudFront, я хотел бы посмотреть, есть ли в вашем CDN аналогичная опция заголовка, которую можно включить. Обычно крупные провайдеры быстро добиваются паритета функций. А если вы не используете CDN, вы можете поставить CloudFront перед своей инфраструктурой и просто настроить источник для разрешения того, что вы в настоящее время используете.

Кроме того, также имеет смысл решить эту проблему на уровне CDN. Ваша CDN уже должна выяснить географическое местоположение, чтобы направить пользователя к ближайшему контентному узлу, с тем же успехом может передавать эту информацию, а не вычислять ее дважды через сторонний API (это становится точкой пересечения для вашего приложения, ожидая гео поиск местоположения, чтобы решить). Нет необходимости выполнять эту работу дважды (и во второй раз, возможно, менее устойчиво [например, сторонний гео-поиск]).

https://aws.amazon.com/blogs/aws/enhanced-cloudfront-customization/

Геотаргетинг - CloudFront определит страну происхождения пользователя и передать вам код графства в CloudFront-Viewer-Country заголовок. Вы можете использовать эту информацию, чтобы настроить ваши ответы без использования URL-адресов, специфичных для каждой страны.

1 голос
/ 07 ноября 2014

Я согласен с приведенными выше ответами, лучший способ получить страну с IP-адреса - это Maxmind.

Если вы хотите написать код в java, вы можете использовать i.e. geoip-api-1.2.10.jar и geoIP dat файлы (GeoIPCity.dat), которые можно найти через Google.

Следующий код может быть полезен для вас, чтобы получить почти всю информацию, связанную с местоположением, я также использую тот же код.

public static String getGeoDetailsUsingMaxmind(String ipAddress, String desiredValue) 
    {
        Location getLocation;
        String returnString = "";
        try
        {
            String geoIPCity_datFile = System.getenv("AUTOMATION_HOME").concat("/tpt/GeoIP/GeoIPCity.dat");
            LookupService isp = new LookupService(geoIPCity_datFile);
            getLocation = isp.getLocation(ipAddress);
            isp.close();

            //Getting all location details 
            if(desiredValue.equalsIgnoreCase("latitude") || desiredValue.equalsIgnoreCase("lat"))
            {
                returnString = String.valueOf(getLocation.latitude);
            }
            else if(desiredValue.equalsIgnoreCase("longitude") || desiredValue.equalsIgnoreCase("lon"))
            {
                returnString = String.valueOf(getLocation.longitude);
            }
            else if(desiredValue.equalsIgnoreCase("countrycode") || desiredValue.equalsIgnoreCase("country"))
            {
                returnString = getLocation.countryCode;
            }
            else if(desiredValue.equalsIgnoreCase("countryname"))
            {
                returnString = getLocation.countryName;
            }
            else if(desiredValue.equalsIgnoreCase("region"))
            {
                returnString = getLocation.region;
            }
            else if(desiredValue.equalsIgnoreCase("metro"))
            {
                returnString = String.valueOf(getLocation.metro_code);
            }
            else if(desiredValue.equalsIgnoreCase("city"))
            {
                returnString = getLocation.city;
            }
            else if(desiredValue.equalsIgnoreCase("zip") || desiredValue.equalsIgnoreCase("postalcode"))
            {
                returnString = getLocation.postalCode;
            }
            else
            {
                returnString = "";
                System.out.println("There is no value found for parameter: "+desiredValue);
            }

            System.out.println("Value of: "+desiredValue + " is: "+returnString + " for ip address: "+ipAddress);
        }
        catch (Exception e) 
        {
            System.out.println("Exception occured while getting details from max mind. " + e);
        }
        finally
        {
            return returnString;
        }
    }
...