根据IP获取地理位置信息 — Golang

news2024/11/18 5:36:26

根据IP获取地理位置信息 — Golang

  • 1 介绍
    • 1.1 ip2region
    • 1.2 geoip2-golang
    • 1.3 总结
  • 2 使用
    • 2.1 ip2region
    • 2.2 geoip2-golang

1 介绍

1 ip2region
2 geoip2-golang

1.1 ip2region

ip2region 是一个离线IP地址定位库和IP定位数据管理框架,10微秒级别的查询效率,提供了众多主流编程语言的 xdb 数据生成和查询客户端实现。

特点:

  1. 是一个开源的IP地理位置库。
  2. 标准化的数据格式
    每个 ip 数据段的 region 信息都固定了格式:国家|区域|省份|城市|ISP,只有中国的数据绝大部分精确到了城市,其他国家部分数据只能定位到国家,后前的选项全部是0。
  3. 数据去重和压缩
  4. 极速查询响应
    即使是完全基于 xdb 文件的查询,单次查询响应时间在十微秒级别。
  5. IP 数据管理框架

缺点:
ip2region 重点在于 研究 IP 数据的存储和快速查询的实现,并没有原始 IP 数据的支撑,本项目不保证及时的数据更新,暂时也不会有商用版本。

1.2 geoip2-golang

geoip2-golang只是一个使用示例,它所需的IP地理信息库是基于MaxMind提供的 GeoLite2GeoIP2 数据库。

特点:

  1. maxmind提供了免费的可在本地部署的geo-ip数据库(GeoLite2)(mmdb以及csv格式),和geo-ip查询api服务。
  2. 支持ipv4和ipv6的地理信息查询,以及ASN数据库(ip-运营商信息查询)
  3. 免费的数据库更新周期为两周一次,需要付费才能得到最快的更新速度。

1.3 总结

推荐优先使用 geoip2-golang,其次是ip2region,如果需要更加精确的话,建议选择商用的。

2 使用

2.1 ip2region

  1. 下载ip地址库
    到github:https://github.com/lionsoul2014/ip2region下载代码。

  2. ip2region的库
    data下的ip2region.xdb
    在这里插入图片描述

  3. 使用

package main

import (
	"fmt"
	"github.com/lionsoul2014/ip2region/binding/golang/xdb"
	"net"
	"time"
)

func main() {
	ip2region()
}
func ip2region() {
	var dbPath = "iputil/ip2region/ip2region.xdb"
	searcher, err := xdb.NewWithFileOnly(dbPath)
	if err != nil {
		fmt.Printf("failed to create searcher: %s\n", err.Error())
		return
	}

	defer searcher.Close()
	var ip = "115.223.9.122"
	var tStart = time.Now()
	ips, err := net.LookupIP("www.github.com")
	ipres := ips[0].String()
	fmt.Printf("域名的ip:%s\n", ipres)
	region, err := searcher.SearchByStr(ip)
	if err != nil {
		fmt.Printf("failed to SearchIP(%s): %s\n", ip, err)
		return
	}
	fmt.Printf("{region: %s, took: %s}\n\n", region, time.Since(tStart))
	// 备注:并发使用,每个 goroutine 需要创建一个独立的 searcher 对象。
}

结果:

域名的ip:20.205.243.166
{region: 中国|0|浙江省|温州市|电信, took: 70.8846ms}

2.2 geoip2-golang

geoip2-golang只是一个使用示例,它所需的IP地理信息库是基于MaxMind提供的 GeoLite2GeoIP2 数据库。所以需要去MAXMID官网注册账号,然后才能下载最新的IP地理位置库

  1. 注册
    地址:https://www.maxmind.com/en/geolite2/signup,除了邮箱外,其他都不需要真实信息。
  2. 登录
  3. 下载最新的IP地理位置库
    登陆后点击 Download Databases进入下载选择页面
    在这里插入图片描述
  4. 下载库文件
    maxmind提供了六种免费的数据库,有mmdb【推荐】,也有csv格式。你也可以全部下载下来看看。

