| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 | 
							- package main
 
- import (
 
- 	"bufio"
 
- 	"fmt"
 
- 	"math"
 
- 	"net"
 
- 	"net/http"
 
- 	"strconv"
 
- 	"strings"
 
- 	v2net "github.com/v2ray/v2ray-core/common/net"
 
- )
 
- const (
 
- 	apnicFile = "http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest"
 
- )
 
- func main() {
 
- 	resp, err := http.Get(apnicFile)
 
- 	if err != nil {
 
- 		panic(err)
 
- 	}
 
- 	if resp.StatusCode != 200 {
 
- 		panic(fmt.Errorf("Unexpected status %d", resp.StatusCode))
 
- 	}
 
- 	defer resp.Body.Close()
 
- 	scanner := bufio.NewScanner(resp.Body)
 
- 	ipNet := v2net.NewIPNet()
 
- 	for scanner.Scan() {
 
- 		line := scanner.Text()
 
- 		line = strings.TrimSpace(line)
 
- 		parts := strings.Split(line, "|")
 
- 		if len(parts) < 5 {
 
- 			continue
 
- 		}
 
- 		if strings.ToLower(parts[1]) != "cn" || strings.ToLower(parts[2]) != "ipv4" {
 
- 			continue
 
- 		}
 
- 		ip := parts[3]
 
- 		count, err := strconv.Atoi(parts[4])
 
- 		if err != nil {
 
- 			continue
 
- 		}
 
- 		mask := 32 - int(math.Floor(math.Log2(float64(count))+0.5))
 
- 		cidr := fmt.Sprintf("%s/%d", ip, mask)
 
- 		_, t, err := net.ParseCIDR(cidr)
 
- 		if err != nil {
 
- 			panic(err)
 
- 		}
 
- 		ipNet.Add(t)
 
- 	}
 
- 	dump := ipNet.Serialize()
 
- 	fmt.Println("map[uint32]byte {")
 
- 	for i := 0; i < len(dump); i += 2 {
 
- 		fmt.Println(dump[i], ": ", dump[i+1], ",")
 
- 	}
 
- 	fmt.Println("}")
 
- }
 
 
  |