Técnicas de detecção de localização para endereços IP

Quais são as técnicas de detecção de localização para endereços IP?
Eu sei olhar para o
$_SERVER['HTTP_ACCEPT_LANGUAGE'] (não precisa, mas principalmente útil para detectar a localização, por exemplo, se os usuários de um intervalo de IP definem o francês para o navegador, então isso significa que esse intervalo) pertence à França
e
gethostbyaddr($_SERVER['REMOTE_ADDR']) (para procurar o domínio de primeiro nível com código de país)
então pode ser para whois gethostbyaddr($_SERVER['REMOTE_ADDR'])
as vezes:
$HTTP_USER_AGENT (a string de agente do usuário do Firefox tem código de idioma, não é preciso, mas pode ser usado principalmente para detectar o local)

Também sei como obter o fuso horário, mas isso não funciona nos novos navegadores. Além disso, há um problema css que detecta a história do visitante, ele pode ser usado para ver quais páginas do google e wikipedia ele / ela visitou (google.co.uk, google.com.tr)

Mas e as cidades?

Você não pode fazer isso sem um database que mapeia endereços IP para cidades / países / provedores. Existem ofertas comerciais, como ip2location que você poderia usar. AFAIK não existe alternativa livre, porém, manter esse database de IP é bastante trabalhoso. Alternativa grátis: GeoIP2

Atualização: Existem várias coisas que permitem que você crie um database, se você investir tempo suficiente:

  1. Use os bancos de dados fornecidos pelos registros regionais e locais para localizar o proprietário de um IP.
  2. Muitos ISPs usam um esquema de nomeação que permite localizar o usuário. Às vezes, você pode até ler o nome da cidade em texto simples, se fizer uma pesquisa de DNS reverso. Às vezes é mais enigmático. Por exemplo, eu tenho atualmente p5dcf6c4a.dip.t-dialin.net, e não tenho idéia de que o esquema de nomeação é ..
  3. Use um traceroute. Se você não consegue identificar a localização de um usuário, ainda é possível descobrir a localização do seu uplink

Se você está procurando alguma solução de copiar e colar, eu foudn este código:

  function countryCityFromIP($ipAddr) { //function to find country and city from IP address //Developed by Roshan Bhattarai http://roshanbh.com.np //verify the IP address for the ip2long($ipAddr)== -1 || ip2long($ipAddr) === false ? trigger_error("Invalid IP", E_USER_ERROR) : ""; $ipDetail=array(); //initialize a blank array //get the XML result from hostip.info $xml = file_get_contents("http://api.hostip.info/?ip=".$ipAddr); //get the city name inside the node  and  preg_match("@(\s)*(.*?)@si",$xml,$match); //assing the city name to the array $ipDetail['city']=$match[2]; //get the country name inside the node  and  preg_match("@(.*?)@si",$xml,$matches); //assign the country name to the $ipDetail array $ipDetail['country']=$matches[1]; //get the country name inside the node  and  preg_match("@(.*?)@si",$xml,$cc_match); $ipDetail['country_code']=$cc_match[1]; //assing the country code to array //return the array containing city, country and country code return $ipDetail; } 

Espero que isso ajude alguém.

Existem bancos de dados (alguns deles gratuitos) que podem ser usados ​​para converter IP’s em Cidades:

por exemplo: http://www.maxmind.com/app/geolitecity

Em vez de usar a API de terceiros, sugiro que você use o registro IP auto-hospedado. Este post te explica mais

http://www.techsirius.com/2014/05/simple-geo-tracking-system.html

Basicamente, eles estão usando o registro de database IP do país da maxmind [ http://dev.maxmind.com/geoip/geoip2/geolite2/%5D com poucas modificações. Depois disso, uma consulta de amostra

 $ip = $_SERVER['REMOTE_ADDR']; $long = sprintf('%u', ip2long($ip)); $sql = "SELECT * FROM `geo_ips` WHERE '$long' BETWEEN `ip_start` AND `ip_end`"; 

Uma maneira pela qual esses bancos de dados são compilados é a partir da informação whois. Por exemplo, para determinar a localização de 69.59.196.211:

fmark @ home: ~ $ host 69.59.196.211 211.196.59.69.in-addr.arpa ponteiro de nome de domínio stackoverflow.com. fmark @ home: ~ $ whois stackoverflow.com

Versão do servidor Whois 2.0

Os nomes de domínio nos domínios .com e .net agora podem ser registrados com muitos registradores concorrentes diferentes.

   

> Registrante: stackoverflow.com llc
410 Clayton Ave El Cerrito, Califórnia 94530 Estados Unidos

   

Obviamente, isso não é extremamente preciso, portanto, técnicas mais sofisticadas são supostamente usadas.

Se a funcionalidade de geolocalização não for um grande requisito para o seu projeto, você pode usar algo tão simples como este:

 $geotxt=''; $dt=json_decode(@file_get_contents('https://freegeoip.net/json/'.$_SERVER['REMOTE_ADDR'])); if ($dt!=null) $geotxt=$dt->country_name.', '.$dt->region_name.', '.$dt->city; echo $geotxt; 

Você tem que levar em conta que o freegeoip tem um limite de 10k pedido / hora.

Você pode usar esta function

  function ip_info(){ return $data = json_decode(file_get_contents('http://ip-api.com/json/'),true); } 

Chame a function

 $info = ip_info(); var_dump($info); 

Você pode mapear um endereço IP para sua localização (cidade, país, código postal), fuso horário etc. com um database ou com uma API (database hospedado).

Aqui está um exemplo de uso de uma API

 curl https://ipapi.co/city/ > Mountain View curl https://ipapi.co/country/ > US curl https://ipapi.co/timezone/ > America/Los_Angeles 

mais aqui: localização do endereço IP

A maioria dos bancos de dados existentes usa uma agregação de dados dos registros internacionais ARIN, AFRINIC, ANIC etc., bem como dos locais enviados pelos usuários. Técnicas mais sofisticadas incluem Topologia e Geolocalização de Restrições.

Eu corro minha própria ipdata.co API que fornece vários pontos de dados, incluindo o país, cidade, região, lat / long e outros.

Esta resposta usa uma chave de API ‘teste’ que é muito limitada e destinada apenas a testar algumas chamadas. Inscreva-se para obter sua própria API gratuita e receba até 1500 solicitações diárias para desenvolvimento.

 php > $data = json_decode(file_get_contents('https://api.ipdata.co/69.59.196.211?api-key=test'),true); php > echo $data['country_name']; //United States php > echo $data['city']; //Albany 
    Intereting Posts