[英]Solutions for finding website visitor's geolocation
我知道有许多服务提供地理定位工具来确定用户访问的位置。 我正在开发的网站是一个在多个地区运行的电子商务网站。 当访问者访问网站时,它应该计算出他们来自哪里并为用户显示相关的货币/语言。
过去我们使用过maxmind,但我想知道是否有更好的解决方案。 我呼吁在该领域有经验的开发人员分享他们关于可用解决方案以及各种解决方案的优缺点的知识和专业知识。
附加信息:有问题的网站主要在 Java (Spring) 和 PHP (Kohana) 的组合上运行,因此也可以考虑其中任何一个的库。 如果我们可以获得访问者所在国家/地区的 ISO 代码,我们已经有一个解决方案来确定使用哪种货币。
更新
以为我会为访问此问题的任何人留下对结果的粗略解释。
地理位置:我已经使用 freegoip 来检测用户位置,如该线程中建议的那样。
语言:在确定用户使用哪种语言时,我使用 PHP 来检查用户浏览器中设置的语言: http : //www.php.net/manual/en/function.http-negotiate-language.php
在我工作的一个小型电子商务网站上,我们使用 Akamai 提供地理定位数据,这些数据将根据访问者所处的状态提供定制的广告和价格。查看此了解更多信息: http : //www.akamai.com/ html/technology/products/personalization.html 。
IPGeolocation将是您更好的选择。 他们建立自己的数据库并每周更新两次数据库。 他们在国家层面有 99% 的准确率,在城市层面有 75% 的准确率。 他们还提供付费和免费(每天 1000 个请求)API 计划,您可以在此处查看: https : //ipgeolocation.io/pricing.html 。
为方便开发者,IPGeolocation API 提供了一些针对各种编程语言的 SDK:
获取 IP 地址的地理位置信息的端点:
此端点旨在从服务器端调用。
$ curl 'https://api.ipgeolocation.io/ipgeo?apiKey=API_KEY&ip=8.8.8.8'
JSON 响应将是:
{
"ip": "8.8.8.8",
"hostname": "google-public-dns-a.google.com",
"continent_code": "NA",
"continent_name": "North America",
"country_code2": "US",
"country_code3": "USA",
"country_name": "United States",
"country_capital": "Washington",
"state_prov": "California",
"district": "",
"city": "Mountain View",
"zipcode": "94043",
"latitude": "37.4229",
"longitude": "-122.085",
"is_eu": false,
"calling_code": "+1",
"country_tld": ".us",
"languages": "en-US,es-US,haw,fr",
"country_flag": "https://ipgeolocation.io/static/flags/us_64.png",
"isp": "Level 3 Communications",
"connection_type": "",
"organization": "Google Inc.",
"geoname_id": "5375480",
"currency": {
"code": "USD",
"name": "US Dollar",
"symbol": "$"
},
"time_zone": {
"name": "America/Los_Angeles",
"offset": -8,
"current_time": "2019-01-14 03:30:00.135-0800",
"current_time_unix": 1547465400.135,
"is_dst": false,
"dst_savings": 1
}
}
您还可以从整个响应中过滤特定参数。
获取访问者的位置后,您还可以使用以下简单代码将他重定向到根据他的语言/货币的页面:
var request = new XMLHttpRequest();
request.onreadystatechange = function() {
if (4 === this.readyState && 200 === this.status) {
var json = JSON.parse(this.responseText);
if (json.country_code2 == "FR" && window.location.hostname !== "http://fr.exmaple.com") {
window.location.href = "https://fr.exmaple.com";
} else if (json.country_code2 == "US" && window.location.hostname !== "http://us.exmaple.com") {
window.location.href = "https://us.exmaple.com";
} else if (json.country_code2 == "UK" && window.location.hostname !== "http://uk.exmaple.com") {
window.location.href = "https://uk.exmaple.com";
}else {
window.location.href = "https://exmaple.com";
}
}
}
request.open("GET", "https ://api.ipgeolocation.io/ipgeo?apiKey=YOUR_API_KEY&fields=country_code2", false);
request.setRequestHeader("Accept", "application/json");
request.send();
我希望这对你来说是最好的选择。
对于语言,它应该来自浏览器。 这比地理定位更有用、更准确。
例如,如果您携带笔记本电脑旅行并使用互联网,您可能希望以您的语言而不是您所在国家/地区的母语来查看内容。
查看此问题以获取更多信息: Checking browser's language by PHP?
另一种选择是http://ipinfo.io API(我自己的服务)。 以下是 API 返回内容的示例。
$ 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
}
您还可以查询特定字段,例如本示例中的国家/地区:
$ curl ipinfo.io/8.8.8.8/country
US
更多详细信息可在http://ipinfo.io/developers 获得。 每天最多可免费处理 1,000 个请求,您还可以注册超出此范围的付费计划(请参阅http://ipinfo.io/pricing )
正如我提到的,我们为这个确切的用例构建了https://ipdata.co
$ip = '78.8.53.5';
$details = json_decode(file_get_contents("https://api.ipdata.co/{$ip}"));
这将返回
{
"ip": "78.8.53.5",
"city": "G\u0142og\u00f3w",
"region": "Lower Silesia",
"country_name": "Poland",
"country_code": "PL",
"continent_name": "Europe",
"continent_code": "EU",
"latitude": 51.663,
"longitude": 16.0757,
"asn": "AS12741",
"organisation": "Netia SA",
"postal": "67-200",
"currency": "PLN",
"currency_symbol": "z\u0142",
"calling_code": "48",
"flag": "https://ipdata.co/flags/pl.png",
"time_zone": "Europe/Warsaw"
}
这有许多电子商务相关的数据点,特别是
货币符号z\ł
是兹罗提的 ASCII
zł
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.