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

2023-11-23 20:30

本文主要是介绍获取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 {// 同步读取vectorIndexconst 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,非常舒服,白嫖成功,在这里感谢原开源项目的作者!

这篇关于获取ip属地(ip2region本地离线包-超简单)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/420543

相关文章

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n

SpringMVC获取请求参数的方法

《SpringMVC获取请求参数的方法》:本文主要介绍SpringMVC获取请求参数的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下... 目录1、通过ServletAPI获取2、通过控制器方法的形参获取请求参数3、@RequestParam4、@

Python中使用正则表达式精准匹配IP地址的案例

《Python中使用正则表达式精准匹配IP地址的案例》Python的正则表达式(re模块)是完成这个任务的利器,但你知道怎么写才能准确匹配各种合法的IP地址吗,今天我们就来详细探讨这个问题,感兴趣的朋... 目录为什么需要IP正则表达式?IP地址的基本结构基础正则表达式写法精确匹配0-255的数字验证IP地

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

python连接本地SQL server详细图文教程

《python连接本地SQLserver详细图文教程》在数据分析领域,经常需要从数据库中获取数据进行分析和处理,下面:本文主要介绍python连接本地SQLserver的相关资料,文中通过代码... 目录一.设置本地账号1.新建用户2.开启双重验证3,开启TCP/IP本地服务二js.python连接实例1.

golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法

《golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法》:本文主要介绍golang获取当前时间、时间戳和时间字符串及它们之间的相互转换,本文通过实例代码给大家介绍的非常详细,感兴趣... 目录1、获取当前时间2、获取当前时间戳3、获取当前时间的字符串格式4、它们之间的相互转化上篇文章给大家介

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

微信公众号脚本-获取热搜自动新建草稿并发布文章

《微信公众号脚本-获取热搜自动新建草稿并发布文章》本来想写一个自动化发布微信公众号的小绿书的脚本,但是微信公众号官网没有小绿书的接口,那就写一个获取热搜微信普通文章的脚本吧,:本文主要介绍微信公众... 目录介绍思路前期准备环境要求获取接口token获取热搜获取热搜数据下载热搜图片给图片加上标题文字上传图片