学习笔记:自制查询IP归属地小应用

作者分享自制查询IP归属地小应用的过程,使用GitHub上的免费离线IP库,通过Go语言编写Demo,并增加去重、排序功能以处理流量日志。

技术工具AI

阿飞 2022-03-06 21:17

一个学习笔记

最近在捣鼓一个需求,找出访问海外的业务。我第一反应就是从流量里捞取目标地址,然后检查IP是否为海外。

那么如何知道一个IP地址的归属地呢?我们可以通过ip138.com查询,但挨个查显然不现实,我也没钱买他们的付费服务。

于是,聪明的我从GitHub上找了一个免费的、可升级的数据库做本地离线查询。

下载地址:

https://github.com/hezhizheng/go-ip2region

启动起来是这个样子:

./go-ip2region_windows_amd64.exe -h

Usage of D:\go-ip2region\go-ip2region_windows_amd64.exe:

-d string

    仅用于下载最新的ip地址库,保存在当前目录 (default "0")

-p string

    本地监听的端口 (default "9090")

 // 没有IP地址库会自动下载,保存在当前目录

./go-ip2region_windows_amd64.exe

// 没有指定IP会获取当前客户端IP

curl http://127.0.0.1:9090

curl http://127.0.0.1:9090?ip=59.42.37.186

// 返回数据格式

{

"code": 200,

"msg": "",

"data": {

    "ip": "59.42.37.186",

    "country": "中国",

    "province": "广东",

    "city": "广州",

    "county": "",

    "region": "亚洲",

    "isp": "电信"

}

}

有了这个好东西之后,我们就能够直接开搞了。我写了一段Demo。

package main

import (

“encoding/json”

“fmt”

“io/ioutil”

“net/http”

)

//定义json结构

type IPinfo struct {

Code int `json:“code”`

Msg string `json:“msg”`

Data struct {

IP string \`json:"ip"\`

Country string \`json:"country"\`

Province string \`json:"province"\`

City string \`json:"city"\`

County string \`json:"county"\`

Region string \`json:"region"\`

Isp string \`json:"isp"\`

} `json:“data”`

}

func main() {

ipquery := “42.193.103.52” //要查询的IP地址

url := “http://localhost:9090?ip=

response, err := http.Get(url + ipquery)

if err != nil {

fmt.Println("The site is down")

}

body, _ := ioutil.ReadAll(response.Body)

var IP_Info IPinfo

err = json.Unmarshal(body, &IP_Info)

if err != nil{

fmt.Printf("The error is %+v \\n", err)

}

fmt.Printf(“The IP %v is from %v \n\n”, IP_Info.Data.IP, IP_Info.Data.Country)

}

最终运行效果如下:

后来,又增加了去重、排序等功能,让程序能读更大的流量日志文件,这样就能得到自己最想要的结果了。

示例如下:

全文完,笔芯❤️


**作者:**阿飞,十余年来一直混迹于信息安全行业,扛过设备,卖过服务,做过审计,查过黑客,反过欺诈,岁月神偷带走了我的苹果肌,留下了一肚子的瘫软,貌似我将要成为一个油腻的中年男人,不过依然对世界充满好奇。

阅读原文

跳转微信打开