从IP地址获取位置

时间:2009-01-03 22:27:02

标签: php geolocation ip geoip

我想从他们的IP地址检索访问者的城市,州和国家等信息,以便我可以根据他们的位置自定义我的网页。有没有一种好的,可靠的方法在PHP中执行此操作?我将JavaScript用于客户端脚本,PHP用于服务器端脚本,MySQL用于数据库。

25 个答案:

答案 0 :(得分:225)

您可以下载免费的GeoIP数据库并在本地查找IP地址,也可以使用第三方服务并执行远程查找。这是一个更简单的选项,因为它不需要设置,但它确实引入了额外的延迟。

您可以使用的第三方服务是我的http://ipinfo.io。它们提供主机名,地理位置,网络所有者和其他信息,例如:

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

这是一个PHP示例:

$ip = $_SERVER['REMOTE_ADDR'];
$details = json_decode(file_get_contents("http://ipinfo.io/{$ip}/json"));
echo $details->city; // -> "Mountain View"

您也可以在客户端使用它。这是一个简单的jQuery示例:

$.get("https://ipinfo.io/json", function (response) {
    $("#ip").html("IP: " + response.ip);
    $("#address").html("Location: " + response.city + ", " + response.region);
    $("#details").html(JSON.stringify(response, null, 4));
}, "jsonp");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<h3>Client side IP geolocation using <a href="http://ipinfo.io">ipinfo.io</a></h3>

<hr/>
<div id="ip"></div>
<div id="address"></div>
<hr/>Full response: <pre id="details"></pre>

答案 1 :(得分:57)

以为我发帖是因为似乎没有人提供有关此特定API的信息,但它正好归还我所追求的内容,您可以让它以多种格式返回json, xml and csv

 $location = file_get_contents('http://freegeoip.net/json/'.$_SERVER['REMOTE_ADDR']);
 print_r($location);

这将为您提供您可能想要的所有内容:

{
      "ip": "77.99.179.98",
      "country_code": "GB",
      "country_name": "United Kingdom",
      "region_code": "H9",
      "region_name": "London, City of",
      "city": "London",
      "zipcode": "",
      "latitude": 51.5142,
      "longitude": -0.0931,
      "metro_code": "",
      "areacode": ""

}

答案 2 :(得分:15)

如果你谷歌搜索“geo-ip”,你需要使用外部服务......例如http://www.hostip.info/,你可以获得更多结果。

Host-IP API是基于HTTP的,因此您可以根据需要在PHP或JavaScript中使用它。

答案 3 :(得分:15)

使用Google APIS:

<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script>
contry_code = google.loader.ClientLocation.address.country_code
city = google.loader.ClientLocation.address.city
region = google.loader.ClientLocation.address.region
</script>

答案 4 :(得分:14)

我使用ipapi.co中的API编写了一个机器人,以下是1.2.3.4中如何获取IP地址(例如php)的位置:

设置标题:

$opts = array('http'=>array('method'=>"GET", 'header'=>"User-Agent: mybot.v0.7.1"));
$context = stream_context_create($opts);

获取JSON响应

echo file_get_contents('https://ipapi.co/1.2.3.4/json/', false, $context);

获取特定字段(国家,时区等)

echo file_get_contents('https://ipapi.co/1.2.3.4/country/', false, $context);

答案 5 :(得分:13)

使用https://geoip-db.com服务的纯Javascript示例它们提供了JSON和JSONP回调解决方案。

不需要jQuery!

<!DOCTYPE html>
<html>
<head>
<title>Geo City Locator by geoip-db.com</title>
</head>
<body>
    <div>Country: <span id="country"></span></div>
    <div>State: <span id="state"></span></div>
    <div>City: <span id="city"></span></div>
    <div>Postal: <span id="postal"></span></div>
    <div>Latitude: <span id="latitude"></span></div>
    <div>Longitude: <span id="longitude"></span></div>
    <div>IP address: <span id="ipv4"></span></div>                             
