Jak zdobyć Kraj według określonego adresu IP?

głosy
57

Czy ktoś zna prosty sposób pobrać kraju dla danego adresu IP? Najlepiej w formacie ISO_3166-1?

Utwórz 04/08/2008 o 06:15
źródło użytkownik
W innych językach...                            


14 odpowiedzi

głosy
38

Istnieją dwa sposoby: za pośrednictwem usługi internetowej i przy użyciu pewnego rodzaju lokalnej listy (być może owinięty w bibliotece). Co chcesz zależeć będzie od tego, co budują.

Dla usługi:

Na listach:

Odpowiedział 15/09/2008 o 20:45
źródło użytkownik

głosy
35

Wiele osób (w tym moją firmę) wydają się używać MaxMind GeoIP.

Mają darmową wersję GeoLite które nie są tak dokładne jak w wersji płatnej, ale jeśli jesteś po prostu czegoś prostego, może być wystarczająco dobre.

Odpowiedział 04/08/2008 o 07:26
źródło użytkownik

głosy
10

Oto miły darmowy serwis z publicznym API: http://www.hostip.info/use.html

Odpowiedział 04/08/2008 o 06:21
źródło użytkownik

głosy
8

ipinfodb zapewnia bezpłatną bazę danych i API dla IP do kraju i vice versa. Używają dostęp do danych z MaxMind. Dane jest aktualizowany co miesiąc, a to wielka darmowa alternatywa z przyzwoitą dokładnością.

Odpowiedział 13/01/2010 o 14:13
źródło użytkownik

głosy
5

Nie wiem jak dokładne że strona hostip.info jest. Właśnie odwiedziłem ten teren, i poinformował, że mój kraj jest Kanada. Jestem w USA i ISP, że mój urząd korzysta działa tylko z USA. Czyni pozwalają skorygować to przypuszczenie, ale jeśli używasz tej usługi do śledzenia vistors witryny internetowej poprzez kraju, nie będziesz miał możliwości dowiedzenia się, czy dane są poprawne. Oczywiście, jestem tylko jeden punkt danych. Pobrałem bazy GeoLite kraj, który jest tylko plik .csv, a mój adres IP został prawidłowo zidentyfikowany jako USA.

Inną zaletą linii produktów MaxMind (płatnego lub za darmo) jest to, że masz dane, nie naraża się na spadek wydajności dokonywania zgłoszenia serwisowego WWW do innego systemu.

Odpowiedział 04/08/2008 o 15:02
źródło użytkownik

głosy
2

Można korzystać z usługi, http://ipinfo.io , za to. API zwraca całą masę różnych informacji na temat adresu 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
}

Jeśli jesteś tylko po kodzie kraju wystarczy dodać / kraj do adresu URL:

$ curl ipinfo.io/8.8.8.8/country
US

Oto ogólna funkcja PHP można użyć:

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

Użyłem IP 8.8.8.8 w tych przykładach, ale jeśli chcesz szczegóły dotyczące IP użytkownika prostu przekazać w $_SERVER['REMOTE_ADDR']zamian. Więcej szczegółów można znaleźć na http://ipinfo.io/developers

Odpowiedział 26/08/2014 o 05:49
źródło użytkownik

głosy
2

Spróbuj tego kodu 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];?>
Odpowiedział 30/07/2012 o 09:07
źródło użytkownik

głosy
2

Można użyć rozwiązania przewidzianego to pytanie .

Ale zwraca 2-cyfrowy kod kraju.

Odpowiedział 19/10/2011 o 15:04
źródło użytkownik

głosy
2

Google zwraca clientlocation ( mój przykład )

latlng = new google.maps.LatLng(google.loader.ClientLocation.latitude, google.loader.ClientLocation.longitude);
location = "IP location: " + getFormattedLocation();
document.getElementById("location").innerHTML = location;
Odpowiedział 13/01/2010 o 14:25
źródło użytkownik

głosy
2

Najdokładniejsza jest Cyfrowa Elementy NetAcuity ... nie za darmo, ale masz za co płacisz większość czasu .... Cyfrowy Element

Odpowiedział 27/09/2008 o 04:04
źródło użytkownik

głosy
1

można użyć Web Service API, które działają jak to zrobić:

see example of service: http://ip-api.com and usage: http://whatmyip.info
Odpowiedział 26/05/2014 o 15:59
źródło użytkownik

głosy
1

użyć funkcji ipToCountry ($ ip) od http://www.mmtutorialvault.com/php-ip-to-country-function/

Odpowiedział 27/06/2013 o 18:54
źródło użytkownik

głosy
0

Można spróbować darmowej bazy danych IP2Location LITE

Aby utworzyć tabelę w 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;

Aby zaimportować dane

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;

Kod PHP kwerendy 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);
 }
}
?>
Odpowiedział 27/02/2018 o 05:32
źródło użytkownik

głosy
0

Zobacz ipdata.co który daje kilka punktów danych z adresu IP.

API jest bardzo szybki, z 10 punktami końcowymi globalne każdy stanie obsłużyć> 800M wzywa codziennie.

Oto przykład curl;

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
    }
}⏎  
Odpowiedział 18/02/2018 o 19:05
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more