查询IP归属地以及运营商

这个是实现从本地文件读取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版权协议,转载请附上原文出处链接和本声明。