</body>
<script>

    var country = document.getElementById('country');
    var state = document.getElementById('state');
    var city = document.getElementById('city');
    var postal = document.getElementById('postal');
    var latitude = document.getElementById('latitude');
    var longitude = document.getElementById('longitude');
    var ip = document.getElementById('ipv4');

    function callback(data)
    {
        country.innerHTML = data.country_name;
        state.innerHTML = data.state;
        city.innerHTML = data.city;
        postal.innerHTML = data.postal;
        latitude.innerHTML = data.latitude;
        longitude.innerHTML = data.longitude;
        ip.innerHTML = data.IPv4;
    }

    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = 'https://geoip-db.com/json/geoip.php?jsonp=callback';
    var h = document.getElementsByTagName('script')[0];
    h.parentNode.insertBefore(script, h);

</script> 
</html>

答案 6 :(得分:8)

查看来自hostip.info的API - 它提供了大量信息 PHP中的示例:

$data = file_get_contents("http://api.hostip.info/country.php?ip=12.215.42.19");
//$data contains: "US"

$data = file_get_contents("http://api.hostip.info/?ip=12.215.42.19");
//$data contains: XML with country, lat, long, city, etc...

如果您信任hostip.info,它似乎是一个非常有用的API。

答案 7 :(得分:8)

这个问题受到保护,我理解。但是,我在这里看不到答案,我看到的是很多人通过提出同样的问题来展示他们想出的答案。

目前有五个地区互联网注册管理机构具有不同程度的功能,可作为知识产权所有权的第一联络点。这个过程是不断变化的,这就是为什么这里的各种服务有时会起作用而在其他时候却不起作用的原因。

究竟是什么(显然)是一种古老的TCP协议 - 它最初的工作方式是通过连接到端口43,这使得它通过租用连接,通过防火墙等等进行路由是有问题的。

此时 - 大多数Who是通过RESTful HTTP和ARIN完成的,RIPE和APNIC具有可用的RESTful服务。 LACNIC返回503,AfriNIC显然没有这样的API。 (但都有在线服务。)

那将会得到你 - 知识产权注册所有者的地址,但是 - 不是你客户的位置 - 你必须从他们那里得到它,而且 - 你必须要求它。此外,在验证您认为是创始人的IP时,代理是您最不担心的。

人们不理解他们被跟踪的想法,所以 - 我的想法是 - 直接从他们的客户那里得到它并得到他们的许可,并期望很多人对这个概念犹豫不决。

答案 8 :(得分:7)

我会做同样的答案here,因为该服务也适用于PHP:

  

我喜欢免费的GeoLite City   Maxmind适用于大多数人   应用程序,您可以从中   升级到付费版本,如果是的话   不够精确。包含PHP API以及其他内容   语言。如果你在跑   Lighttpd作为网络服务器,你甚至可以   使用module获取   SERVER变量中的信息   每个访客,如果这是你需要的。

     

我应该补充说还有一个免费的   Geolite Country(会是   如果你不需要精确定位,速度会更快   知识产权所在的城市)和Geolite   ASN(如果你想知道谁拥有   IP),最后所有这些都是   可以在自己的服务器上下载   每个月都更新,很漂亮   快速查找提供的API   因为他们说“成千上万的查找   每秒“。

答案 9 :(得分:6)

Ipdata.co是一种快速,高度可用的IP Geolocation API,性能可靠。

它具有极高的可扩展性,全球有10个端点,每个端点每秒能够处理> 10,000个请求!

  

这个答案使用的“测试”API密钥非常有限,仅用于测试几个调用。 Signup用于您自己的免费API密钥,每天最多可获得1500个请求以进行开发。

在php中

php > $ip = '8.8.8.8';
php > $details = json_decode(file_get_contents("https://api.ipdata.co/{$ip}?api-key=test"));
php > echo $details->region;
California
php > echo $details->city;
Mountain View
php > echo $details->country_name;
United States
php > echo $details->latitude;
37.751

这是一个客户端示例,展示了如何获得国家,地区和城市;

