免费获取 IP 地址的地理信息

❥ 赞助商

假设您需要知道访问您网站的用户的国家/地区,因为您有一个国际化网站,并且会根据该国家/地区显示不同的内容。您可以询问用户。您可能希望无论如何都具有该功能,以确保您的访问者能够控制,但他们肯定会很乐意在您的能力范围内,直接获得正确的信息。

没有本机 Web 技术具有此信息。JavaScript 具有地理定位功能,但用户需要批准,即使这样,您也需要使用一些库将坐标转换为更实用的国家/地区。即使后端语言能够访问 JavaScript 无法访问的 IP 地址,也不能自动知道源国家/地区。

加拿大。我只想知道他们是否来自加拿大。

您需要询问知道此信息的某种服务。The IP 地理定位 API 就是这样的服务,而且它是免费的。

您对 API 执行 GET 操作。如果您想测试它,可以在浏览器中直接执行。

https://api.ipgeolocationapi.com/geolocate/184.149.48.32

但您获得的不仅仅是国家/地区。您还会获得可能需要使用的大量信息。我碰巧坐在加拿大,这是我关于我的 IP 地址的信息

{ 
   "continent":"North America",
   "address_format":"{{recipient}}\n{{street}}\n{{city}} {{region_short}} {{postalcode}}\n{{country}}",
   "alpha2":"CA",
   "alpha3":"CAN",
   "country_code":"1",
   "international_prefix":"011",
   "ioc":"CAN",
   "gec":"CA",
   "name":"Canada",
   "national_destination_code_lengths":[ 
      3
   ],
   "national_number_lengths":[ 
      10
   ],
   "national_prefix":"1",
   "number":"124",
   "region":"Americas",
   "subregion":"Northern America",
   "world_region":"AMER",
   "un_locode":"CA",
   "nationality":"Canadian",
   "postal_code":true,
   "unofficial_names":[ 
      "Canada",
      "Kanada",
      "Canadá",
      "カナダ"
   ],
   "languages_official":[ 
      "en",
      "fr"
   ],
   "languages_spoken":[ 
      "en",
      "fr"
   ],
   "geo":{ 
      "latitude":56.130366,
      "latitude_dec":"62.832908630371094",
      "longitude":-106.346771,
      "longitude_dec":"-95.91332244873047",
      "max_latitude":83.6381,
      "max_longitude":-50.9766,
      "min_latitude":41.6765559,
      "min_longitude":-141.00187,
      "bounds":{ 
         "northeast":{ 
            "lat":83.6381,
            "lng":-50.9766
         },
         "southwest":{ 
            "lat":41.6765559,
            "lng":-141.00187
         }
      }
   },
   "currency_code":"CAD",
   "start_of_week":"sunday"
}

有了这些信息,我可以轻松决定将用户重定向到我的网站的加拿大版本(如果有),或者以加元显示价格,或者提供法语翻译,或者是我能想到的任何其他事情。

假设您使用的是 PHP。您可以获取 IP 就像这样...

function getUserIpAddr() {
  if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
    $ip = $_SERVER['HTTP_CLIENT_IP'];
  } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
  } else {
    $ip = $_SERVER['REMOTE_ADDR'];
  }
  return $ip;
}

获取信息的 cURL

$url = "https://api.ipgeolocationapi.com/geolocate/184.149.48.32"; 
$ch = curl_init();  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_URL, $url); 
$result = curl_exec($ch); 

它以 JSON 格式返回,因此

$json = json_decode($result);

然后 $json->{'name'}; 如果我在加拿大,则将是“加拿大”。

所以我可以像这样

if ($json->{'name'} == "Canada") {
  // serve index-ca.php
} else {
  // server index.php
}