获取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,非常舒服,白嫖成功,在这里感谢原开源项目的作者!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/163557.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详解开源数据库审计平台Yearning

基本概念 数据库审计&#xff08;简称DBAudit&#xff09;能够实时记录网络上的数据库活动&#xff0c;对数据库操作进行细粒度审计的合规性管理&#xff0c;对数据库遭受到的风险行为进行告警&#xff0c;对攻击行为进行阻断。它通过对用户访问数据库行为的记录、分析和汇报&…

无人智能货柜:提升购物体验

无人智能货柜&#xff1a;提升购物体验 随着移动支付的普及&#xff0c;人们日常生活中的主要场景已经渗透了这一支付方式。同时&#xff0c;无人智能货柜作为购物的重要渠道&#xff0c;正在崭露头角。通过人工智能、图像识别和物联网技术的应用&#xff0c;无人智能货柜将使购…

什么是复费率电表?

随着科技的不断进步和人们对能源管理的日益重视&#xff0c;复费率电表逐渐成为我国电力系统中不可或缺的一员。复费率电表是一种能够实现电能计量、峰谷电价划分以及负荷控制等多功能的智能电表&#xff0c;它采用先进的通信技术和计算机算法&#xff0c;对用户的用电行为进行…

软件系统测试有哪些测试流程?系统测试报告编写注意事项

在软件开发的过程中&#xff0c;系统测试是至关重要的一环&#xff0c;它的目的是验证和评估软件产品是否符合预期的质量标准&#xff0c;以确保系统的稳定性、可靠性和安全性。 一、软件系统测试的测试流程 1、需求分析与测试计划制定&#xff1a;根据需求分析确定测试目标、…

软件开发及交付的项目管理角色

在软件开发及交付过程中&#xff0c;通常会涉及不同的角色和职责&#xff0c;包括业务角色、技术角色和管理角色。这些角色在项目管理中发挥着不同的作用&#xff0c;以确保项目的成功和交付高质量的产品。 业务角色&#xff1a;包括产品经理、业务分析师和业务运营人员等职位…

张弛声音变现课,青春剧配音实用攻略

在为青春剧添声时&#xff0c;配音艺术家须要捕获并传达剧中年轻角色的活泼精神、成长道路上的激情&#xff0c;以及他们在面对友情、爱情和理想时的情绪起伏。青春剧特别关注年轻人的成长故事&#xff0c;着重描绘他们在成长中的经历和变化。下面是一些为青春剧配音的建议&…

TP5制作图片压缩包