$.get("https://api.ipdata.co?api-key=test", function (response) {
	$("#response").html(JSON.stringify(response, null, 4));
  $("#country").html('Country: ' + response.country_name);
  $("#region").html('Region ' + response.region);
  $("#city").html('City' + response.city);  
}, "jsonp");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="country"></div>
<div id="region"></div>
<div id="city"></div>
<pre id="response"></pre>

<强>声明;

我建立了这项服务。

有关多种语言的示例,请参阅Docs

另见this最佳IP地理位置API的详细分析。

答案 10 :(得分:6)

Ben Dowling的回应中的服务发生了变化,现在变得更加简单了。要查找位置,只需执行以下操作:

// no need to pass ip any longer; ipinfo grabs the ip of the person requesting
$details = json_decode(file_get_contents("http://ipinfo.io/"));
echo $details->city; // city

坐标返回单个字符串,如'31,-80',所以从那里你只需:

$coordinates = explode(",", $details->loc); // -> '31,-89' becomes'31','-80'
echo $coordinates[0]; // latitude
echo $coordinates[1]; // longitude

答案 11 :(得分:6)

PHP有一个extension for that.

来自PHP.net:

  

GeoIP扩展程序允许您查找IP地址的位置。   城市,州,国家,经度,纬度等信息   所有,如ISP和连接类型都可以借助于获得   GeoIP的。

例如:

$record = geoip_record_by_name($ip);
echo $record['city'];

答案 12 :(得分:6)

假设您想自己完成并且不依赖于其他提供者,IP2Nation提供了映射的MySQL数据库,这些映射在区域注册管理机构改变时会更新。

答案 13 :(得分:5)

我在IPLocate.io运行该服务,您可以通过一个简单的电话免费登录:

''
'dd'
'ddoo'
'ddoogg'

<?php $res = file_get_contents('https://www.iplocate.io/api/lookup/8.8.8.8'); $res = json_decode($res); echo $res->country; // United States echo $res->continent; // North America echo $res->latitude; // 37.751 echo $res->longitude; // -97.822 var_dump($res); 对象将包含您的地理位置字段,例如$rescountry等。

查看docs了解详情。

答案 14 :(得分:5)

如果有人偶然发现这个帖子,这是另一个解决方案。在timezoneapi.io,您可以请求IP地址并获得多个对象(我已经创建了服务)。它的创建是因为我需要知道我的用户所在的时区,世界的哪个位置以及目前的时间。

在PHP中 - 返回位置,时区和日期/时间:

void ChangeArray(int a[],int asize)
{
int x,y;
do{
    cout<<"Enter X: ";
    cin>>x;
    cout<<endl;
}while(x<0 || x>=asize-1);

do{
    cout<<"Enter Y: ";
    cin>>y; 
    cout<<endl;
}while(y<0 || y>asize-1 || y<=x);

changeNelements(a,x,y);
}

void changeNelements(int *x,int n,int m)
{
for(int i=n+1;i<m;i++)
    *(x+i)+=(m-n);
}

使用jQuery:

// Get IP address
$ip_address = getenv('HTTP_CLIENT_IP') ?: getenv('HTTP_X_FORWARDED_FOR') ?: getenv('HTTP_X_FORWARDED') ?: getenv('HTTP_FORWARDED_FOR') ?: getenv('HTTP_FORWARDED') ?: getenv('REMOTE_ADDR');

// Get JSON object
$jsondata = file_get_contents("http://timezoneapi.io/api/ip/?" . $ip_address);

// Decode
$data = json_decode($jsondata, true);

// Request OK?
if($data['meta']['code'] == '200'){

    // Example: Get the city parameter
    echo "City: " . $data['data']['city'] . "<br>";

    // Example: Get the users time
    echo "Time: " . $data['data']['datetime']['date_time_txt'] . "<br>";

}

答案 15 :(得分:4)

以下是我发现使用http://ipinfodb.com/ip_locator.php获取其信息的代码段的修改版本。请注意,您也可以随身携带API密钥,并直接使用API​​获取您认为合适的信息。

