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

这篇具有很好参考价值的文章主要介绍了Golang — 根据IP获取地理位置信息。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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
    Golang — 根据IP获取地理位置信息,golang工具方法,golang

  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进入下载选择页面
    Golang — 根据IP获取地理位置信息,golang工具方法,golang
  4. 下载库文件
    maxmind提供了六种免费的数据库,有mmdb【推荐】,也有csv格式。你也可以全部下载下来看看。

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

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

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

注意MAXMIND会记录下载,所以不要反复下载,以免被禁。
Golang — 根据IP获取地理位置信息,golang工具方法,golang

  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)
}

结果:文章来源地址https://www.toymoban.com/news/detail-632725.html

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”]即可显示中文。

到了这里,关于Golang — 根据IP获取地理位置信息的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity 获取手机地理位置信息

    在游戏的开发过程中,有时候会遇到需要获取玩家位置信息的需求,比如显示玩家所在的国家城市等。 有一下方法可以参考: 可以根据手机的地区和语言来做判断。 根据IP来判断所处的位置,阿里云啥的都有对应的接口服务。 根据GPS来判断。 以上方法都各有利弊吧,这里简

    2024年02月12日
    浏览(37)
  • uniapp h5获取用户地理位置信息(高德地图)

     使用uni.getLocation()先获取到当前位置信息的经纬度 H5端测试可以使用http,上线打包需要设置为https模式 谷歌浏览器可能会获取不到任何信息,因为谷歌浏览器位置信息是连接谷歌服务器获取的,国内用户可能获取位置信息失败 使用高德开发平台注册一个key 高德开发平台:高

    2024年02月13日
    浏览(34)
  • 分享几个IP获取地理位置的API

    一、请求接口(GET): https://ip.taobao.com/outGetIpInfo?ip=IP地址accessKey=alibaba-inc 二、返回数据格式: 三、频次限制: 每个用户的访问频率需小于1qps 四、文档说明: http://ip.taobao.com/instructions.html 五、代码片段: 一 、请求接口(GET): http://freeapi.ipip.net/ip地址字串 二、返回数据

    2024年02月03日
    浏览(35)
  • Nginx通过用户IP获取所在国家及地理位置

    Nginx是一款高性能、轻量级的Web服务器和反向代理服务器。它最初设计目的是为了解决C10k问题,即如何支持10,000个以上的并发连接。Nginx采用了事件驱动的异步非阻塞模型,可以在消耗较少的系统资源下处理更多的并发连接。由于其高性能和可靠性,Nginx逐渐成为了现代Web架构

    2024年02月09日
    浏览(35)
  • 利用Spring Boot实现客户端IP地理位置获取

    在当今互联的世界中,了解客户端的地理位置对于提供个性化服务和增强用户体验至关重要。无论是根据地区偏好定制内容,还是确保符合本地法规,访问客户端IP位置都是一项宝贵的资产。如抖音评论区、用户页都会展示用户的IP属地信息。 在本文中,我们将探讨一个Spri

    2024年02月20日
    浏览(41)
  • 微信小程序通过startLocationUpdate,onLocationChange获取当前地理位置信息,配合腾讯地图解析获取到地址

    先创建个getLocation.js文件 在App.vue文件里引入封装的getLocation.js文件 要在manifest.json文件里配置下内容

    2024年02月03日
    浏览(41)
  • 如何获取用户请求的真实ip,并返回访问者的ip地理位置?node,vue

    方式1、前端调用免费公共接口获取 前端获取访问者的真实的外网ip,可以通过调用接口https://api.ipify.org/来获取。你也可以直接在网页上访问它来看自己的外网ip。 ipify介绍: ipify是一个免费的公共 API,用于获取设备的公共 IP 地址。它通过查询服务器获取用户的 IP 地址,并将

    2024年03月15日
    浏览(35)
  • 用户Ip地址和百度地图api接口获取用户地理位置(经纬度坐标,城市)

    ?php //获取用户ip(外网ip 服务器上可以获取用户外网Ip 本机ip地址只能获取127.0.0.1) function   getip(){      if (! empty ( $_SERVER [ \\\"HTTP_CLIENT_IP\\\" ])){      $cip   =  $_SERVER [ \\\"HTTP_CLIENT_IP\\\" ];      }      else   if (! empty ( $_SERVER [ \\\"HTTP_X_FORWARDED_FOR\\\" ])){      $cip   =  $_SERVER [ \\\"HTTP_X_FOR

    2024年02月11日
    浏览(54)
  • Java编程技巧:获取ip地址、通过ip获取地理位置、获取客户端操作系统、获取客户端浏览器、获取主机名、获取操作系统、获取系统架构

    说明: 大家直接去对应项目位置找到代码,然后看着复制就行了 1.1、若依(自己写的代码) 项目:https://gitee.com/y_project/RuoYi 子模块:ruoyi-common 所在类:com.ruoyi.common.utils.IpUtils 所在方法:getIpAddr 详细位置:整个方法 1.2、Snowy(借助hutool工具包) 项目:https://gitee.com/xiaonuo

    2024年02月04日
    浏览(48)
  • Unity之获取用户地理位置

    1.1 利用bilibili的api 【未知稳定性】 lua代码  1.2 利用baidu api 【配额超限,需要扩充配额,需要联系官方】 2.1 API: \\\"https://api.ipify.org\\\" 和 心知天气官网“心知天气 - 高精度气象数据 - 天气数据API接口 - 行业气象解决方案” 获取公网IP 根据IP获取地理信息和天气信息,json反解析

    2024年02月14日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包