Identificação do país pelo endereço IP
123.45.56.89 - 231.54.65.98
(apenas um exemplo)
10 answers
Não Pode - os endereços IP são realocados e recolocados de tempos em tempos, por isso o mapeamento de IP para localização também irá mudar ao longo do tempo.
Se quiser descobrir a localização que um endereço IP lhe mapeia de momento, tanto poderá obter uma base de dados de geo-localização, como O GeoLite do MaxMind , Como usar uma API como http://ipinfo.io (o meu próprio serviço) que também lhe dará detalhes adicionais:
$ 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
}
Pode tentar usar https://ip-api.io - api de localização geográfica que devolve o país, entre outras informações IP.
Por exemplo com nó.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))
Podias usar ipdata.co para efectuar a Pesquisa
Esta resposta usa uma chave API de' teste ' que é muito limitada e apenas destinada a testar algumas chamadas. Inscreva-se para a sua própria chave API gratuita e chegar a 1500 pedidos diários para o desenvolvimento.
curl https://api.ipdata.co/23.221.76.66?api-key=test
O Ipdata tem 10 objectivos a nível mundial, cada um capaz de lidar com >10 000 pedidos por segundo!
Dá
{
"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
}
}⏎
Estas duas ligações podem ajudá-lo a associar endereços IP aos países
Concordo com as respostas acima, a melhor maneira de obter o país do endereço ip é o Maxmind.
Se queres escrever código em java, talvez queiras usar isto é geoip-api-1.2.10.jar and geoIP dat files (GeoIPCity.dat), que pode ser encontrado através do google.
Seguindo o código pode ser útil para você obter quase todas as informações relacionadas com a localização, Eu também estou usando o mesmo código.
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;
}
}
A rede Amazon de distribuição de conteúdo CloudFront pode agora ser configurada para passar esta informação como um cabeçalho. Dado o tamanho da Amazon (eles são grandes e estáveis, não indo a lugar algum) e esta é a configuração Sobre código (nenhuma API de terceiros para aprender ou código para manter), todos em torno acreditam que esta é a melhor opção.
Se não usar o AWS CloudFront, vou ver se o seu CDN tem uma opção de cabeçalho semelhante que pode ser ligada. Normalmente, os grandes fornecedores são rápidos a empurrar para a paridade do recurso. E se você não estiver usando um CDN, você poderia colocar CloudFront na frente de sua infra-estrutura e simplesmente definir a origem para resolver para o que você está usando atualmente.
Além disso, também faz sentido resolver isto a nível da CDN. O seu CDN já está a ter de descobrir a localização geográfica para encaminhar o utilizador para o nó de conteúdo mais próximo, mais vale passar esta informação ao longo e não descobri-la duas vezes através de uma API de terceiros (isto torna - se um ponto de escolha para a sua aplicação, à espera que uma pesquisa de localização geográfica seja resolvida). Não há necessidade de fazer este trabalho duas vezes (e a segunda vez, indiscutivelmente menos resiliente [por exemplo, terceiros GEO lookup]).
Https://aws.amazon.com/blogs/aws/enhanced-cloudfront-customization/
Geo-Targeting - CloudFront irá detectar o país de origem do utilizador e passa-lhe o código do condado no ... cabecalho. Você pode usar esta informação para personalizar suas respostas sem ter que usar URLs que são específicos de cada país.
Os endereços IP são muito frequentemente utilizados para o geo-targeting, ou seja, personalizar o conteúdo de um site pela localização / país do visitante, mas não estão permanentemente associados a um país e muitas vezes são reencaminhados.
Para realizar o que você quer, você precisa manter uma pesquisa atualizada para mapear um endereço IP para um país com uma base de dados ou uma API de geolocalização. Aqui está um exemplo:
> https://ipapi.co/8.8.8.8/country
US
> https://ipapi.co/8.8.8.8/country_name
United States
Ou pode usar a API completa para obter a localização completa para IP. endereço por exemplo
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."
}
SIM, pode obter os intervalos de endereços IP por país a partir de https://lite.ip2location.com/ip-address-ranges-by-country
Você pode ver que cada país tem várias gamas e mudanças com frequência.