function detect_location($ip=NULL, $asArray=FALSE) {
    if (empty($ip)) {
        if (!empty($_SERVER['HTTP_CLIENT_IP'])) { $ip = $_SERVER['HTTP_CLIENT_IP']; }
        elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; }
        else { $ip = $_SERVER['REMOTE_ADDR']; }
    }
    elseif (!is_string($ip) || strlen($ip) < 1 || $ip == '127.0.0.1' || $ip == 'localhost') {
        $ip = '8.8.8.8';
    }

    $url = 'http://ipinfodb.com/ip_locator.php?ip=' . urlencode($ip);
    $i = 0; $content; $curl_info;

    while (empty($content) && $i < 5) {
        $ch = curl_init();
        $curl_opt = array(
            CURLOPT_FOLLOWLOCATION => 1,
            CURLOPT_HEADER => 0,
            CURLOPT_RETURNTRANSFER  => 1,
            CURLOPT_URL => $url,
            CURLOPT_TIMEOUT => 1,
            CURLOPT_REFERER => 'http://' . $_SERVER['HTTP_HOST'],
        );
        if (isset($_SERVER['HTTP_USER_AGENT'])) $curl_opt[CURLOPT_USERAGENT] = $_SERVER['HTTP_USER_AGENT'];
        curl_setopt_array($ch, $curl_opt);
        $content = curl_exec($ch);
        if (!is_null($curl_info)) $curl_info = curl_getinfo($ch);
        curl_close($ch);
    }

    $araResp = array();
    if (preg_match('{<li>City : ([^<]*)</li>}i', $content, $regs)) $araResp['city'] = trim($regs[1]);
    if (preg_match('{<li>State/Province : ([^<]*)</li>}i', $content, $regs)) $araResp['state'] = trim($regs[1]);
    if (preg_match('{<li>Country : ([^<]*)}i', $content, $regs)) $araResp['country'] = trim($regs[1]);
    if (preg_match('{<li>Zip or postal code : ([^<]*)</li>}i', $content, $regs)) $araResp['zip'] = trim($regs[1]);
    if (preg_match('{<li>Latitude : ([^<]*)</li>}i', $content, $regs)) $araResp['latitude'] = trim($regs[1]);
    if (preg_match('{<li>Longitude : ([^<]*)</li>}i', $content, $regs)) $araResp['longitude'] = trim($regs[1]);
    if (preg_match('{<li>Timezone : ([^<]*)</li>}i', $content, $regs)) $araResp['timezone'] = trim($regs[1]);
    if (preg_match('{<li>Hostname : ([^<]*)</li>}i', $content, $regs)) $araResp['hostname'] = trim($regs[1]);

    $strResp = ($araResp['city'] != '' && $araResp['state'] != '') ? ($araResp['city'] . ', ' . $araResp['state']) : 'UNKNOWN';

    return $asArray ? $araResp : $strResp;
}

使用

detect_location();
//  returns "CITY, STATE" based on user IP

detect_location('xxx.xxx.xxx.xxx');
//  returns "CITY, STATE" based on IP you provide

detect_location(NULL, TRUE);    //   based on user IP
//  returns array(8) { ["city"] => "CITY", ["state"] => "STATE", ["country"] => "US", ["zip"] => "xxxxx", ["latitude"] => "xx.xxxxxx", ["longitude"] => "-xx.xxxxxx", ["timezone"] => "-07:00", ["hostname"] => "xx-xx-xx-xx.host.name.net" }

detect_location('xxx.xxx.xxx.xxx', TRUE);   //   based on IP you provide
//  returns array(8) { ["city"] => "CITY", ["state"] => "STATE", ["country"] => "US", ["zip"] => "xxxxx", ["latitude"] => "xx.xxxxxx", ["longitude"] => "-xx.xxxxxx", ["timezone"] => "-07:00", ["hostname"] => "xx-xx-xx-xx.host.name.net" }

