How to get the Country according to a certain IP?

57

35

Does anyone know of a simple way to retrieve the country for a given IP Address? Preferably in ISO_3166-1 format?

DylanJ

Posted 2008-08-04T05:15:35.773

Reputation: 1 275

8Don't place too much reliance on the IP telling you the country where the user is sitting: because I work for a Scandinavian company I keep seeing adverts in Swedish, even though our office is in Scotland... – AAT – 2010-01-13T13:45:19.720

Exactly - if you think about it. There are many cases where you may appear to come from somewhere, but actually come from somewhere else. Its all down to the fact that network topology does not have to confirm to political or geological borders. F.ex. VPN's, wireless, satelite and so on. – Phluks – 2013-02-06T10:26:11.407

Answers

36

A lot of people (including my company) seem to use MaxMind GeoIP.

They have a free version GeoLite which is not as accurate as the paid version, but if you're just after something simple, it may be good enough.

Orion Edwards

Posted 2008-08-04T05:15:35.773

Reputation: 84 307

2The GeoLite link above results in a 404 when I checked today. – Parag – 2014-02-17T23:04:10.073

working link is http://dev.maxmind.com/geoip/geoip2/geolite2/

– Manoj – 2014-08-18T06:28:55.550

Our geo location api will also work just fine: https://ip-api.io

– Andrey E – 2017-08-09T20:54:03.523

38

There are two approaches: using an Internet service and using some kind of local list (perhaps wrapped in a library). What you want will depend on what you are building.

For services:

For lists:

Warren Blanchet

Posted 2008-08-04T05:15:35.773

Reputation: 1 076

1One of the most useful answers in general that I have seen in SO. Thank you! – tzot – 2008-10-03T12:08:59.917

Do you maybe know if the RIRs also have more detailed information, like the geopipcity db from maxmind, available as open data? I did look, but could not find it – Jevado – 2011-07-29T09:44:46.473

10

Here's a nice free service with a public API: http://www.hostip.info/use.html

Mark Harrison

Posted 2008-08-04T05:15:35.773

Reputation: 168 827

8

ipinfodb provides a free database and API for IP to country and vice versa. They use free data from MaxMind. The data gets updated every month, and it's a great free alternative with decent accuracy.

Donny Kurnia

Posted 2008-08-04T05:15:35.773

Reputation: 4 132

Way better than maintaining your own database. Just tested it on a really obscure place (Uthai Thani, Thailand) and it was spot on. Great find, thanks! – Jannie Theunissen – 2010-07-29T13:05:46.300

5

I don't know how accurate that hostip.info site is. I just visted that site, and it reported that my country is Canada. I'm in the US and the ISP that my office uses only operates from the US. It does allow you to correct it's guess, but if you are using this service to track web site vistors by country, you'll have no way of knowing if the data is correct. Of course, I'm just one data point. I downloaded the GeoLite Country database, which is just a .csv file, and my IP address was correctly identified as US.

Another benefit of the MaxMind product line (paid or free) is that you have the data, you don't incur the performance hit of making a web service call to another system.

Chris Miller

Posted 2008-08-04T05:15:35.773

Reputation: 3 257

Im in the UK and it said i was in Rio, Brazil :) – Mike – 2011-05-08T15:44:50.947

2

Try this php code

  <?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];?>

pckabeer

Posted 2008-08-04T05:15:35.773

Reputation: 616

2

The most accurate is Digital Elements NetAcuity...not free but you get what you pay for most of the time....Digital Element

CSharpAtl

Posted 2008-08-04T05:15:35.773

Reputation: 5 202

2

google's clientlocation returns (my example)

latlng = new google.maps.LatLng(google.loader.ClientLocation.latitude, google.loader.ClientLocation.longitude);
location = "IP location: " + getFormattedLocation();
document.getElementById("location").innerHTML = location;

Niklas Rosencrantz

Posted 2008-08-04T05:15:35.773

Reputation: 7 051

2

You can use my service, http://ipinfo.io, for this. The API returns a whole bunch of different details about an IP address:

$ 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
}

If you're only after the country code you just need to add /country to the URL:

$ curl ipinfo.io/8.8.8.8/country
US

Here's a generic PHP function you could use:

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

I've used the IP 8.8.8.8 in these examples, but if you want details for the user's IP just pass in $_SERVER['REMOTE_ADDR'] instead. More details are available at http://ipinfo.io/developers

Ben Dowling

Posted 2008-08-04T05:15:35.773

Reputation: 11 464

2

You can use the solution provided for this question.

But it returns a 2 digit country code.

zak

Posted 2008-08-04T05:15:35.773

Reputation: 109

1

use the function ipToCountry($ip) from http://www.mmtutorialvault.com/php-ip-to-country-function/

saifur

Posted 2008-08-04T05:15:35.773

Reputation: 500

1

you can use web service API's which do this work like:

see example of service: http://ip-api.com and usage: http://whatmyip.info

user3463375

Posted 2008-08-04T05:15:35.773

Reputation: 79

0

See ipdata.co which gives you several data points from an ip address.

The API is pretty fast, with 10 global endpoints each able to handle >800M calls daily.

Here's a curl example;

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
    }
}⏎  

Jonathan

Posted 2008-08-04T05:15:35.773

Reputation: 3 305

0

You can try the free IP2Location LITE database

To create the table in 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;

To import the data

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;

PHP code to query the 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);
 }
}
?>

Vlam

Posted 2008-08-04T05:15:35.773

Reputation: 572