目标:将多张图片制成在一个压缩包内,供调取使用 public function test() {//引入压缩包类$zip new \ZipArchive();//新定义一个zip包$zipname ROOT_PATH./public/zip/.date("YmdHis").rand(111,999)..zip;if ($zip->open($zipname, \ZipArchive::CREATE) true…

2023年跨界融合创新应用合作发展大会-核心PPT资料下载

一、峰会简介 本次大会主题为“创新地理信息价值 服务数字中国建设”。1天主论坛和6场专题论坛的报告&#xff0c;围绕主题深入探讨地理信息产业与相关重要应用领域的跨界融合和深化合作。 本届大会将搭建地理信息产业与旅游、林业、环保、气象、住建、水利、农业农村、电力等…

竞赛选题 题目:垃圾邮件(短信)分类 算法实现 机器学习 深度学习 开题

文章目录 1 前言2 垃圾短信/邮件 分类算法 原理2.1 常用的分类器 - 贝叶斯分类器 3 数据集介绍4 数据预处理5 特征提取6 训练分类器7 综合测试结果8 其他模型方法9 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于机器学习的垃圾邮件分类 该项目…

3分钟使用 WebSocket 搭建属于自己的聊天室(WebSocket 原理、应用解析)

文章目录 WebSocket 的由来WebSocket 是什么WebSocket 优缺点优点缺点 WebSocket 适用场景主流浏览器对 WebSocket 的兼容性WebSocket 通信过程以及原理建立连接具体过程示例Sec-WebSocket-KeySec-WebSocket-Extensions 数据通信数据帧帧头&#xff08;Frame Header&#xff09…

组合数学学习

指数生成函数可以与排列结合在一起&#xff0c;而幂级数和 组合结合在一起 如果要进行计算的值不是一个具体的值&#xff0c;那么就要考虑生成函数

Windows如何使用key登录Linux服务器

场景&#xff1a;因为需要回收root管理员权限&#xff0c;禁止root用户远程登录&#xff0c;办公环境只允许普通用户远程登录&#xff0c;且不允许使用密码登录。 一、生成与配置ssh-key 1.使用root管理员权限登录到目标系统。 2.创建一个新的普通用户&#xff0c;和设置密码用…

用uniapp在微信小程序实现画板(电子签名)功能

目录 一、效果展示 二、插件推荐与引入 三、代码具体应用 四、h5端将base64转换为url 一、效果展示 二、插件推荐与引入 手写板、签字板&#xff1b;<zwp-draw-pad /> - DCloud 插件市场 这个在微信小程序引入时内容简单&#xff0c;且涉及的方法很多&#xff0c;…

【C/C++】排序算法代码实现

这里&#xff0c;汇总了常见的排序算法具体代码实现。使用C语言编写。 排序算法实现 插入排序冒泡排序选择排序快速排序希尔排序归并排序 插入排序 #include <stdio.h> #include <stdlib.h>void InsertSort(int arr[],int n){int i,j,temp;for(i 1;i < n;i){ …

Python 异常的传递性

实例 这里就简单用2个function来演示一下异常的传递性 func1 这里num 1/0明显是一个ZeroDivisionError错误&#xff0c;作为演示 def func1():print("fun1 开始执行")num 1 / 0print("func1 结束执行") func2 def func2():print("func2 开始执…

tomcat国密ssl测试

文章目录 程序包准备部署配置访问测试 程序包准备 下载 tomcat8.5 https://www.gmssl.cn/gmssl/index.jsp 下载 tomcat 国密组件及证书 本次测试所有的程序文件均已打包&#xff0c;可以直接 点击下载 部署配置 自行完成 完成centos 的jdk配置。 部署tomcat,将 gmssl4t.jar…

数字孪生农村供水工程平台:为乡村振兴注入新活力

随着科技的不断进步&#xff0c;数字孪生技术逐渐成为各行业创新发展的重要驱动力。在水利领域&#xff0c;数字孪生农村供水平台以其独特的优势&#xff0c;为农村供水系统带来了革命性的变革。本文将为您详细介绍数字孪生农村供水平台的核心特点及优势&#xff0c;带您领略智…

深度学习常见激活函数:ReLU,sigmoid,Tanh,softmax,Leaky ReLU,PReLU,ELU整理集合,应用场景选择

文章目录 1、ReLU 函数&#xff08;隐藏层中是一个常用的默认选择&#xff09;1.1 优点1.2 缺点 2、sigmoid 函数2.1 优点2.2 缺点 3、Tanh 函数3.1 优点3.2 缺点 4、softmax 函数&#xff08;多分类任务最后一层都会使用&#xff09;5、Leaky ReLU 函数5.1 优点5.2 缺点 6、PR…

mongo DB -- aggregate分组查询后字段展示

一、分组查询 在mongoDB中可以使用aggregate中的$group操作对集合中的文档进行分组,但是查询后的数据不显示其他字段,只显示分组字段 aggregate进行分组示例 db.collection.aggregate([{$group: {_id: "$field"}},]) 查询后显示 展开只显示两个字段 二、显示所有字段…

APM工具skywalking部署

一 整体架构 整个架构&#xff0c;分成上、下、左、右四部分&#xff1a; 上部分 Agent &#xff1a;负责从应用中&#xff0c;收集链路信息&#xff0c;发送给 SkyWalking OAP 服务器。目前支持 SkyWalking、Zikpin、Jaeger 等提供的 Tracing 数据信息。而我们目前采用的是&…