ASN数据库
从图中可以看到有些数据库的标题后面写着“ASN”三个字母,这个ASN的指的就是ip-运营商信息的数据库。

mmdb数据库
mmdbmaxmind自己的一种二进制数据库格式,它提供较快的ip查询速度。

这里我们只下载不是CSV格式的库文件即可,即只下载红色圈起来的,右侧是下载按钮。

注意MAXMIND会记录下载,所以不要反复下载,以免被禁。
在这里插入图片描述

  1. 库文件
  • GeoLite2-ASN_20230505.tar.gz
  • GeoLite2-City_20230505.tar.gz
  • GeoLite2-Country_20230505.tar.gz

解压后都是mmdb数据库类型,具体差别自己测试吧。

  1. 使用
  • 下载geoip2-golang
go get github.com/oschwald/geoip2-golang

代码示例:

package main

import (
	"fmt"
	"github.com/lionsoul2014/ip2region/binding/golang/xdb"
	"github.com/oschwald/geoip2-golang"
	"log"
	"net"
	"time"
)

func main() {
	ip2region()
	geoip()
}
func ip2region() {
	var dbPath = "iputil/ip2region/ip2region.xdb"
	searcher, err := xdb.NewWithFileOnly(dbPath)
	if err != nil {
		fmt.Printf("failed to create searcher: %s\n", err.Error())
		return
	}

	defer searcher.Close()
	var ip = "115.223.9.122"
	var tStart = time.Now()
	ips, err := net.LookupIP("www.github.com")
	ipres := ips[0].String()
	fmt.Printf("域名的ip:%s\n", ipres)
	region, err := searcher.SearchByStr(ip)
	if err != nil {
		fmt.Printf("failed to SearchIP(%s): %s\n", ip, err)
		return
	}
	fmt.Printf("{region: %s, took: %s}\n\n", region, time.Since(tStart))
	// 备注:并发使用,每个 goroutine 需要创建一个独立的 searcher 对象。
}

func geoip() {
	db, err := geoip2.Open("iputil/geolite2/GeoLite2-City.mmdb")
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()
	// If you are using strings that may be invalid, check that ip is not nil
	//ip := net.ParseIP("81.2.69.142")
	ip := net.ParseIP("115.192.211.101")
	record, err := db.City(ip)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("Portuguese (BR) city name: %v\n", record.City.Names["pt-BR"])
	if len(record.Subdivisions) > 0 {
		fmt.Printf("English subdivision name: %v\n", record.Subdivisions[0].Names["en"])
	}
	fmt.Printf("Russian country name: %v\n", record.Country.Names["ru"])
	fmt.Printf("ISO country code: %v\n", record.Country.IsoCode)
	fmt.Printf("Time zone: %v\n", record.Location.TimeZone)
	fmt.Printf("Coordinates: %v, %v\n", record.Location.Latitude, record.Location.Longitude)
	// Output:
	// Portuguese (BR) city name: Londres
	// English subdivision name: England
	// Russian country name: Великобритания
	// ISO country code: GB
	// Time zone: Europe/London
	// Coordinates: 51.5142, -0.0931

	fmt.Println("中文结果")
	fmt.Printf("Portuguese (BR) city name: %v\n", record.City.Names["zh-CN"])
	if len(record.Subdivisions) > 0 {
		fmt.Printf("English subdivision name: %v\n", record.Subdivisions[0].Names["zh-CN"])
	}
	fmt.Printf("Russian country name: %v\n", record.Country.Names["zh-CN"])
	fmt.Printf("ISO country code: %v\n", record.Country.IsoCode)
	fmt.Printf("Time zone: %v\n", record.Location.TimeZone)
	fmt.Printf("Coordinates: %v, %v\n", record.Location.Latitude, record.Location.Longitude)
}

结果:

Portuguese (BR) city name: Hangzhou
English subdivision name: Zhejiang
Russian country name: Китай
ISO country code: CN
Time zone: Asia/Shanghai
Coordinates: 30.2994, 120.1612
中文结果
Portuguese (BR) city name: 杭州
English subdivision name: 浙江省
Russian country name: 中国
ISO country code: CN
Time zone: Asia/Shanghai
Coordinates: 30.2994, 120.1612
  1. 将输出结果改为中文
    只需要将Names[“en”]更改为Names[“zh-CN”]即可显示中文。

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

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