答案 16 :(得分:4)

如果您需要从IP地址获取位置,您可以使用可靠的地理IP服务,您可以获得更多详细信息here。它支持IPv6。

作为奖励,它允许检查IP地址是否为tor节点,公共代理或垃圾邮件发送者。

您可以使用以下javascript或php。

Javascript代码:

$(document).ready(function () {
        $('#btnGetIpDetail').click(function () {
            if ($('#txtIP').val() == '') {
                alert('IP address is reqired');
                return false;
            }
            $.getJSON("http://ip-api.io/json/" + $('#txtIP').val(),
                 function (result) {
                     alert('City Name: ' + result.city)
                     console.log(result);
                 });
        });
    });

Php代码:

$result = json_decode(file_get_contents('http://ip-api.io/json/64.30.228.118'));
var_dump($result);

输出:

{
"ip": "64.30.228.118",
"country_code": "US",
"country_name": "United States",
"region_code": "FL",
"region_name": "Florida",
"city": "Fort Lauderdale",
"zip_code": "33309",
"time_zone": "America/New_York",
"latitude": 26.1882,
"longitude": -80.1711,
"metro_code": 528,
"suspicious_factors": {
"is_proxy": false,
"is_tor_node": false,
"is_spam": false,
"is_suspicious": false
}

答案 17 :(得分:3)

我创建了a wrapper for ipinfo.io。您可以使用composer安装它。

您可以这样使用它:

$ipInfo = new DavidePastore\Ipinfo\Ipinfo();

//Get all the properties
$host = $ipInfo->getFullIpDetails("8.8.8.8");

//Read all the properties
$city = $host->getCity();
$country = $host->getCountry();
$hostname = $host->getHostname();
$ip = $host->getIp();
$loc = $host->getLoc();
$org = $host->getOrg();
$phone = $host->getPhone();
$region = $host->getRegion();

答案 18 :(得分:2)

我已经使用IP地址服务进行了大量测试,这里有一些我自己做的方法。 首先关闭我使用的有用网站的链接:

https://db-ip.com/db 有一个免费的IP查找服务,并有一些免费的csv文件,你可以 下载。这使用附加到您的电子邮件的免费API密钥。它限制为每天2000次查询。

http://ipinfo.io/ 没有api-key的免费ip-lookup服务 PHP函数:

//uses http://ipinfo.io/.
function ip_visitor_country($ip){
    $ip_data_in = get_web_page("http://ipinfo.io/".$ip."/json"); //add the ip to the url and retrieve the json data
    $ip_data = json_decode($ip_data_in['content'],true); //json_decode it for php use

    //this ip-lookup service returns 404 if the ip is invalid/not found so return false if this is the case.
    if(empty($ip_data) || $ip_data_in['httpcode'] == 404){
        return false;
    }else{
        return $ip_data; 
    }
}

function get_web_page($url){
    $user_agent = 'Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20100101 Firefox/8.0';

    $options = array(
        CURLOPT_CUSTOMREQUEST  =>"GET",        //set request type post or get
        CURLOPT_POST           =>false,        //set to GET
        CURLOPT_USERAGENT      => $user_agent, //set user agent
        CURLOPT_RETURNTRANSFER => true,     // return web page
        CURLOPT_HEADER         => false,    // don't return headers
        CURLOPT_FOLLOWLOCATION => true,     // follow redirects
        CURLOPT_ENCODING       => "",       // handle all encodings
        CURLOPT_AUTOREFERER    => true,     // set referer on redirect
        CURLOPT_CONNECTTIMEOUT => 120,      // timeout on connect
        CURLOPT_TIMEOUT        => 120,      // timeout on response
        CURLOPT_MAXREDIRS      => 10,       // stop after 10 redirects
    );
    $ch = curl_init( $url );
    curl_setopt_array( $ch, $options );
    $content = curl_exec( $ch );
    $err     = curl_errno( $ch );
    $errmsg  = curl_error( $ch );
    $header  = curl_getinfo( $ch );
    $httpCode = curl_getinfo( $ch, CURLINFO_HTTP_CODE );
    curl_close( $ch );  
    $header['errno']   = $err; //curl error code
    $header['errmsg']  = $errmsg; //curl error message
    $header['content'] = $content; //the webpage result (In this case the ip data in json array form)
    $header['httpcode'] = $httpCode; //the webpage response code
    return $header; //return the collected data and response codes
}

最后你得到这样的东西:

Array
(
    [ip] => 1.1.1.1
    [hostname] => No Hostname
    [city] => 
    [country] => AU
    [loc] => -27.0000,133.0000
    [org] => AS15169 Google Inc.
)

http://www.geoplugin.com/ 稍微过时但这项服务会为您提供一些额外的有用信息,例如国外货币,大陆代码,经度等等。

http://lite.ip2location.com/database-ip-country-region-city-latitude-longitude 提供一系列可下载文件,其中包含将其导入数据库的说明。 在数据库中关闭这些文件之后,您可以非常轻松地选择数据。

SELECT * FROM `ip2location_db5` WHERE IP > ip_from AND IP < ip_to

使用php函数ip2long();将ip-address转换为数值。例如,1.1.1.1变为16843009.这使您可以扫描数据库文件提供给您的IP范围。

因此,为了找出1.1.1.1所属的所有内容,我们运行此查询:

SELECT * FROM `ip2location_db5` WHERE 16843009 > ip_from AND 16843009 < ip_to;

这将返回此数据作为示例。

FROM: 16843008
TO: 16843263
Country code: AU
Country: Australia
Region: Queensland
City: Brisbane
Latitude: -27.46794
Longitude: 153.02809

答案 19 :(得分:2)

您还可以使用“smart-ip”服务:

$.getJSON("http://smart-ip.net/geoip-json?callback=?",
    function (data) {
        alert(data.countryName);
        alert(data.city);
    }
);

答案 20 :(得分:0)

好的,伙计们,谢谢你们的建议; 虽然我有6k +的IP,但由于某些限制,某些服务将无法满足我的要求; 因此,您可以在后备模式下使用它们;

如果我们的源文件格式如下:

user_id_1  ip_1
user_id_2  ip_2
user_id_3  ip_1

比Yii:

使用这个简单的expample命令(PoC)
class GeoIPCommand extends CConsoleCommand
{

public function actionIndex($filename = null)
{
    //http://freegeoip.net/json/{$ip} //10k requests per hour
    //http://ipinfo.io/{$ip}/json //1k per day
    //http://ip-api.com/json/{$ip}?fields=country,city,regionName,status //150 per minute

    echo "start".PHP_EOL;

    $handle      = fopen($filename, "r");
    $destination = './good_locations.txt';
    $bad         = './failed_locations.txt';
    $badIP       = [];
    $goodIP      = [];

    $destHandle = fopen($destination, 'a+');
    $badHandle  = fopen($bad, 'a+');

    if ($handle)
    {
        while (($line = fgets($handle)) !== false)
        {
            $result = preg_match('#(\d+)\s+(\d+\.\d+\.\d+\.\d+)#', $line, $id_ip);
            if(!$result) continue;

            $id = $id_ip[1];
            $ip = $id_ip[2];
            $ok = false;

            if(isset($badIP[$ip])) 
            {
                fputs($badHandle, sprintf('%u %s'. PHP_EOL, $id, $ip));
                continue;
            }

            if(isset($goodIP[$ip]))
            {
                fputs($destHandle, sprintf('"id":"%u","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, $goodIP[$ip]));
                echo sprintf('"id":"%s","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, $goodIP[$ip]);
                continue;
            }

            $query = @json_decode(file_get_contents('http://freegeoip.net/json/'.$ip));
            $city = property_exists($query, 'region_name')? $query->region_name : '';
            $city .= property_exists($query, 'city') && $query->city && ($query->city != $city) ? ', ' . $query->city : '';

            if($city)
            {
                fputs($destHandle, sprintf('"id":"%u","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, $city));
                echo sprintf('"id":"%s","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, $city);
                $ok = true;
            }

            if(!$ok)
            {
                $query = @json_decode(file_get_contents('http://ip-api.com/json/'. $ip.'?fields=country,city,regionName,status'));
                if($query && $query->status == 'success')
                {
                    $city = property_exists($query, 'regionName')? $query->regionName : '';
                    $city .= property_exists($query, 'city') && $query->city ? ',' . $query->city : '';

                    if($city)
                    {
                        fputs($destHandle, sprintf('"id":"%u","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, $city));
                        echo sprintf('"id":"%s","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, $city);
                        $ok = true;
                    }
                }
            }

            if(!$ok)
            {
                $badIP[$ip] = false;
                fputs($badHandle, sprintf('%u %s'. PHP_EOL, $id, $ip));
                echo sprintf('"id":"%s","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, 'Unknown');
            }

            if($ok)
            {
                $goodIP[$ip] = $city;
            }
        }

        fclose($handle);
        fclose($badHandle);
        fclose($destHandle);
    }else{
        echo 'Can\'t open file' . PHP_EOL; 
        return;
    }

    return;
}

}

这是一种糟糕的代码,但它有效。 用法:

./yiic geoip index --filename="./source_id_ip_list.txt"

随意使用,修改,并做得更好)

答案 21 :(得分:0)

如果您正在搜索更新/准确的数据库,我建议使用此here,因为它显示的是我在测试时未包含在许多其他服务中的确切位置。
(我的城市是Rasht,我的国家/地区Iran使用此IP地址:2.187.21.235,当我进行测试时。)

我建议使用数据库而不是API方法,因为它将在本地处理得更快。

答案 22 :(得分:0)

几个月前我写了这篇文章,可能对你有所帮助。本文介绍了ip 2 country的开源数据库的用法,并描述了我为了使开源数据库工作而编写的php类。这是链接
    http://www.samundra.com.np/find-visitors-country-using-his-ip-address/1018

如果您需要任何帮助,请在网站上发表评论。

希望它对你有所帮助。

答案 23 :(得分:0)

执行IP地理定位有2种广泛的方法:一种是下载数据集,将其托管在您的基础架构上,并保持其最新。这需要时间和精力,尤其是在您需要支持大量请求的情况下。另一个解决方案是使用现有的API服务,该服务为您以及更多人管理所有工作。

存在许多API地理位置服务:Maxmind,Ip2location,Ipstack,IpInfo等。最近,我工作的公司已转换为 Ipregistry https://ipregistry.co),并且我参与了决策和实施过程。寻找IP地理位置API时,应考虑以下要素:

  • 服务是否准确?他们使用的是单一信息来源吗?
  • 他们真的可以应付您的负担吗?
  • 它们是否在全球范围内提供一致且快速的响应时间(除非您的用户是特定国家/地区的)?
  • 他们的定价模式是什么?

以下是获取IP地理位置信息的示例(还可以使用一个呼叫获取威胁和用户代理数据):

$ip = $_SERVER['REMOTE_ADDR'];
$details = json_decode(file_get_contents("https://api.ipregistry.co/{$ip}?key=tryout"));
echo $details->location;

注意:我不是来宣传Ipregistry,而是说这是最好的,但是我花了很长时间分析现有解决方案,他们的解决方案确实很有希望。

答案 24 :(得分:-2)

旧帖子,但我仍然尝试了此处建议的几乎所有服务,而我用于生产的最准确,最快捷的服务是:https://ip2location-api.com

他们有服务器和客户端解决方案,JSON / XML / CSV / PHP格式,json ajax或javascript函数回调,请查看documentation here

{"as":"AS15169 Google LLC","city":"Newark","country":"United States","countryCode":"US","isp":"Google Cloud","lat":40.7357,"lon":-74.1724,"org":"Google Cloud","query":"35.188.125.133","region":"NJ","regionName":"New Jersey","status":"success","timezone":"America/New_York","zip":"07175"}