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

Определение страны по IP-адресу

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Нет, вы не можете - 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
}

Ответ 3

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

Но, может быть, это может помочь вам: http://www.maxmind.com/app/geolitecountry

Ответ 4

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

Ответ 5

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

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

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

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

дает

{
    "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
    }
}⏎ 

Ответ 6

Да, страны имеют определенные диапазоны 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/

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

Ответ 8

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

Если вы хотите написать код в java, вы можете использовать файлы 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;
        }
    }

Ответ 9

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

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

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

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

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

Ответ 10

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."
}

Ответ 11

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

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

Ответ 12

Вот мое решение в Python 3.x, чтобы вернуть информацию о географическом местоположении, учитывая фрейм данных, содержащий IP-адреса; эффективное параллельное применение функции на векторизованном pd.series/dataframe - путь.

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

TL;DR: использовать метод geolite2.

1. geolite2 пакет из geolite2 библиотеки

вход

# !pip install maxminddb-geolite2
import time
from geolite2 import geolite2
geo = geolite2.reader()
df_1 = train_data.loc[:50,['IP_Address']]

def IP_info_1(ip):
    try:
        x = geo.get(ip)
    except ValueError:   #Faulty IP value
        return np.nan
    try:
        return x['country']['names']['en'] if x is not None else np.nan
    except KeyError:   #Faulty Key value
        return np.nan

s_time = time.time()
# map IP --> country
#apply(fn) applies fn. on all pd.series elements
df_1['country'] = df_1.loc[:,'IP_Address'].apply(IP_info_1)
print(df_1.head(), '\n')
print('Time:',str(time.time()-s_time)+ \n')

print(type(geo.get('48.151.136.76')))

Выход

       IP_Address         country
0   48.151.136.76   United States
1    94.9.145.169  United Kingdom
2   58.94.157.121           Japan
3  193.187.41.186         Austria
4   125.96.20.172           China 

Time: 0.09906983375549316s 

<class 'dict'>

2. DbIpCity пакет из ip2geotools библиотеки

вход

# !pip install ip2geotools
import time
s_time = time.time()
from ip2geotools.databases.noncommercial import DbIpCity
df_2 = train_data.loc[:50,['IP_Address']]
def IP_info_2(ip):
    try:
        return DbIpCity.get(ip, api_key = 'free').country
    except:
        return np.nan
df_2['country'] = df_2.loc[:, 'IP_Address'].apply(IP_info_2)
print(df_2.head())
print('Time:',str(time.time()-s_time)+'s')

print(type(DbIpCity.get('48.151.136.76',api_key = 'free')))

Выход

       IP_Address country
0   48.151.136.76      US
1    94.9.145.169      GB
2   58.94.157.121      JP
3  193.187.41.186      AT
4   125.96.20.172      CN

Time: 80.53318452835083s 

<class 'ip2geotools.models.IpLocation'>

Причина, по которой огромная разница во времени может быть связана со структурой данных выходных данных, т. Е. Прямое подмножество из словарей, кажется гораздо более эффективной, чем индексация из специализированного объекта ip2geotools.models.IpLocation.

Кроме того, выходные данные 1-го метода представляют собой словарь, содержащий данные о геолокации, которые поднабора соответственно для получения необходимой информации:

x = geolite2.reader().get('48.151.136.76')
print(x)

>>>
    {'city': {'geoname_id': 5101798, 'names': {'de': 'Newark', 'en': 'Newark', 'es': 'Newark', 'fr': 'Newark', 'ja': 'ニューアーク', 'pt-BR': 'Newark', 'ru': 'Ньюарк'}},

 'continent': {'code': 'NA', 'geoname_id': 6255149, 'names': {'de': 'Nordamerika', 'en': 'North America', 'es': 'Norteamérica', 'fr': 'Amérique du Nord', 'ja': '北アメリカ', 'pt-BR': 'América do Norte', 'ru': 'Северная Америка', 'zh-CN': '北美洲'}}, 

'country': {'geoname_id': 6252001, 'iso_code': 'US', 'names': {'de': 'USA', 'en': 'United States', 'es': 'Estados Unidos', 'fr': 'États-Unis', 'ja': 'アメリカ合衆国', 'pt-BR': 'Estados Unidos', 'ru': 'США', 'zh-CN': '美国'}}, 

'location': {'accuracy_radius': 1000, 'latitude': 40.7355, 'longitude': -74.1741, 'metro_code': 501, 'time_zone': 'America/New_York'}, 

'postal': {'code': '07102'}, 

'registered_country': {'geoname_id': 6252001, 'iso_code': 'US', 'names': {'de': 'USA', 'en': 'United States', 'es': 'Estados Unidos', 'fr': 'États-Unis', 'ja': 'アメリカ合衆国', 'pt-BR': 'Estados Unidos', 'ru': 'США', 'zh-CN': '美国'}}, 

'subdivisions': [{'geoname_id': 5101760, 'iso_code': 'NJ', 'names': {'en': 'New Jersey', 'es': 'Nueva Jersey', 'fr': 'New Jersey', 'ja': 'ニュージャージー州', 'pt-BR': 'Nova Jérsia', 'ru': 'Нью-Джерси', 'zh-CN': '新泽西州'}}]}