根据IP获取地理位置信息 — Golang
根据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 数据生成和查询客户端实现。
特点:
- 是一个开源的IP地理位置库。
- 标准化的数据格式
每个 ip 数据段的 region 信息都固定了格式:国家|区域|省份|城市|ISP,只有中国的数据绝大部分精确到了城市,其他国家部分数据只能定位到国家,后前的选项全部是0。 - 数据去重和压缩
- 极速查询响应
即使是完全基于 xdb 文件的查询,单次查询响应时间在十微秒级别。 - IP 数据管理框架
缺点:
ip2region
重点在于 研究 IP 数据的存储和快速查询的实现
,并没有原始 IP 数据的支撑,本项目不保证及时的数据更新
,暂时也不会有商用版本。
1.2 geoip2-golang
geoip2-golang
只是一个使用示例,它所需的IP地理信息库是基于MaxMind
提供的 GeoLite2
和 GeoIP2
数据库。
特点:
maxmind
提供了免费的可在本地部署的geo-ip数据库(GeoLite2)(mmdb以及csv格式),和geo-ip查询api服务。- 支持ipv4和ipv6的地理信息查询,以及ASN数据库(ip-运营商信息查询)
- 免费的数据库
更新周期为两周一次
,需要付费才能得到最快的更新速度。
1.3 总结
推荐优先使用 geoip2-golang
,其次是ip2region
,如果需要更加精确的话,建议选择商用的。
2 使用
2.1 ip2region
下载ip地址库
到github:https://github.com/lionsoul2014/ip2region下载代码。ip2region
的库
在data
下的ip2region.xdb
使用
package mainimport ("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
提供的 GeoLite2
和 GeoIP2
数据库。所以需要去MAXMID
官网注册账号,然后才能下载最新的IP地理位置库
。
- 注册
地址:https://www.maxmind.com/en/geolite2/signup,除了邮箱外,其他都不需要真实信息。 - 登录
- 下载最新的
IP地理位置库
登陆后点击 Download Databases进入下载选择页面
- 下载库文件
maxmind提供了六种免费的数据库,有mmdb
【推荐】,也有csv
格式。你也可以全部下载下来看看。
ASN数据库
从图中可以看到有些数据库的标题后面写着“ASN”三个字母,这个ASN的指的就是ip-运营商信息的数据库。
mmdb数据库
mmdb
是maxmind
自己的一种二进制数据库格式,它提供较快的ip查询速度。
这里我们只下载不是CSV格式
的库文件即可,即只下载红色圈起来的,右侧是下载按钮。
注意:MAXMIND
会记录下载,所以不要反复下载,以免被禁。
- 库文件
- GeoLite2-ASN_20230505.tar.gz
- GeoLite2-City_20230505.tar.gz
- GeoLite2-Country_20230505.tar.gz
解压后都是mmdb数据库类型,具体差别自己测试吧。
- 使用
- 下载
geoip2-golang
go get github.com/oschwald/geoip2-golang
代码示例:
package mainimport ("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.0931fmt.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
- 将输出结果改为中文
只需要将Names[“en”]更改为Names[“zh-CN”]即可显示中文。
根据IP获取地理位置信息 — Golang相关推荐
- 通过GeoIP2分析访问者IP获取地理位置信息
MaxMind GeoIP2 服务能识别互联网用户的地点位置与其他特征,应用广泛,包括个性化定制内容.诈欺检测.广告定向.网站流量分析.执行规定.地理目标定位.地理围栏定位 (geo-fencing) ...
- geoip java api zh cn_通过GeoIP2分析访问者IP获取地理位置信息
MaxMind GeoIP2 服务能识别互联网用户的地点位置与其他特征,应用广泛,包括个性化定制内容.诈欺检测.广告定向.网站流量分析.执行规定.地理目标定位.地理围栏定位 (geo-fencing) ...
- html5中获取地理位置信息
HTML5提供了地理位置定位功能(Geolocation API),能确定用户位置,我们可以借助HTML5的该特性开发基于地理位置信息的应用.本文结合实例给大家分享如何使用HTML5,借助百度.谷歌地 ...
- php查询ip归属地api接口_php调用新浪接口查询ip获取地理位置(ip归属地查询)
php调用新浪接口查询ip获取地理位置(ip归属地查询) 发布于 2014-11-17 08:35:58 | 115 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: ...
- html5实现获取地理位置信息并定位
html5实现获取地理位置信息并定位 一.总结 一句话总结:获取地理位置是分两步:获取经纬度和根据经纬度获取地址信息 a.HTML5的Geolocation(地理位置功能(Geolocation AP ...
- flutter利用高德如何获取地理位置信息bug处理
flutter中对于利用高德如何获取地理位置信息, 1.在高德开发平台,注册成为开发者,并获取key 2.安装依赖 对于如何安装第三方插件 请点击此处pub.dev amap_location 3.修 ...
- 百度api:根据经纬度获取地理位置信息
调用百度api,根据经度和纬度获取地理位置信息,返回Json. C#代码: using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Syste ...
- html5获取地理位置信息API
html5获取地理位置信息API 在HTML5中,可以看下如何使用Geolocation API来获得用户的地理位置信息,如果该浏览器支持的话,且设备具有定位功能,就能够直接使用这组API来获取当前位 ...
- Android 获取地理位置信息 封装好了 直接用
前言:花了一个早上研究了以下android获取经纬度,然后网上的参考资料都是杂七杂八,基本上都是过去几年的,现在我用 android6.0参照别人的结果发生好多错误,我的内心几乎是崩溃的.后来,不断百 ...
最新文章
- Laplace数值逆运算的讨论
- 【NOIP2016PJ】【Luogu2058】海港
- 关于公司内部DNS的整改建议
- 基于python的作业管理系统_python day18 作业 Django 开发主机管理系统
- 聊一聊Python与C++的不同(一)
- Springboot知识库系统答辩PPT模板
- CentOS[linux]操作系统的安装手册
- win7下配置IIS(ASP.net)
- 《数值分析》-- 复化求积公式
- 大数据技术原理与应用 大作业--------微博精准营销案例设计与实现
- mysql workbench6.3.5_mysql workbench
- 大胆决定+细致用功, 才可能改变命运
- 12306又崩溃,买张车票怎么就这么难
- 京东淘宝天猫API销量接口
- 关于“马甲app”你不得不知的一些常识
- 【积水成渊-逐步定制自己的Emacs神器】4:Emacs自动补全
- 移动互联网,政府服务怎么做?
- table表格的定义及常用属性
- Coda 2.5 发布,Mac 编辑器软件
- oracle--2.服务