【问题标题】:Solutions for finding website visitor's geolocation查找网站访问者地理位置的解决方案
【发布时间】:2012-07-07 05:04:14
【问题描述】:

我知道有许多服务提供地理定位工具来确定用户从哪里访问。我正在开发的网站是一个在多个地区运行的电子商务网站。当访问者访问网站时,它应该知道他们来自哪里,并为用户显示相关的货币/语言。

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

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


更新
以为我会为访问此问题的任何人留下对结果的粗略解释。

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

【问题讨论】:

  • 嗨,我们为这个确切的用例构建了 ipdata.co,我们的 API 提供货币符号、货币代码、用户时区、托管的国家标志图标以及位置数据。有关 PHP 示例,请参阅下面的 stackoverflow.com/a/47141807/3176550。

标签: java php geolocation ip ip-geolocation


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    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(); 
    

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

    【讨论】:

      【解决方案3】:

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

      问候。

      【讨论】:

        【解决方案4】:

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

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

        查看这个问题了解更多信息:Checking browser's language by PHP?

        【讨论】:

        • 这很好。在实施位置检测时,我打算通知用户检测并让他们选择更改语言和货币。类似于您第一次访问 Etsy 时所做的。
        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          zł
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-04-10
            • 2011-11-08
            • 1970-01-01
            • 1970-01-01
            • 2015-08-15
            • 1970-01-01
            • 2014-08-28
            • 1970-01-01
            相关资源
            最近更新 更多