使用PHP从IP地址获取城市/州

4

我正在为客户项目工作,他需要通过用户的IP地址获取其所在的城市/州。

1)他已经购买了maxmind GeoIP2 Precision,但不知道如何在php中实现代码。文档中说一些指令要下载composer.exe,当我下载时,它要求我下载php.exe,然后下载php.exe后,我尝试安装composer.exe,然后它尝试安装composer.phar并给了我这个错误:

"你的计算机上的一些设置使Composer无法正常工作。确保你解决以下列出的问题,并再次运行此脚本:

缺少openssl扩展,这意味着无法进行安全的HTTPS传输。如果可能,您应该启用它或重新编译带有--with-openssl的php"

请建议我使用最简单的方法使用PHP从IP地址获取城市/州。

谢谢


1
使用php5和php5-geoip在Linux环境下。如果您有Linux服务器,您可以在短时间内解决此任务。 - Alex Kashin
是的,它托管在Linux服务器上,请进一步建议我需要做什么。 - Aman
你使用哪个Linux操作系统?Ubuntu?CentOS?RedHat?Debian? - Alex Kashin
如果您正在运行Unix系统,您需要使用httpd作为Web服务器,并安装php插件。上述提到的.exe文件仅适用于Windows系统。 - Matt Clark
4个回答

18

这个API将获取您的位置详细信息。尝试一下

    <?php
    $ip = '168.192.0.1'; // your ip address here
    $query = @unserialize(file_get_contents('http://ip-api.com/php/'.$ip));
    if($query && $query['status'] == 'success')
    {
        echo 'Your City is ' . $query['city'];
        echo '<br />';
        echo 'Your State is ' . $query['region'];
        echo '<br />';
        echo 'Your Zipcode is ' . $query['zip'];
        echo '<br />';
        echo 'Your Coordinates are ' . $query['lat'] . ', ' . $query['lon'];
    }
    ?>

以下是您可以使用的输出。 使用键调用它们。

    <?php
    array (
      'status' => 'success',
      'country' => 'COUNTRY',
      'countryCode' => 'COUNTRY CODE',
      'region' => 'REGION CODE',
      'regionName' => 'REGION NAME',
      'city' => 'CITY',
      'zip' => 'ZIP CODE',
      'lat' => 'LATITUDE',
      'lon' => 'LONGITUDE',
      'timezone' => 'TIME ZONE',
      'isp' => 'ISP NAME',
      'org' => 'ORGANIZATION NAME',
      'as' => 'AS NUMBER / NAME',
      'query' => 'IP ADDRESS USED FOR QUERY',
    );
    ?>

这种方法在移动端可能不太可靠。如果你正在使用移动设备,可以尝试使用以下 JavaScript 代码。

    <script>
    var x = document.getElementById("demo");
    function getLocation() {
        if (navigator.geolocation) {
            navigator.geolocation.getCurrentPosition(showPosition);
        } else {
            x.innerHTML = "Geolocation is not supported by this browser.";
        }
    }
    function showPosition(position) {
        x.innerHTML = "Latitude: " + position.coords.latitude + 
        "<br>Longitude: " + position.coords.longitude; 
    }
    </script>

这将使用设备内置的GPS并获取坐标。然后,您可以与包含坐标的数据库进行交叉引用(这是一个选项,也是我所做的)。

如果您选择在移动设备上执行此操作,可以在线查找城市纬度和经度数据库。


哇,你太棒了,谢谢!它真的有效,那么它会在全世界所有城市都有效吗? - Aman
哦,真的吗,我会保存这段代码以备将来使用。你能告诉我这个代码在移动端上也可以用吗? - Aman
嗨,亚当,我的一个朋友刚刚查了一下他所在的城市是阿克伦,我的州是俄亥俄州,我住在美国。但是ip-api给出的位置是罗穆卢斯,这是不正确的吗?请给予建议。 - Aman
我相信这取决于你的ISP。我通常不会遇到问题。但是IP地址->城市并不总是准确的。让你的朋友尝试一下,看看它是否仍然给他罗穆卢斯。 http://www.infosniper.net/此外,再次使用JavaScript检查前端方法。 http://html5demos.com/geo您可以单击“查看源代码”以查看其操作方式。 - Adam Joseph Looze
我忘了提到,Petoskey是我的正确位置。 - Adam Joseph Looze
显示剩余8条评论

5

JSON也可以用来替代Serialized PHP endpoint,因为后者已经废弃。

废弃了 使用JSON。几乎所有的PHP网站现在都支持json_decode()函数,并且比unserialize()更快。

function get_ip_detail($ip){
   $ip_response = file_get_contents('http://ip-api.com/json/'.$ip);
   $ip_array=json_decode($ip_response);
   return  $ip_array;
 }

 $user_ip=$_SERVER['REMOTE_ADDR'];
 $ip_array= get_ip_detail($user_ip);
 echo $country_name=$ip_array->country; 
 echo $city=$ip_array->city;

2

0

使用任何API服务来获取IP地址的城市和州信息都更容易。例如,要使用IP2Location.io获取IP地址的城市名称和州名称,

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.ip2location.io/?' . http_build_query([
    'ip'      => '8.8.8.8',
    'key'     => 'YOUR_API_KEY',
    'format'  => 'json',
    'lang'    => 'en',
]));
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
$response = curl_exec($ch);
$response_array = json_decode($response, true);
echo 'City Name: ' . $response_array["city_name"];
echo 'State Name: ' . $response_array["region_name"];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接