相关文章

ipad密码忘了怎么解锁?教你40秒轻松移除!

无论是手机还是平板,相信大部分都会去给它们设上密码,来保证自己的隐私安全。同理,无论是苹果设备还是安卓设备,一旦设了锁屏密码,就会遇到密码忘记的情况,多次输入错误密码还会导致设备被停用。 近日&…

上海亚商投顾:沪指放量上涨创年内新高 中字头个股掀涨停潮

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 市场情绪 沪指今日高开高走,盘中一度涨近2%,站上3400点关口,深成指、创业板指走势较弱。…

openssl一套证书-配置文件和证书签发

dn-param 和 extend 配置文件 CA的dn-param 和 extend CA的dn-param 和 extend CI-csr.cnf 的内容如下: #openssl x509 extfile params extensions extend # This prevent the user to be prompted for values prompt nodistinguished_name dn-param [dn-param…

【C++】-对于自定义类型的输入输出运算符重载

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树 ❤️‍&#x1fa79;作者宣言&#xff1a;认真写好每一篇博客 &#x1f4a8;作者gitee:gitee &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 文章目录 前言一、案例引入二、<<的重载三、>>的…

智慧城市3d可视化管理大屏系统有效提高服务质量和效率

随着新一代信息技术飞速融入传统产业&#xff0c;农业数字化、网络化、智能化逐步成为农业现代化发展的基石。实现农业生产环境的智能感知、智能预警、智能决策、智能分析等功能&#xff0c;为农业生产提供精准化保障、高质量运营水平、智能化决策支撑。 3D可视化智慧管理 1&am…

在docker上安装运行Python文件

目录 一、在docker中安装python 1.1 输入镜像拉取命令 1.2 查看镜像 1.3 运行 1.4 查看是否成功 1.5 查看python版本 二、运行py文件 2.1准备运行所需文件 2.2 准备文件夹 2.3 大概是这幅模样 2.4 打包上传到服务器上 2.5 构建镜像示例 2.6 查看镜像 2.7 优化镜像的…

微星GT77HX-13VI2023原厂Windows11重建F3一键恢复

MSI微星系列原厂预装正版系统恢复镜像有原机所有驱动&#xff0c;主题&#xff0c;Logo 安装后自动重建f3 msirestore功能 系统带所有驱动以及msi center小红龙 恢复至出厂状态 文件地址https://pan.baidu.com/s/1snKOsH3OMl3GZLqeAf-GLA?pwd8888 其他型号: 微星 GE76-12代…

lua | 数组与迭代器的使用

目录 一、数组 一维数组 多维数组 二、迭代器 泛型for迭代器 无状态的迭代器 多状态的迭代器 本文章为笔者学习分享 学习网站&#xff1a;Lua 基本语法 | 菜鸟教程 一、数组 数组&#xff1a;相同数据类型的元素按一定顺序排列的集合&#xff0c;可以是一维数组和多维数…

就业Android倒数第二,IOS稳居倒数第一

在如今的互联网大环境下&#xff0c;相信有很多人都在为找工作而感到焦虑&#xff0c;每一投上十几份简历&#xff0c;收到的面试通知也就那么一两家&#xff0c;而且收到面试通知的都是一些小企业&#xff0c;工资低就不是很想去&#xff0c;工资高的岗位看了一下要求感觉自己…

解决uniapp在js文件中使用国际化报错问题

uniapp js 中如何使用国际化&#xff1f; 文章目录 uniapp js 中如何使用国际化&#xff1f;main.js 配置遇到问题解决方案Demo方式一&#xff1a;异步加载模块Promise 写法await写法 方式二&#xff1a;局部引入方式三&#xff1a;按需导入 main.js 配置 main.js 引入并初始化…

Python——pyqt5的计算器(源码+打包)

