我想从他们的IP地址检索访问者的城市,州和国家等信息,以便我可以根据他们的位置自定义我的网页.有没有一种好的,可靠的方法在PHP中执行此操作?我使用JavaScript进行客户端脚本编写,使用PHP进行服务器端脚本编写,使用MySQL进行数据库访问.
您可以下载免费的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");
Client side IP geolocation using ipinfo.io
Full response:
以为我发布的内容似乎没有人给出关于这个特定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": "" }
您需要使用外部服务...例如http://www.hostip.info/如果您搜索"geo-ip",您可以获得更多结果.
Host-IP API是基于HTTP的,因此您可以根据需要在PHP或JavaScript中使用它.
使用Google APIS:
我使用ipapi.co中的API编写了一个机器人,以下是如何获取IP地址的位置(例如1.2.3.4
)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);
一个纯Javascript示例,使用https://geoip-db.com的服务它们提供了JSON和JSONP回调解决方案.
JSON:https://geoip-db.com/json
JSONP回调:https://geoip-db.com/jsonp
不需要jQuery!
Geo City Locator by geolocation-db.com Country:State:City:Postal:Latitude:Longitude:IP address:
这个问题受到保护,我理解.但是,我没有在这里看到答案,我看到的是很多人通过提出同样的问题来展示他们想出的结果.
目前有五个区域互联网注册管理机构具有不同程度的功能,可作为知识产权所有权的第一联络点.这个过程是不断变化的,这就是为什么这里的各种服务有时会起作用而在其他时候不起作用的原因.
但是(显然)是一个古老的TCP协议 - 它最初工作的方式是通过连接到端口43,这使得它通过租用连接,通过防火墙等进行路由成为问题.
此时 - 大多数Who是通过RESTful HTTP和ARIN完成的,RIPE和APNIC具有可用的RESTful服务.LACNIC返回503,AfriNIC显然没有这样的API.(但都有在线服务.)
这将得到你 - 知识产权注册所有者的地址,但是 - 不是你客户的位置 - 你必须从他们那里得到它,而且 - 你必须要求它.此外,在验证您认为是创建者的IP时,代理是您最不担心的.
人们并不欣赏他们被追踪的想法,所以 - 我的想法是 - 直接从他们的客户那里得到它并得到他们的许可,并期望很多人对这个概念犹豫不决.
查看来自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.
假设你想自己做而不依赖其他提供者,IP2Nation提供了一个映射的MySQL数据库,这些映射在区域注册管理机构改变时会更新.
我将在这里做出相同的答案,因为该服务也适用于PHP:
我喜欢Maxmind的免费GeoLite City,适用于大多数应用程序,如果它不够精确,你可以从中升级到付费版本.有一个PHP API包括在内,以及其他语言.如果您将Lighttpd作为Web服务器运行,您甚至可以使用模块为每个访问者获取SERVER变量中的信息(如果这是您需要的).
我应该补充的是,还有一个免费的 Geolite Country(如果你不需要确定IP来自哪个城市会更快)和Geolite ASN(如果你想知道谁拥有IP),最后所有这些都是可以在您自己的服务器上下载,每月更新一次,并且使用提供的API快速查找,因为它们表示"每秒数千次查找".
PHP有一个扩展.
来自PHP.net:
GeoIP扩展允许您查找IP地址的位置.可以在GeoIP的帮助下获得城市,州,国家,经度,纬度等所有信息,例如ISP和连接类型.
例如:
$record = geoip_record_by_name($ip); echo $record['city'];
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
Ipdata.co是一种快速,高度可用的IP Geolocation API,具有可靠的性能.
它具有极高的可扩展性,全球有10个端点,每个端点每秒可处理> 10,000个请求!
这个答案使用的"测试"API密钥非常有限,仅用于测试几个调用.注册您自己的免费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");
万一有人偶然发现这个帖子,这是另一个解决方案.在timezoneapi.io,您可以请求IP地址并获得多个对象作为回报(我已经创建了服务).它的创建是因为我需要知道我的用户所在的时区,世界的哪个时间以及目前的时间.
在PHP中 - 返回位置,时区和日期/时间:
// 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'] . "
"; // Example: Get the users time echo "Time: " . $data['data']['datetime']['date_time_txt'] . "
"; }
使用jQuery:
// Get JSON object $.getJSON('https://timezoneapi.io/api/ip', function(data){ // Request OK? if(data.meta.code == '200'){ // Log console.log(data); // Example: Get the city parameter var city = data.data.city; alert(city); // Example: Get the users time var time = data.data.datetime.date_time_txt; alert(time); } });
我在IPLocate.io上运行该服务,你可以通过一个简单的电话免费挂钩:
country; // United States echo $res->continent; // North America echo $res->latitude; // 37.751 echo $res->longitude; // -97.822 var_dump($res);
该$res
对象将包含像你的地理位置字段country
,city
等等.
查看文档以获取更多信息.