web-dev-qa-db-ja.com

IPアドレスによる国の特定

IPアドレスを見るだけで国名を把握する方法はありますか?つまり、国には特定の範囲のIPアドレスがありますか?たとえば、オーストラリアでは123.45.56.89 - 231.54.65.98の範囲内のIPアドレスのみを持つことができます(単なる例)

38
skos

探しているのはIP Geolocationデータベースまたはサービスプロバイダーだと思います。世の中にはたくさんあり、無料のものもあります(料金をお支払いください)。

私は以前にこのサービスを使用したことはありませんが、リアルタイムであると主張しています。 https://kickfire.com/kf-api

ただし、IP地域でGoogle検索を実行するだけで、必要以上の結果が得られます。

13
Chris Gessler

いいえ、できません-IPアドレスは時々再割り当てされ、再割り当てされるため、IPの場所へのマッピングも時間とともに変化します。

現在IPアドレスがマッピングされている場所を知りたい場合は、 GeoLite from MaxMind などの位置情報データベースをダウンロードするか、 http:// ipinfoのようなAPIを使用します。 .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
}
28
Ben Dowling

簡単ではありません。 IPアドレスは国自体ではなく、企業や組織に割り当てられます。

しかし、おそらくこれはあなたを助けることができます: http://www.maxmind.com/app/geolitecountry

3
barsju

ipdata.co を使用して検索を実行できます

この回答では、「テスト」APIキーを使用していますが、これは非常に限定されており、数回の呼び出しをテストするためだけのものです。 Signup 独自の無料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
    }
}⏎ 
3
Jonathan

IPアドレスは、ジオターゲティングに非常に一般的に使用されます。つまり、訪問者の場所/国によってWebサイトのコンテンツをカスタマイズしますが、永久に国に関連付けられるわけではなく、多くの場合再割り当てされます。

目的を達成するには、データベースまたはジオロケーションAPIを使用して、IPアドレスを国にマッピングするための最新のルックアップを維持する必要があります。以下に例を示します。

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

https://ip-api.io -他のIP情報の中で国を返すジオロケーションAPIを使用してみてください。

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
Andrey E

はい、国はあなたが述べたように特定のIPアドレス範囲を持っています。

たとえば、オーストラリアは16777216〜16777471の間です。中国は16777472〜16778239の間です。しかし、1つの国に複数の範囲がある場合があります。たとえば、オーストラリアには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
Onur

はい。国ごとにIPアドレス範囲を https://lite.ip2location.com/ip-address-ranges-by-country からダウンロードできます。

各国には複数の範囲があり、頻繁に変化することがわかります。

1
Michael C.

これらの2つのリンクが役立つ場合があります IPアドレスを国に関連付ける

http://en.wikipedia.org/wiki/Regional_Internet_Registry

1
rcky

上記の回答に同意します。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;
        }
    }

AmazonのCloudFrontコンテンツ配信ネットワークは、この情報をヘッダーとして渡すように設定できるようになりました。 Amazonのサイズ(大きくて安定しており、どこにも行かない)とこれがコード上の構成(学習するサードパーティのAPIや維持するコードがない)を考えると、これは最良の選択肢であると信じられています。

AWS CloudFrontを使用しない場合、CDNにオンにできる同様のヘッダーオプションがあるかどうかを確認します。通常、大規模なプロバイダーは、機能の同等性を求めて迅速にプッシュします。また、CDNを使用していない場合は、CloudFrontをインフラストラクチャの前に配置し、現在使用しているものに解決するようにOriginを設定するだけです。

また、CDNレベルでこれを解決することも理にかなっています。 CDNは、ユーザーを最も近いコンテンツノードにルーティングするために地理的位置を既に把握している必要があり、この情報を第三者のAPIを介して2回把握せずに渡す可能性があります(これは、アプリのチョークポイントとなり、解決する場所の検索)。この作業を2回行う必要はありません(2回目は、おそらく弾力性が低くなります(たとえば、サードパーティの地理情報検索))。

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

ジオターゲティング– CloudFrontはユーザーの出身国を検出し、CloudFront-Viewer-Countryヘッダー。この情報を使用して、各国固有のURLを使用することなく、応答をカスタマイズできます。

1
Joshua Robinson

Python 3.x geo-locationIP Address(s);効率的な並列化を含むデータフレームが与えられた場合に返す情報ベクトル化されたpd.series/dataframeに関数を適用する方法があります。

2つの一般的なライブラリのパフォーマンスを比較して、locationを返します。

TLDR: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)+'s \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パッケージfrom 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'>

巨大な時間差が出力のデータ構造による可能性がある理由は、iedictionariesからの直接サブセット化のようです特定の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': '新泽西州'}}]}
0
Sumanth Lazarus