根据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 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提供的 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 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
  1. 将输出结果改为中文
    只需要将Names[“en”]更改为Names[“zh-CN”]即可显示中文。

根据IP获取地理位置信息 — Golang相关推荐

  1. 通过GeoIP2分析访问者IP获取地理位置信息

    MaxMind GeoIP2 服务能识别互联网用户的地点位置与其他特征,应用广泛,包括个性化定制内容.诈欺检测.广告定向.网站流量分析.执行规定.地理目标定位.地理围栏定位 (geo-fencing) ...

  2. geoip java api zh cn_通过GeoIP2分析访问者IP获取地理位置信息

    MaxMind GeoIP2 服务能识别互联网用户的地点位置与其他特征,应用广泛,包括个性化定制内容.诈欺检测.广告定向.网站流量分析.执行规定.地理目标定位.地理围栏定位 (geo-fencing) ...

  3. html5中获取地理位置信息

    HTML5提供了地理位置定位功能(Geolocation API),能确定用户位置,我们可以借助HTML5的该特性开发基于地理位置信息的应用.本文结合实例给大家分享如何使用HTML5,借助百度.谷歌地 ...

  4. php查询ip归属地api接口_php调用新浪接口查询ip获取地理位置(ip归属地查询)

    php调用新浪接口查询ip获取地理位置(ip归属地查询) 发布于 2014-11-17 08:35:58 | 115 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: ...

  5. html5实现获取地理位置信息并定位

    html5实现获取地理位置信息并定位 一.总结 一句话总结:获取地理位置是分两步:获取经纬度和根据经纬度获取地址信息 a.HTML5的Geolocation(地理位置功能(Geolocation AP ...

  6. flutter利用高德如何获取地理位置信息bug处理

    flutter中对于利用高德如何获取地理位置信息, 1.在高德开发平台,注册成为开发者,并获取key 2.安装依赖 对于如何安装第三方插件 请点击此处pub.dev amap_location 3.修 ...

  7. 百度api:根据经纬度获取地理位置信息

    调用百度api,根据经度和纬度获取地理位置信息,返回Json. C#代码: using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Syste ...

  8. html5获取地理位置信息API

    html5获取地理位置信息API 在HTML5中,可以看下如何使用Geolocation API来获得用户的地理位置信息,如果该浏览器支持的话,且设备具有定位功能,就能够直接使用这组API来获取当前位 ...

  9. Android 获取地理位置信息 封装好了 直接用

    前言:花了一个早上研究了以下android获取经纬度,然后网上的参考资料都是杂七杂八,基本上都是过去几年的,现在我用 android6.0参照别人的结果发生好多错误,我的内心几乎是崩溃的.后来,不断百 ...

最新文章

  1. Laplace数值逆运算的讨论
  2. 【NOIP2016PJ】【Luogu2058】海港
  3. 关于公司内部DNS的整改建议
  4. 基于python的作业管理系统_python day18 作业 Django 开发主机管理系统
  5. 聊一聊Python与C++的不同(一)
  6. Springboot知识库系统答辩PPT模板
  7. CentOS[linux]操作系统的安装手册
  8. win7下配置IIS(ASP.net)
  9. 《数值分析》-- 复化求积公式
  10. 大数据技术原理与应用 大作业--------微博精准营销案例设计与实现
  11. mysql workbench6.3.5_mysql workbench
  12. 大胆决定+细致用功, 才可能改变命运
  13. 12306又崩溃,买张车票怎么就这么难
  14. 京东淘宝天猫API销量接口
  15. 关于“马甲app”你不得不知的一些常识
  16. 【积水成渊-逐步定制自己的Emacs神器】4:Emacs自动补全
  17. 移动互联网,政府服务怎么做?
  18. table表格的定义及常用属性
  19. Coda 2.5 发布,Mac 编辑器软件
  20. oracle--2.服务

热门文章

  1. 稳压二极管、肖特基二极管、ESD静电保护二极管、TVS瞬态抑制保护管
  2. 计算机打开查看方式默认是什么样,如何设置电脑文件夹默认查看方式
  3. 笔记本损耗60 计算机提示,笔记本电脑寿命短,你可能犯了这3个错误
  4. Java问题定位技术手册
  5. c语言实现按键精灵区域找图,区域遍历所有图片(找图,多点找色)----1个函数实现...
  6. 宏基因组学数据分析在生物医学领域的应用
  7. 系统定时重启服务脚本案例
  8. 简单介绍一下python的魔方方法
  9. 怎么彻底删除SQL server
  10. Docker中修改Tomcat端口号