获取ip属地(ip2region本地离线包-超简单)

背景

最近有涉及要显示ip属地,但我想白嫖,结果就是白嫖的api接口太慢了,要延迟3到4秒左右,很影响体验,而且不一定稳定。

结果突然看到了这个【ip2region】开源项目,离线识别ip属地,精度自己测试了好多个国家和地区的ip,效果还可以,有98%的成功率。

源地址如下,有各种语言的版本:

ip2region原作者开源项目地址icon-default.png?t=N7T8https://github.com/lionsoul2014/ip2region

 

实现

这里因为我的后端用的是node,就用node的代码做示例

第一步 ,引入依赖

npm install ip2region --save

第二步,下载离线包

 

 下载完成后,进行解压,然后把文件放到自己的项目目录下,如下:

第三步,封装工具类

以下代码可直接复制使用,只需要看一下离线包的地址是否需要更改即可。

内置两个函数:

getIpAddress:官方默认的获取ip属地方法格式

setIpAddress:我自己做的属地格式优化处理

// 导入包
const Searcher = require('../ip2region-master/binding/nodejs/index')
// 指定ip2region数据文件路径
const dbPath = '../ip2region-master/data/ip2region.xdb'

/**
 * 获取ip对应真实地址
 * @param ip ip地址
 * @returns {Promise<string>}
 */
async function getIpAddress (ip) {
  try {
    // 同步读取vectorIndex
    const vectorIndex = Searcher.loadVectorIndexFromFile(dbPath)
    // 创建searcher对象
    const searcher = Searcher.newWithVectorIndex(dbPath, vectorIndex)
    // 查询 await 或 promise均可,例子:data: {region: '中国|0|江苏省|苏州市|电信', ioCount: 2, took: 0.402874}
    let data = await searcher.search(ip)

    // ip属地格式预处理
    data = setIpAddress(data.region)

    // 返回结果
    return JSON.stringify({
      code: 200,
      data: data
    })
  } catch (e) {
    // 返回错误
    return JSON.stringify({
      code: 500,
      data: e
    })
  }
}

/**
 * ip属地格式预处理
 * @param address ip属地原格式
 * @returns {{country: string, province: string, city: string, type: string}}
 */
function setIpAddress (address) {
  // 返回体
  let adrList = {
    country: '',
    province: '',
    city: '',
    type: ''
  }

  // 根据|分割成数组,然后依次赋值
  let list = address.split('|')
  adrList.country = list[0] !== '0' ? list[0] : ''
  adrList.province = list[2] !== '0' ? list[2] : ''
  adrList.city = list[3] !== '0' ? list[3] : ''
  adrList.type = list[4] !== '0' ? list[4] : ''

  // 返回结果,示例:{ country: '中国', province: '江苏省', city: '徐州市', type: '移动' }
  return adrList
}

// 测试
let ip = '223.107.4.177'

getIpAddress(ip)
  .then(res => {
    let data = JSON.parse(res)
    console.log(data)
  })

 测试效果

可以看到结果很快,只用了十几ms,非常舒服,白嫖成功,在这里感谢原开源项目的作者!

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot本身并没有提供获取IP地址属地信息的API,需要借助第三方库实现。 可以使用IP2Region进行IP地址归属地查询,具体使用方法如下: 1.引入IP2Region依赖: ```xml <dependency> <groupId>org.lionsoul</groupId> <artifactId>ip2region</artifactId> <version>1.7.2</version> </dependency> ``` 2.创建IP2Region查询类: ```java import org.lionsoul.ip2region.*; import org.springframework.stereotype.Component; import java.io.IOException; @Component public class Ip2RegionUtil { private static final String DB_FILE_PATH = "ip2region.db"; public String getCityInfo(String ip) { try { DbConfig config = new DbConfig(); String dbPath = getClass().getResource("/").getPath() + DB_FILE_PATH; DbSearcher searcher = new DbSearcher(config, dbPath); DataBlock dataBlock = searcher.memorySearch(ip); String region = dataBlock.getRegion(); String[] regionArr = region.split("\\|"); return regionArr[2] + " " + regionArr[3] + " " + regionArr[4]; } catch (DbMakerConfigException | IOException e) { e.printStackTrace(); } return "未知"; } } ``` 3.调用IP2Region查询方法: ```java @Autowired private Ip2RegionUtil ip2RegionUtil; @GetMapping("/ip-info") public String getIpInfo(HttpServletRequest request) { String ip = request.getRemoteAddr(); String cityInfo = ip2RegionUtil.getCityInfo(ip); return cityInfo; } ``` 其中,Ip2RegionUtil类中的getCityInfo方法用于查询IP地址对应的城市信息,DB_FILE_PATH为IP2Region数据库文件路径,需要将该文件放入resources目录下。 在Controller中调用getIpInfo方法,即可获取当前请求的IP地址对应的城市信息。 需要注意的是,由于IP2Region查询操作较为耗时,建议将查询结果缓存起来,避免频繁查询导致系统性能下降。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值