Como obter o País, de acordo com um determinado IP?
Pergunta
Alguém sabe de uma maneira simples para recuperar o país para um determinado Endereço IP?De preferência em ISO_3166-1 formato?
Solução
Um monte de gente (incluindo a minha empresa) parecem usar MaxMind GeoIP.
Eles têm uma versão gratuita GeoLite o que não é tão preciso como a versão paga, mas se você está apenas atrás de algo simples, pode ser bom o suficiente.
Outras dicas
Existem duas abordagens:através de um serviço Internet e usando algum tipo de lista local (talvez envolto em uma biblioteca).O que você quer depende do que você está construindo.
Serviços:
- http://www.hostip.info/use.html (como mencionado por Marca)
- http://www.team-cymru.org/Services/ip-to-asn.html
Para listas:
- http://www.maxmind.com/app/geoip_country (como mencionado por Orion)
Você pode lançar seu próprio baixando as listas de Rir:
- ftp.arin.net/pub/stats/arin/delegated-arin-latest
- ftp.ripe.net/ripe/stats/delegated-ripencc-latest
- ftp.afrinic.net/pub/stats/afrinic/delegated-afrinic-latest
- ftp.apnic.net/pub/stats/apnic/delegated-apnic-latest
ftp.lacnic.net/pub/stats/lacnic/delegated-lacnic-latest
O formato é documentado este leia-me
Aqui está um bom serviço gratuito com uma API pública:http://www.hostip.info/use.html
ipinfodb fornece gratuitamente um banco de dados e a API de IP para o país e vice-versa.Eles usam de dados livre de MaxMind.Os dados são atualizados a cada mês, e é uma ótima alternativa gratuita com precisão aceitável.
Eu não sei o quão preciso que hostip.info é o sítio.Eu só visted do site, e informou que o meu país é o Canadá.Eu estou na EUA e o ISP que meu escritório utiliza apenas opera a partir de os EUA.Ele permite que você correta é adivinhar, mas se você está utilizando este serviço para rastrear a web sites os visitantes por país, você vai ter nenhuma maneira de saber se os dados estão correctos.Claro, eu sou apenas um ponto de dados.Eu baixei o GeoLite País de banco de dados, que é apenas uma .arquivo csv, e o meu endereço IP foi identificado corretamente como NÓS.
Outro benefício da MaxMind linha de produtos (pagos ou gratuitos) é que você tem a dados, não há a ocorrência de desempenho de fazer uma chamada de serviço da web para outro sistema.
O mais preciso é Digital Elementos NetAcuity...não é gratuito, mas você começa o que você paga a maior parte do tempo....Digital Elemento
google clientlocation retorna (meu exemplo)
latlng = new google.maps.LatLng(google.loader.ClientLocation.latitude, google.loader.ClientLocation.longitude);
location = "IP location: " + getFormattedLocation();
document.getElementById("location").innerHTML = location;
Você pode usar a solução prevista esta pergunta.
Mas ela retorna 2 dígitos do código de país.
Tente este código php
<?php $ip = $_SERVER['REMOTE_ADDR'];
$json = file_get_contents("http://api.easyjquery.com/ips/?ip=".$ip."&full=true");
$json = json_decode($json,true);
$timezone = $json[localTimeZone];?>
Você pode usar o meu serviço, http://ipinfo.io, para isso.A API retorna um monte de detalhes diferentes sobre um endereço IP:
$ 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": "CA",
"country": "US",
"phone": 650
}
Se você está só depois o código do país, você só precisa adicionar /país para a URL:
$ curl ipinfo.io/8.8.8.8/country
US
Aqui está um genérico do PHP função, você poderá usar:
function ip_details($ip) {
$json = file_get_contents("http://ipinfo.io/{$ip}");
$details = json_decode($json);
return $details;
}
$details = ip_details("8.8.8.8");
echo $details->city; // => Mountain View
echo $details->country; // => US
echo $details->org; // => AS15169 Google Inc.
echo $details->hostname; // => google-public-dns-a.google.com
Eu usei o IP 8.8.8.8 nestes exemplos, mas se você quiser mais detalhes para o IP do usuário, basta passar em $_SERVER['REMOTE_ADDR']
em vez disso.Mais detalhes estão disponíveis em http://ipinfo.io/developers
use a função ipToCountry($ip) a partir de http://www.mmtutorialvault.com/php-ip-to-country-function/
você pode usar a API do serviço da web do que fazer este tipo de trabalho como:
see example of service: http://ip-api.com and usage: http://whatmyip.info
Ver ipdata.co o que lhe dá vários pontos de dados a partir de um endereço ip.
A API é muito rápido, com 10 global de pontos de extremidade de cada um capaz de lidar com >800M chamadas por dia.
Aqui está um cacho exemplo;
curl https://api.ipdata.co/78.8.53.5
{
"ip": "78.8.53.5",
"city": "G\u0142og\u00f3w",
"region": "Lower Silesia",
"region_code": "DS",
"country_name": "Poland",
"country_code": "PL",
"continent_name": "Europe",
"continent_code": "EU",
"latitude": 51.6461,
"longitude": 16.1678,
"asn": "AS12741",
"organisation": "Netia SA",
"postal": "67-200",
"currency": "PLN",
"currency_symbol": "z\u0142",
"calling_code": "48",
"flag": "https://ipdata.co/flags/pl.png",
"emoji_flag": "\ud83c\uddf5\ud83c\uddf1",
"time_zone": "Europe/Warsaw",
"is_eu": true,
"suspicious_factors": {
"is_tor": false
}
}⏎
Você pode tentar livre IP2Location LITE banco de dados
Para criar a tabela no MySQL
CREATE DATABASE ip2location;
USE ip2location;
CREATE TABLE `ip2location_db1`(
`ip_from` INT(10) UNSIGNED,
`ip_to` INT(10) UNSIGNED,
`country_code` CHAR(2),
`country_name` VARCHAR(64),
INDEX `idx_ip_to` (`ip_to`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
Para importar os dados
LOAD DATA LOCAL
INFILE 'IP2LOCATION-LITE-DB1.CSV'
INTO TABLE
`ip2location_db1`
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 0 LINES;
Código PHP para consulta MySQL
<?php
// Replace this MYSQL server variables with actual configuration
$mysql_server = "mysql_server.com";
$mysql_user_name = "UserName";
$mysql_user_pass = "Password";
// Retrieve visitor IP address from server variable REMOTE_ADDR
$ipaddress = $_SERVER["REMOTE_ADDR"];
// Convert IP address to IP number for querying database
$ipno = Dot2LongIP($ipaddress);
// Connect to the database server
$link = mysql_connect($mysql_server, $mysql_user_name, $mysql_user_pass) or die("Could not connect to MySQL database");
// Connect to the IP2Location database
mysql_select_db("ip2location") or die("Could not select database");
// SQL query string to match the recordset that the IP number fall between the valid range
$query = "SELECT * FROM ip2location_db1 WHERE $ipno <= ip_to LIMIT 1";
// Execute SQL query
$result = mysql_query($query) or die("IP2Location Query Failed");
// Retrieve the recordset (only one)
$row = mysql_fetch_object($result);
// Keep the country information into two different variables
$country_code = $row->country_code;
$country_name = $row->country_name;
echo "Country_code: " . $country_code . "<br/>";
echo "Country_name: " . $country_name . "<br />";
// Free recordset and close database connection
mysql_free_result($result);
mysql_close($link);
// Function to convert IP address (xxx.xxx.xxx.xxx) to IP number (0 to 256^4-1)
function Dot2LongIP ($IPaddr) {
if ($IPaddr == "")
{
return 0;
} else {
$ips = explode(".", $IPaddr);
return ($ips[3] + $ips[2] * 256 + $ips[1] * 256 * 256 + $ips[0] * 256 * 256 * 256);
}
}
?>