寻找网站访问者地理位置的解决方案

时间:2012-07-06 17:50:42

标签: java php geolocation ip ip-geolocation

我知道有很多服务提供地理定位工具来解决用户访问的位置。我正在开发的网站是一个在多个地区运营的电子商务网站。当访问者访问网站时,它应该可以找到他们所在的位置,并为用户显示相关的货币/语言。

过去我们使用maxmind,但我想知道是否有更好的解决方案。我呼吁具有该领域经验的开发人员分享他们的知识和专业知识,了解可用的内容以及各种解决方案的专业人员和内容。

其他信息:有问题的网站主要运行Java(Spring)和PHP(Kohana)的组合,因此也可以考虑其中任何一个的库。我们已经有了一个解决方案,可以确定使用哪种货币,前提是我们可以获得访问者所在国家/地区的ISO代码。


更新
我以为我会对访问这个问题的人留下粗略的解释。

地理定位:我已经使用freegoip来检测此线程中建议的用户位置。
语言:在确定用户使用哪种语言时,我使用PHP检查用户浏览器中设置的语言:http://www.php.net/manual/en/function.http-negotiate-language.php

6 个答案:

答案 0 :(得分:1)

在我工作的小型电子商务网站上,我们使用Akamai提供地理位置数据,根据访问者所处的状态提供定制广告和价格。请查看此信息以获取更多信息:http://www.akamai.com/html/technology/products/personalization.html。< / p>

答案 1 :(得分:1)

IPGeolocation对您来说是一个更好的选择。他们建立自己的数据库并每周更新两次数据库。在国家/地区级和城市级,它们的准确性为99%。他们还提供付费以及免费(每天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(); 

我希望这将是您的最佳选择。

答案 2 :(得分:0)

我一直在研究一个需要地理定位的项目,不幸的是我发现大多数服务都在MaxMind数据库上工作,最后我使用freegeoip,免费且到目前为止在我的地区都是精确的。

问候。

答案 3 :(得分:0)

对于语言,它应该来自浏览器。这比地理位置更有用,更准确。

例如,如果您携带笔记本电脑旅行并使用互联网,那么您可能希望使用您所使用的国家/地区的母语来查看您所使用语言的内容。

请查看此问题以获取更多信息:Checking browser's language by PHP?

答案 4 :(得分:0)

另一个选项是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

答案 5 :(得分:0)

正如我所提到的,我们为这个确切的用例构建了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\u0142是Zloty的ASCII码