根据 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 协议》,转载必须注明作者和本文链接
重新整理了一下
我从未见过一个早起、勤奋、谨慎,诚实的人抱怨命运。 收藏了
:joy:生产队的磨盘都摩出火星子来了,你太能钻研了,一对比之下,我就是懒狗!