根据 ip 地址判断所属国家(自建服务)

Laravel 推荐使用这个包 laravel-geoip

composer require torann/geoip

php artisan vendor:publish --provider="Torann\GeoIP\GeoIPServiceProvider"  --tag=config

这个包已经为你添加了助手函数和门面代理,使用起来也非常方便

  • geoip($ip)
  • GeoIp::getLocation($ip)
$ip  =  '161.81.196.194'; 
geoip($ip)->toArray();

laravel-geoip 是基于maxmind/minfraud
来实现的,如果你没有使用Laravel,也可以直接装这个包。

具体文档查看 这里


这里还有一个免费方案平替,具体我也不清楚请求达到多少后会被限流

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <div>
    目前所在:<span id="result"></span>
  </div>
  <script>
    const Http = new XMLHttpRequest();
    const url='http://ip-api.com/json/171.22.195.166';
    Http.open("GET", url);
    Http.send();

    Http.onreadystatechange = (e) => {
      console.log(Http.responseText)
    }
  </script>
</body>

</html>

直接替换上面的 ip 地址即可,不过建议让前端来请求接口,因为请求不从服务端发出的话应该不会触发限流。


再次更新

上面的别看了,最近折腾了好几次,目前网上没有免费的解决方案,最后决定自己搞。

解决思路:使用 maxminddb 读取本地 mmdb 数据库查找

我使用了 php 扩展来实现 MaxMind-DB-Reader-php,你也可以不装,装扩展效率高一些,不装扩展用这个库 GeoIP2-php

这里展开说下第一种 Maxminddb 扩展安装

atp install libmaxminddb 
pecl install maxminddb

执行这两个,你也可以自己编译安装,这里不再赘述了
然后安装 composer 包

composer require maxmind-db/reader

使用:

$reader = new Reader('/Users/Ricky/Sites/GeoLite2-Country.mmdb'); // 数据库文件
$ip = '161.81.198.57'; // 自己获取 ip 地址

var_dump($reader->get($ip));

数据格式如下:

array(3) {
  ["continent"]=>
  array(3) {
    ["code"]=>
    string(2) "AS"
    ["geoname_id"]=>
    int(6255147)
    ["names"]=>
    array(8) {
      ["de"]=>
      string(5) "Asien"
      ["en"]=>
      string(4) "Asia"
      ["es"]=>
      string(4) "Asia"
      ["fr"]=>
      string(4) "Asie"
      ["ja"]=>
      string(9) "アジア"
      ["pt-BR"]=>
      string(5) "Ásia"
      ["ru"]=>
      string(8) "Азия"
      ["zh-CN"]=>
      string(6) "亚洲"
    }
  }
  ["country"]=>
  array(3) {
    ["geoname_id"]=>
    int(1819730)
    ["iso_code"]=>
    string(2) "HK"
    ["names"]=>
    array(8) {
      ["de"]=>
      string(8) "Hongkong"
      ["en"]=>
      string(9) "Hong Kong"
      ["es"]=>
      string(9) "Hong Kong"
      ["fr"]=>
      string(9) "Hong Kong"
      ["ja"]=>
      string(6) "香港"
      ["pt-BR"]=>
      string(9) "Hong Kong"
      ["ru"]=>
      string(14) "Гонконг"
      ["zh-CN"]=>
      string(6) "香港"
    }
  }
  ["registered_country"]=>
  array(3) {
    ["geoname_id"]=>
    int(1819730)
    ["iso_code"]=>
    string(2) "HK"
    ["names"]=>
    array(8) {
      ["de"]=>
      string(8) "Hongkong"
      ["en"]=>
      string(9) "Hong Kong"
      ["es"]=>
      string(9) "Hong Kong"
      ["fr"]=>
      string(9) "Hong Kong"
      ["ja"]=>
      string(6) "香港"
      ["pt-BR"]=>
      string(9) "Hong Kong"
      ["ru"]=>
      string(14) "Гонконг"
      ["zh-CN"]=>
      string(6) "香港"
    }
  }
}

如果要取国家编号,一般用 iso_code

数据库下载地址

本作品采用《CC 协议》,转载必须注明作者和本文链接
悲观者永远正确,乐观者永远前行。
附言 1  ·  1年前

重新整理了一下

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 3

我从未见过一个早起、勤奋、谨慎,诚实的人抱怨命运。 收藏了

1年前 评论

:joy:生产队的磨盘都摩出火星子来了,你太能钻研了,一对比之下,我就是懒狗!

1年前 评论
MArtian (楼主) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!