这个是实现从本地文件读取IP,过滤之后查询IP归属地和运营商的
本地文件部分信息如下
1.0.1.0/24
1.0.2.0/23
1.0.8.0/21
1.0.32.0/19
1.1.0.0/24
1.1.2.0/23
1.1.4.0/22
1.1.8.0/21
1.1.16.0/20
1.1.32.0/19
// 读取文件并查询IP归属地
func (i *impl) ReadAndQuery() string {
f, err := os.Open("china_ip_list") //文件路径+文件名构成(推荐绝对路径)
if err != nil {
fmt.Println("读取文件失败")
fmt.Println("read file fail", err)
return ""
}
defer f.Close()
fd, err := ioutil.ReadAll(f)
if err != nil {
fmt.Println("read to fd fail", err)
return ""
}
readStr := string(fd)
readStr = strings.Replace(readStr, "\n", "/", -1) // 换行换成/
strs := strings.Split(readStr, "/") // 以/分割,返回的数据不包括/
var lock sync.Mutex
var wg sync.WaitGroup
wg.Add(len(strs))
maxGoNum := 20
nowGoCount := 0
for _, v := range strs {
for {
lock.Lock()
nowGoNum := nowGoCount
lock.Unlock()
if nowGoNum > maxGoNum {
time.Sleep(time.Duration(2) * time.Second)
} else {
break
}
}
lock.Lock()
nowGoCount++
lock.Unlock()
go func(v string) {
if strings.Count(v, ".") == 3 {
addr, isp := GetNeceInfo(v)
warehouseIP := &domain.WarehouseIPs{
IP: v,
Address: addr,
ISP: isp,
}
fmt.Printf("ip: %s, 地址: %s, ISP: %s\n", v, addr, isp)
lock.Lock()
warehouseIPs = append(warehouseIPs, warehouseIP)
lock.Unlock()
}
lock.Lock()
nowGoCount--
lock.Unlock()
wg.Done()
}(v)
}
wg.Wait()
return ""
}
// GetNeceInfo : 得到IP的地址和运营商
func GetNeceInfo(ip string) (addr, isp string) {
data, err := GetInfoOfIP(ip)
if err != nil {
return addr, isp
}
info, ok := data["data"]
if ok {
var allInfoStr []string
inputByte, _ := json.Marshal(info)
_ = json.Unmarshal(inputByte, &allInfoStr)
addr = allInfoStr[1]
isp = allInfoStr[2]
}
return addr, isp
}
// GetInfoOfIP : 获取ip所有资料
func GetInfoOfIP(ip string) (map[string]interface{}, error) {
var data map[string]interface{}
var resp *resty.Response
var err error
path := "" + ip // 这里需要给一个查询IP地址的接口
client := resty.New()
resp, err = client.R().
SetHeader("Accept", "application/json").
SetResult(&data).
Get(path)
if err != nil {
return nil, err
}
if resp == nil {
return nil, code.New("调取接口失败")
}
if resp.StatusCode() != 200 {
return nil, code.New("调取第三方接口失败")
}
return data, nil
}
版权声明:本文为ppthr原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。