IPアドレスを見るだけで国名を把握する方法はありますか?つまり、国には特定の範囲のIPアドレスがありますか?たとえば、オーストラリアでは123.45.56.89 - 231.54.65.98
の範囲内のIPアドレスのみを持つことができます(単なる例)
探しているのはIP Geolocationデータベースまたはサービスプロバイダーだと思います。世の中にはたくさんあり、無料のものもあります(料金をお支払いください)。
私は以前にこのサービスを使用したことはありませんが、リアルタイムであると主張しています。 https://kickfire.com/kf-api
ただし、IP地域でGoogle検索を実行するだけで、必要以上の結果が得られます。
いいえ、できません-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
}
簡単ではありません。 IPアドレスは国自体ではなく、企業や組織に割り当てられます。
しかし、おそらくこれはあなたを助けることができます: http://www.maxmind.com/app/geolitecountry
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
}
}⏎
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."
}
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))
はい、国はあなたが述べたように特定の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/
今、私たちは私たち自身のニーズに合わせてこれを使用し、販売しています。私はそれを売り込みにしたくありませんが、簡単な解決策を探している人にとっては、この恩恵を受けることができます。
はい。国ごとにIPアドレス範囲を https://lite.ip2location.com/ip-address-ranges-by-country からダウンロードできます。
各国には複数の範囲があり、頻繁に変化することがわかります。
これらの2つのリンクが役立つ場合があります IPアドレスを国に関連付ける
上記の回答に同意します。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を使用することなく、応答をカスタマイズできます。
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': '新泽西州'}}]}