IP归属地解析之离线纯真数据库分享


前言

能说算不上什么,有本事就把你的代码给我看看。—— Linus Torvalds,Linux 之父


一、什么是IP离线纯真数据库

今年上半年俄乌战争爆发,为了控制平台舆论,类似于抖音,微博等国内众多平台纷纷响应国家号召,开始进行IP的归属地显示。
这种可以通过IP地址来剥取到地理位置的做法目前实现起来主要有两种方式。

  1. 使用第三方API接口,比如目前国内的搜狐接口,淘宝接口,这种方式好处是,无需资源本地化,靠接口即可完成数据的取得,但是弊端也很明显,请求时效性,速度因人而异。
  2. 使用离线数据库,所谓的离线就是把IP库放到本地进行存储,然后通过自身的程序代码进行IP解析,相对更安全,快速。但是弊端就是IP地址不是长久不变的,IP是分配给给个运营商的,这个更新的频率可想而知,所以离线库就要考虑到数据的更新问题。

目前主流的离线库主要要三种:

  1. GeoIP2
  2. IP2Location
  3. dbIP

二、GeoIP2

1.引入库

        <dependency>
            <groupId>com.maxmind.geoip2</groupId>
            <artifactId>geoip2</artifactId>
            <version>3.0.1</version>
        </dependency>

2. 代码实装

2.1 数据获取

根据官网提示下载数据:链接: 官网
数据有两种形式:
1.MMDB结尾的二进制内置数据库
2.CSV结尾的可提供导入本地MySql数据的数据

2.2 数据位置

推荐放在resources 目录下
在这里插入图片描述

2.3 编写测试类

//GeoIP2-City 数据库文件
// 获取resources文件夹下的GeoIP2-City.mmdb文件 ,要获取绝对路径文件
File database = new File(Thread.currentThread().getContextClassLoader().getResource("GeoLite2-City.mmdb").getPath());
// 创建 DatabaseReader对象
DatabaseReader reader = new DatabaseReader.Builder(database).build();
InetAddress ipAddress = InetAddress.getByName("128.101.101.101");

// Replace "city" with the appropriate method for your database, e.g.,
// "country".
CityResponse response = reader.city(ipAddress);

Country country = response.getCountry();
System.out.println(country.getIsoCode());            // 'US'
System.out.println(country.getName());               // 'United States'
System.out.println(country.getNames().get("zh-CN")); // '美国'

Subdivision subdivision = response.getMostSpecificSubdivision();
System.out.println(subdivision.getName());    // 'Minnesota'
System.out.println(subdivision.getIsoCode()); // 'MN'

City city = response.getCity();
System.out.println(city.getName()); // 'Minneapolis'

Postal postal = response.getPostal();
System.out.println(postal.getCode()); // '55455'

Location location = response.getLocation();
System.out.println(location.getLatitude());  // 44.9733
System.out.println(location.getLongitude()); // -93.2323

2.4 IP解析

在这里插入图片描述

三、IP2Location

1. 官方SDK文件获取

在这里插入图片描述
可以自己选择自己想要的SDK进行封装拓展

2. 代码实装

2.1 获取数据

根据官网提示下载数据:链接: 官网
数据有两种形式:
1.BIN结尾的二进制内置数据库
2.CSV结尾的可提供导入本地MySql数据的数据

2.2 数据位置

推荐放在resources 目录下
在这里插入图片描述

2.3 编写测试类

		IP2Location loc = new IP2Location();
        try {
            String ip = "8.8.8.8"; //定义IP
            String binfile = "IP2LOCATION-LITE-DB11.BIN"; 
            Path binpath = Paths.get("src", "main", "resources", binfile); //获取数据文件
            String binfilepath = binpath.toFile().getAbsolutePath();
            loc.Open(binfilepath, true);

            IPResult rec = loc.IPQuery(ip);
            if ("OK".equals(rec.getStatus())) {
                System.out.println(rec);
            } else if ("EMPTY_IP_ADDRESS".equals(rec.getStatus())) {
                System.out.println("IP address cannot be blank.");
            } else if ("INVALID_IP_ADDRESS".equals(rec.getStatus())) {
                System.out.println("Invalid IP address.");
            } else if ("MISSING_FILE".equals(rec.getStatus())) {
                System.out.println("Invalid database path.");
            } else if ("IPV6_NOT_SUPPORTED".equals(rec.getStatus())) {
                System.out.println("This BIN does not contain IPv6 data.");
            } else {
                System.out.println("Unknown error." + rec.getStatus());
            }
            System.out.println("Java Component: " + rec.getVersion());
        } catch (Exception e) {
            System.out.println(e);
            e.printStackTrace(System.out);
        } finally {
            loc.Close();
        }

2.4 IP解析

在这里插入图片描述

四、dbIP

dbIP属于一个第三方库,提供API结合和离线数据库,提供MMDB形式的数据库,需要配合类似GeoIP2的解析器进行解析,数据相对较GEOIP准确。
在这里插入图片描述
在这里插入图片描述
下载地址

五、数据免费下载

下载链接: 点击0积分下载

本来就免费的东西,更应该无偿分享。

总结

免费版本的离线数据都有不精确的误差,这是在所难免的,但是对于一般的业务使用场景已经完全够用了。
GEOIP2免费版对语言的支持相对友好。

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值