目录 一、效果图 二、源码 三、如何打包 四、如何减小打包程序大小&#xff08;方法1&#xff09; 五、如何减小打包程序大小&#xff08;方法2&#xff09; 学习视频 一、效果图 只是单纯的练手&#xff0c;然后再学习一下如何打包 二、源码 calculator_UI.zip - 蓝奏云…

论文阅读《Centralized Feature Pyramid for Object Detection》

论文地址&#xff1a;https://arxiv.org/pdf/2210.02093.pdf 源码地址&#xff1a;https://github.com/QY1994-0919/CFPNet 概述 特征金字塔模块在众多计算机视觉任务中都有优异的性能表现。针对现有的方法过渡关注于层间的特征交互而忽略了层内的特征交互的问题&#xff0c;本…

药物分子虚拟筛选规则

药物分子虚拟筛选规则 Lipinski Rule RO5是辉瑞公司资深药物化学家Christopher A. Lipinski在1997年提出&#xff0c;虽然随时代发展虽然其适用范围逐渐变窄&#xff0c;但仍然非常有参考意义。其主要内容如下&#xff1a; 分子量(Mw)小于500&#xff1b;氢键供体(HBD)数目小…

matlab 对线路板进行裁剪

缺陷图像目前还没有搞定————&#xff08;无奈&#xff09; test1 %Sobel方法 I imread(ChuanJian0.jpg); G rgb2gray(I); E1 edge(G, sobel); figure, subplot(2,2,1); imshow(I); title(Original Color Image); subplot(2,2,2); imshow(E1); title(Sobel Edge);E2 ed…

使用PyTorch构建神经网络,并计算参数Params

文章目录 使用PyTorch构建神经网络&#xff0c;并计算参数Params举例计算具有全连接层的神经网络的参数数量计算卷积神经网络的参数数量Params计算过程 总结 使用PyTorch构建神经网络&#xff0c;并计算参数Params 在深度学习中&#xff0c;模型的参数数量是一个非常重要的指标…

零基础学Java好找工作吗?好程序员告诉你入行Java有多惨?

为什么小源建议普通背景、零基础的大专生、本科生去学java编程呢&#xff1f; 因为真的香啊&#xff01;小白容易上岸&#xff0c;而且工作3年的话&#xff0c;基本年薪就能到50w&#xff08;只要你工作后也一直不断努力学习&#xff09;。java岗位属于技术岗&#xff0c;没有任…

Android进阶:Activity的生命周期和启动模式

Activity的生命周期和启动模式 作为Android四大组件之中存在感最强的组件&#xff0c;Activity应该是我们在学习Android中第一个碰到的新概念。在日常开发过程中我们肯定会用到Activity&#xff0c;但是关于Activity的一些细节问题运行机制我们可能还有一些不清楚的问题。今天…

调用百度文心AI作画API实现中文-图像跨模态生成

作者介绍 乔冠华&#xff0c;女&#xff0c;西安工程大学电子信息学院&#xff0c;2020级硕士研究生&#xff0c;张宏伟人工智能课题组。 研究方向&#xff1a;机器视觉与人工智能。 电子邮件&#xff1a;1078914066qq.com 一&#xff0e;文心AI作画API介绍 1. 文心AI作画 文…

全开源ChatGPT聊天机器人商业版源码/支持魔改/完全开放源代码

&#x1f388; 限时活动领体验会员&#xff1a;可下载程序网创项目短视频素材 &#x1f388; ☑️ 品牌&#xff1a;ChatGPT ☑️ 语言&#xff1a;PHP ☑️ 类型&#xff1a;ChatGPT ☑️ 支持&#xff1a;PCWAP &#x1f389; 有需要的朋友记得关赞评&#xff0c;需要的底部获…

C++哈希

目录 一、认识哈希表 1.unordered_set和unordered_map 2.哈希表的概念 二、闭散列哈希表的实现 1.底层本质 &#xff08;1&#xff09;哈希表的存储结构 &#xff08;2&#xff09;元素的插入与查找 &#xff08;3&#xff09;哈希冲突 &#xff08;4&#xff09;负载…