有没有办法通过查看IP地址来确定国家/地区名称?我的意思是,国家/地区是否有特定的IP地址范围?例如,澳大利亚的IP地址只能在123.45.56.89 - 231.54.65.98
范围内(仅作为示例)
答案 0 :(得分:26)
不,你不能 - IP地址会不时被重新分配和重新分配,因此IP到位置的映射也会随着时间的推移而改变。
如果您想查找IP地址当前映射到的位置,您可以下载地理位置数据库,例如GeoLite from MaxMind,或使用http://ipinfo.io(我自己的服务)等API还会为您提供更多详细信息:
$ 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
}
答案 1 :(得分:13)
我认为您正在寻找的是IP地理位置数据库或服务提供商。那里有很多,有些是免费的(得到你付出的代价)。
虽然我以前没有使用过这项服务,但它声称是实时的。 https://kickfire.com/kf-api
但是只需对IP地理位置进行Google搜索,您就可以获得比您需要的更多结果。
答案 2 :(得分:2)
这并不容易。 IP地址不会分配给各国,而是分配给公司和组织。
答案 3 :(得分:2)
您可以尝试使用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))
答案 4 :(得分:2)
您可以使用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
}
}⏎
答案 5 :(得分:2)
我知道这是一个非常老的帖子,但是为了让用户登陆这里并寻找解决方案,如果您将Cloudflare用作DNS,则可以激活IP地理位置并从请求中获取价值标头
在通过网络标签在Cloudflare中启用IP地理位置定位后,这是C#中的代码段
var countryCode = HttpContext.Request.Headers.Get("cf-ipcountry"); // in older asp.net versions like webform use HttpContext.Current.Request. ...
var countryName = new RegionInfo(CountryCode)?.EnglishName;
您可以简单地将其映射到其他编程语言,请查看Cloudflare的documentation here
但是,如果您真的坚持使用第三方解决方案来获得有关使用其IP的访问者的更精确信息,那么这里是使用C#的完整,随时可用的实现:
我使用的第三方是https://ipstack.com,您可以简单地注册一个免费计划并获得访问令牌以每月用于10K API请求,我正在使用JSON模型进行检索并喜欢进行转换API提供给我的所有信息,我们开始:
DTO:
using System;
using Newtonsoft.Json;
public partial class GeoLocationModel
{
[JsonProperty("ip")]
public string Ip { get; set; }
[JsonProperty("hostname")]
public string Hostname { get; set; }
[JsonProperty("type")]
public string Type { get; set; }
[JsonProperty("continent_code")]
public string ContinentCode { get; set; }
[JsonProperty("continent_name")]
public string ContinentName { get; set; }
[JsonProperty("country_code")]
public string CountryCode { get; set; }
[JsonProperty("country_name")]
public string CountryName { get; set; }
[JsonProperty("region_code")]
public string RegionCode { get; set; }
[JsonProperty("region_name")]
public string RegionName { get; set; }
[JsonProperty("city")]
public string City { get; set; }
[JsonProperty("zip")]
public long Zip { get; set; }
[JsonProperty("latitude")]
public double Latitude { get; set; }
[JsonProperty("longitude")]
public double Longitude { get; set; }
[JsonProperty("location")]
public Location Location { get; set; }
[JsonProperty("time_zone")]
public TimeZone TimeZone { get; set; }
[JsonProperty("currency")]
public Currency Currency { get; set; }
[JsonProperty("connection")]
public Connection Connection { get; set; }
[JsonProperty("security")]
public Security Security { get; set; }
}
public partial class Connection
{
[JsonProperty("asn")]
public long Asn { get; set; }
[JsonProperty("isp")]
public string Isp { get; set; }
}
public partial class Currency
{
[JsonProperty("code")]
public string Code { get; set; }
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("plural")]
public string Plural { get; set; }
[JsonProperty("symbol")]
public string Symbol { get; set; }
[JsonProperty("symbol_native")]
public string SymbolNative { get; set; }
}
public partial class Location
{
[JsonProperty("geoname_id")]
public long GeonameId { get; set; }
[JsonProperty("capital")]
public string Capital { get; set; }
[JsonProperty("languages")]
public Language[] Languages { get; set; }
[JsonProperty("country_flag")]
public Uri CountryFlag { get; set; }
[JsonProperty("country_flag_emoji")]
public string CountryFlagEmoji { get; set; }
[JsonProperty("country_flag_emoji_unicode")]
public string CountryFlagEmojiUnicode { get; set; }
[JsonProperty("calling_code")]
public long CallingCode { get; set; }
[JsonProperty("is_eu")]
public bool IsEu { get; set; }
}
public partial class Language
{
[JsonProperty("code")]
public string Code { get; set; }
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("native")]
public string Native { get; set; }
}
public partial class Security
{
[JsonProperty("is_proxy")]
public bool IsProxy { get; set; }
[JsonProperty("proxy_type")]
public object ProxyType { get; set; }
[JsonProperty("is_crawler")]
public bool IsCrawler { get; set; }
[JsonProperty("crawler_name")]
public object CrawlerName { get; set; }
[JsonProperty("crawler_type")]
public object CrawlerType { get; set; }
[JsonProperty("is_tor")]
public bool IsTor { get; set; }
[JsonProperty("threat_level")]
public string ThreatLevel { get; set; }
[JsonProperty("threat_types")]
public object ThreatTypes { get; set; }
}
public partial class TimeZone
{
[JsonProperty("id")]
public string Id { get; set; }
[JsonProperty("current_time")]
public DateTimeOffset CurrentTime { get; set; }
[JsonProperty("gmt_offset")]
public long GmtOffset { get; set; }
[JsonProperty("code")]
public string Code { get; set; }
[JsonProperty("is_daylight_saving")]
public bool IsDaylightSaving { get; set; }
}
助手:
using System.Configuration;
using System.IO;
using System.Net;
using System.Threading.Tasks;
public class GeoLocationHelper
{
public static async Task<GeoLocationModel> GetGeoLocationByIp(string ipAddress)
{
var request = WebRequest.Create(string.Format("http://api.ipstack.com/{0}?access_key={1}", ipAddress, ConfigurationManager.AppSettings["ipStackAccessKey"]));
var response = await request.GetResponseAsync();
using (var stream = new StreamReader(response.GetResponseStream()))
{
var jsonGeoData = await stream.ReadToEndAsync();
return Newtonsoft.Json.JsonConvert.DeserializeObject<GeoLocationModel>(jsonGeoData);
}
}
}
答案 6 :(得分:1)
可能这两个链接可以帮助您Associate IP addresses with countries
答案 7 :(得分:1)
我同意上述答案,从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;
}
}
答案 8 :(得分:1)
亚马逊的CloudFront内容分发网络现在可以配置为通过标头传递此信息。鉴于亚马逊的规模(他们大而稳定,不会去任何地方)这是配置代码(没有第三方API学习或代码维护),所以周围都认为这是最好的选择
如果您不使用AWS CloudFront,我会查看您的CDN是否具有可以打开的类似标题选项。通常,大型提供商可以快速推动功能奇偶校验。如果您没有使用CDN,您可以将CloudFront放在您的基础架构前面,只需将原点设置为解析为您当前使用的任何内容。
此外,在CDN级别解决此问题也很有意义。您的CDN已经必须找出将用户路由到最近的内容节点的地理位置,也可以传递这些信息,而不是通过第三方API弄清楚两次(这会成为您应用的阻塞点,等待地理位置位置查找以解决)。无需两次完成这项工作(第二次,可以说不那么有弹性[例如,第三方地理查找])。
https://aws.amazon.com/blogs/aws/enhanced-cloudfront-customization/
地理定位 - CloudFront将检测用户的原始国家/地区 并在
CloudFront-Viewer-Country
中将县代码传递给您 头。您可以使用此信息来自定义您的回复 无需使用特定于每个国家/地区的网址。
答案 9 :(得分:1)
IP地址非常常用于地理定位,即访问者的位置/国家/地区定制网站内容,但它们不是与国家永久关联,而是经常重新分配。
要完成您想要的任务,您需要保持最新查找,以使用数据库或地理位置API将IP地址映射到国家/地区。这是一个例子:
> https://ipapi.co/8.8.8.8/country
US
> https://ipapi.co/8.8.8.8/country_name
United States
或者您可以使用完整的API来获取完整的location for IP address,例如
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."
}
答案 10 :(得分:1)
是的,您可以从https://lite.ip2location.com/ip-address-ranges-by-country
按国家/地区下载IP地址范围您可以看到每个国家/地区都有多个范围并经常更改。
答案 11 :(得分:1)
是的,您所提到的国家/地区具有特定的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/
现在,我们将其用于我们自己的需求并出售。我不希望它成为销售人员,但是对于那些正在寻找简单解决方案的人来说,可以从中受益。
答案 12 :(得分:0)
这是我在Python 3.x中的解决方案,它在给定包含 IP地址的数据框时返回地理位置信息;在矢量化的pd.series / dataframe上高效地并行应用功能是必经之路。
两个对比库的对比性能将返回位置。
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
库中的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'>
之所以会造成巨大的时间差异,原因可能是输出的数据结构,即 ie 从 dictionaries 直接子集化,似乎比从专用< em> ip2geotools.models.IpLocation 对象。
此外,第一种方法的输出是包含地理位置数据的字典,该数据分别是子集以获得所需的信息:
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': '新泽西州'}}]}