main.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "math"
  6. "net"
  7. "net/http"
  8. "strconv"
  9. "strings"
  10. v2net "github.com/v2ray/v2ray-core/common/net"
  11. )
  12. const (
  13. apnicFile = "http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest"
  14. )
  15. func main() {
  16. resp, err := http.Get(apnicFile)
  17. if err != nil {
  18. panic(err)
  19. }
  20. if resp.StatusCode != 200 {
  21. panic(fmt.Errorf("Unexpected status %d", resp.StatusCode))
  22. }
  23. defer resp.Body.Close()
  24. scanner := bufio.NewScanner(resp.Body)
  25. ipNet := v2net.NewIPNet()
  26. for scanner.Scan() {
  27. line := scanner.Text()
  28. line = strings.TrimSpace(line)
  29. parts := strings.Split(line, "|")
  30. if len(parts) < 5 {
  31. continue
  32. }
  33. if strings.ToLower(parts[1]) != "cn" || strings.ToLower(parts[2]) != "ipv4" {
  34. continue
  35. }
  36. ip := parts[3]
  37. count, err := strconv.Atoi(parts[4])
  38. if err != nil {
  39. continue
  40. }
  41. mask := 32 - int(math.Floor(math.Log2(float64(count))+0.5))
  42. cidr := fmt.Sprintf("%s/%d", ip, mask)
  43. _, t, err := net.ParseCIDR(cidr)
  44. if err != nil {
  45. panic(err)
  46. }
  47. ipNet.Add(t)
  48. }
  49. dump := ipNet.Serialize()
  50. fmt.Println("map[uint32]byte {")
  51. for i := 0; i < len(dump); i += 2 {
  52. fmt.Println(dump[i], ": ", dump[i+1], ",")
  53. }
  54. fmt.Println("}")
  55. }