如何使用IP地址和国家代码获得地理定位
地理定位提供了关于用户地理位置的信息。具体来说,IP地址被地理定位服务用来确定位置。
在本教程中,你将学习如何使用一个IP地址和一个国家名称及代码来获得地理位置。这是一个两步的过程,第一步是获取IP地址,第二步是获取地理位置。
前提条件
- PHP的基础知识。
- 文本编辑器 - VScode。
目标
完成本教程后,你应该能够做到以下几点。
- 获取当前的IP地址。
- 使用PHP cURL API获取区域。
- 知道获取地理位置的不同用途
- 如何启用/禁用Geolocation API。
关于这个例子
本例使用IPWhoIs地理定位API工具,通过使用IP地址查询位置数据。该API端点寻找任何IPV4、IPv6或任何域作为参数,同时读取地理位置请求。
这段代码执行了一个两步流程来输出位置数据。它创建了一个带有函数的PHP服务,从$_SERVER
阵列中获取用户的IP地址。然后,它将使用IP地址来设置cURL选项来读取地理位置数据。这将通过解析API的JSON响应来输出国家名称、代码和给定的IP。
文件结构
下面的文件结构图显示了这个例子的简单性,文件的数量最少。Request.php
文件有主要的函数,执行两个步骤以获得IP和地理位置数据。index.php
文件调用服务来获取位置数据并将其填充到用户界面中。
###第1步:获取并验证当前的IP地址
这是主页代码,包含HTML代码,以确认用户的当前地理位置数据。它导入位置服务类,调用方法来获取和验证IP地址。一旦IP被验证并返回真,它就会请求地理定位数据。否则,它将在用户界面上显示错误信息。
- index.php
<?php
require_once 'lib/Request.php';
$requestModel = new Request();
$ip = $requestModel->getIpAddress();
$isValidIpAddress = $requestModel->isValidIpAddress($ip);
?>
<HTML>
<HEAD>
<TITLE>Get Geo Location by the IP address</TITLE>
<link href="assets/css/style.css" type="text/css" rel="stylesheet" />
</HEAD>
<BODY>
<div class="txt-heading">Get Geo Location by the IP address</div>
<?php
if ($isValidIpAddress == "") {
echo "<div class='error'>Invalid IP address $ip</div>";
} else {
$geoLocationData = $requestModel->getLocation($ip);
print "<PRE>";
print_r($geoLocationData);
?>
<div id="location">
<div class="geo-location-detail">
<div class="row">
<div class="form-label">
Country Name: <?php echo $geoLocationData['country'];?>
</div>
</div>
<div class="row">
<div class="form-label">
Country Code: <?php echo $geoLocationData['country_code'];?>
</div>
</div>
<div class="row">
<div class="form-label">
Ip Address: <?php echo $geoLocationData['ip'];?>
</div>
</div>
</div>
</div>
<?php }?>
</BODY>
</HTML>
第2步:准备API请求,通过PHP cURL获得地理位置信息
getIPAddress()
函数建立了一个if-else-if梯子的大部分方案,使用$_SERVER
变量获得非空的IP地址。一旦IP被验证并返回真,getLocation()
函数就会通过cURL请求ipwhois API。该API将返回一个JSON响应作为结果。这个例子对JSON响应进行解码,解析地理位置数据,从中获得国家的详细信息。
- Request.php
<?php
class Request
{
public function getIpAddress()
{
$ipAddress = '';
if (! empty($_SERVER['HTTP_CLIENT_IP']) && $this->isValidIpAddress($_SERVER['HTTP_CLIENT_IP'])) {
// check for shared ISP IP
$ipAddress = $_SERVER['HTTP_CLIENT_IP'];
} else if (! empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
// check for IPs passing through proxy servers
// check if multiple IP addresses are set and take the first one
$ipAddressList = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
foreach ($ipAddressList as $ip) {
if ($this->isValidIpAddress($ip)) {
$ipAddress = $ip;
break;
}
}
} else if (! empty($_SERVER['HTTP_X_FORWARDED']) && $this->isValidIpAddress($_SERVER['HTTP_X_FORWARDED'])) {
$ipAddress = $_SERVER['HTTP_X_FORWARDED'];
} else if (! empty($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']) && $this->isValidIpAddress($_SERVER['HTTP_X_CLUSTER_CLIENT_IP'])) {
$ipAddress = $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'];
} else if (! empty($_SERVER['HTTP_FORWARDED_FOR']) && $this->isValidIpAddress($_SERVER['HTTP_FORWARDED_FOR'])) {
$ipAddress = $_SERVER['HTTP_FORWARDED_FOR'];
} else if (! empty($_SERVER['HTTP_FORWARDED']) && $this->isValidIpAddress($_SERVER['HTTP_FORWARDED'])) {
$ipAddress = $_SERVER['HTTP_FORWARDED'];
} else if (! empty($_SERVER['REMOTE_ADDR']) && $this->isValidIpAddress($_SERVER['REMOTE_ADDR'])) {
$ipAddress = $_SERVER['REMOTE_ADDR'];
}
return $ipAddress;
}
public function isValidIpAddress($ip)
{
if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) === false) {
return false;
}
return true;
}
public function getLocation($ip)
{
$ch = curl_init('http://ipwhois.app/json/' . $ip);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$json = curl_exec($ch);
curl_close($ch);
// Decode JSON response
$ipWhoIsResponse = json_decode($json, true);
// Country code output, field "country_code"
return $ipWhoIsResponse;
}
}
响应API调用的国家地理定位
下面的图片显示了带有国家名称和代码的位置数据。
如果IP地址不是一个有效的地址,那么代码将返回错误信息以确认用户。
替代的地理定位API
这些是一些提供服务的替代API,以程序化方式访问位置数据。
- GeoPlugin服务允许从PHP、ASP、JavaScript等访问。
- IPinfo库可以通过基于令牌的认证获得位置。
- PHP支持整合PECL扩展的GeoIP2包,通过使用预定义的函数来获取位置数据。从IP地址或域名获取国家名称的代码是。
geoip_country_name_by_name ( $hostname );
获取地理位置的不同用途
为了通过IP地址获得用户的地理位置,有很多用途。
- 它提供了位置数据的准确性和可靠性,而用户可能输入错误的数据。
- 它提供了一个单一的入口点来获取数据,这些数据将在许多地方使用,如基于位置的货币转换器,运输计算或更多。
- 计算基于区域的访问统计。
- 它有助于通过对访问者进行本地化来切换多语言网站内容的语言。
- 在用户界面的地图层上绘制用户的位置。谷歌地图的JavaScript API提供地理定位服务,在地图上显示用户和设备的位置。
总结
在整个文章中,你已经了解了如何获得你的网站的地理位置数据。此外,在这种情况下,地理定位数据可能会被用于几个原因,这可能包括。
- 个人化和限制对网站某些部分的访问。
- 基于地形的访问和交付的限制。
- 避免不诚实的行为。
- 掌握整个公司的信息流动情况。