192 php ip geolocation geoip
我想从他们的IP地址检索访问者的城市,州和国家等信息,以便我可以根据他们的位置自定义我的网页.有没有一种好的,可靠的方法在PHP中执行此操作?我使用JavaScript进行客户端脚本编写,使用PHP进行服务器端脚本编写,使用MySQL进行数据库访问.
Ben*_*ing 238
您可以下载免费的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
}
Run Code Online (Sandbox Code Playgroud)
这是一个PHP示例:
$ip = $_SERVER['REMOTE_ADDR'];
$details = json_decode(file_get_contents("http://ipinfo.io/{$ip}/json"));
echo $details->city; // -> "Mountain View"
Run Code Online (Sandbox Code Playgroud)
您也可以在客户端使用它.这是一个简单的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");
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)
Jam*_*ber 57
以为我发布的内容似乎没有人给出关于这个特定API的信息,但它正好归还了我所追求的,你可以让它以多种格式返回,json, xml and csv
.
$location = file_get_contents('http://freegeoip.net/json/'.$_SERVER['REMOTE_ADDR']);
print_r($location);
Run Code Online (Sandbox Code Playgroud)
这将为您提供您可能想要的所有东西:
{
"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": ""
}
Run Code Online (Sandbox Code Playgroud)
nul*_*ull 15
您需要使用外部服务...例如http://www.hostip.info/如果您搜索"geo-ip",您可以获得更多结果.
Host-IP API是基于HTTP的,因此您可以根据需要在PHP或JavaScript中使用它.
小智 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>
Run Code Online (Sandbox Code Playgroud)
Jai*_*mes 14
我使用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);
Run Code Online (Sandbox Code Playgroud)
获取JSON响应
echo file_get_contents('https://ipapi.co/1.2.3.4/json/', false, $context);
Run Code Online (Sandbox Code Playgroud)
得到一个特定的领域(国家,时区等)
echo file_get_contents('https://ipapi.co/1.2.3.4/country/', false, $context);
Run Code Online (Sandbox Code Playgroud)
Kur*_*den 14
一个纯Javascript示例,使用https://geoip-db.com的服务它们提供了JSON和JSONP回调解决方案.
不需要jQuery!
<!DOCTYPE html>
<html>
<head>
<title>Geo City Locator by geolocation-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://geoilocation-db.com/json/geoip.php?jsonp=callback';
var h = document.getElementsByTagName('script')[0];
h.parentNode.insertBefore(script, h);
</script>
</html>
Run Code Online (Sandbox Code Playgroud)
这个问题受到保护,我理解.但是,我没有在这里看到答案,我看到的是很多人通过提出同样的问题来展示他们想出的结果.
目前有五个区域互联网注册管理机构具有不同程度的功能,可作为知识产权所有权的第一联络点.这个过程是不断变化的,这就是为什么这里的各种服务有时会起作用而在其他时候不起作用的原因.
但是(显然)是一个古老的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...
Run Code Online (Sandbox Code Playgroud)
如果您信任hostip.info,它似乎是一个非常有用的API.
我喜欢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'];
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
坐标返回单个字符串,如'31,-80',所以从那里你只需:
$coordinates = explode(",", $details->loc); // -> '31,-89' becomes'31','-80'
echo $coordinates[0]; // latitude
echo $coordinates[1]; // longitude
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
这是一个客户端示例,显示您如何获得国家,地区和城市;
$.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");
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)
免责声明;
我建立了这项服务.
有关多种语言的示例,请参阅文档
也看到这个最好的IP地理位置API的详细分析.
小智 5
万一有人偶然发现这个帖子,这是另一个解决方案.在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'] . "<br>";
// Example: Get the users time
echo "Time: " . $data['data']['datetime']['date_time_txt'] . "<br>";
}
Run Code Online (Sandbox Code Playgroud)
使用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);
}
});
Run Code Online (Sandbox Code Playgroud)
如果您需要从 IP 地址获取位置,您可以使用可靠的地理 IP 服务,您可以在此处获取更多详细信息。它支持 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);
});
});
});
Run Code Online (Sandbox Code Playgroud)
代码:
$result = json_decode(file_get_contents('http://ip-api.io/json/64.30.228.118'));
var_dump($result);
Run Code Online (Sandbox Code Playgroud)
输出:
{
"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
}
Run Code Online (Sandbox Code Playgroud)
我在IPLocate.io上运行该服务,你可以通过一个简单的电话免费挂钩:
<?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);
Run Code Online (Sandbox Code Playgroud)
该$res
对象将包含像你的地理位置字段country
,city
等等.
查看文档以获取更多信息.
归档时间: |
|
查看次数: |
347819 次 |
最近记录: |