Identificação do país pelo endereço IP

Há alguma maneira de descobrir o nome do país só de olhar para um endereço IP? Quero dizer, os países têm gamas específicas de endereços IP? Por exemplo, a Austrália pode ter endereços IP apenas na gama de 123.45.56.89 - 231.54.65.98 (apenas um exemplo)

Author: Ben Dowling, 2012-03-21

10 answers

Acho que o que procura é uma base de dados de geolocalização IP ou um fornecedor de serviços. Há muitos lá fora e alguns são livres (obter o que você paga para). Apesar de não ter usado este serviço antes, diz ser em tempo real. https://kickfire.com/kf-api Mas faça uma pesquisa no google no IP geo e terá mais resultados do que precisa.
 13
Author: Chris Gessler, 2016-03-06 20:15:03

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
}
 23
Author: Ben Dowling, 2014-08-07 06:39:45
Não é assim tão fácil. Os anúncios de PI não são atribuídos a países como tal, mas a empresas e organizações. Mas talvez isto te possa ajudar. http://www.maxmind.com/app/geolitecountry
 2
Author: barsju, 2012-03-21 09:50:37

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))
 2
Author: Andrey E, 2017-08-06 20:41:17

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!

{
    "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
    }
}⏎ 
 2
Author: Jonathan, 2018-08-29 13:41:17
 1
Author: rcky, 2017-05-23 11:47:17

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;
        }
    }
 1
Author: Pankaj Kumar Katiyar, 2015-06-03 08:44:41

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.

 1
Author: Joshua Robinson, 2017-12-20 22:15:15

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."
}
 1
Author: Francis, 2018-02-09 15:50:13

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.

 1
Author: Michael C., 2018-02-28 02:12:12