2024年Go最全Golang — 根据IP获取地理位置信息_golang geoip(1),血与泪的总结
{region: 中国|0|浙江省|温州市|电信, took: 70.8846ms}域名的ip:20.205.243.166。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
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地理位置库`。
1. 注册
地址:<https://www.maxmind.com/en/geolite2/signup>,除了邮箱外,其他都不需要真实信息。
2. 登录
3. 下载最新的`IP地理位置库`
登陆后点击 **Download Databases**进入下载选择页面
![在这里插入图片描述](https://img-blog.csdnimg.cn/8f5e785546574ae4ad7d9c9740977daf.png)
4. 下载库文件
maxmind提供了六种免费的数据库,有`mmdb`【推荐】,也有`csv`格式。你也可以全部下载下来看看。
**ASN数据库**
从图中可以看到有些数据库的标题后面写着“ASN”三个字母,这个ASN的指的就是ip-运营商信息的数据库。
**mmdb数据库**
`mmdb`是`maxmind`自己的一种二进制数据库格式,它提供较快的ip查询速度。
这里我们只下载不是`CSV格式`的库文件即可,即只下载红色圈起来的,右侧是下载按钮。
**注意**:`MAXMIND`会记录下载,所以不要反复下载,以免被禁。
![在这里插入图片描述](https://img-blog.csdnimg.cn/37fd8847dc934d2d9f15b54be9b32dab.png)
5. 库文件
* GeoLite2-ASN\_20230505.tar.gz
* GeoLite2-City\_20230505.tar.gz
* GeoLite2-Country\_20230505.tar.gz
解压后都是**mmdb数据库**类型,具体差别自己测试吧。
6. 使用
* 下载`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)
}
结果:
![img](https://img-blog.csdnimg.cn/img_convert/f0a712055b02baeb154591bfe462ae54.png)
![img](https://img-blog.csdnimg.cn/img_convert/ff180b90a5205e14e9b1c31e199df61f.png)
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618658159)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618658159)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
更多推荐
所有评论(0)