geoip.go 960 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. package proxy
  2. import (
  3. "log"
  4. "net"
  5. "os"
  6. "github.com/oschwald/geoip2-golang"
  7. )
  8. var geoIp GeoIP
  9. func InitGeoIpDB() {
  10. geoIp = NewGeoIP("assets/GeoLite2-City.mmdb")
  11. }
  12. // GeoIP2
  13. type GeoIP struct {
  14. db *geoip2.Reader
  15. }
  16. // new geoip from db file
  17. func NewGeoIP(filePath string) (geoip GeoIP) {
  18. // 判断文件是否存在
  19. _, err := os.Stat(filePath)
  20. if err != nil && os.IsNotExist(err) {
  21. log.Println("文件不存在,请自行下载 Geoip2 City库,并保存在", filePath)
  22. os.Exit(1)
  23. } else {
  24. db, err := geoip2.Open(filePath)
  25. if err != nil {
  26. log.Fatal(err)
  27. }
  28. geoip = GeoIP{db: db}
  29. }
  30. return
  31. }
  32. // find ip info
  33. func (g GeoIP) Find(ipORdomain string) (ip, country string, err error) {
  34. ips, err := net.LookupIP(ipORdomain)
  35. if err != nil {
  36. return "", "", err
  37. }
  38. ipData := net.ParseIP(ips[0].String())
  39. record, err := g.db.City(ipData)
  40. if err != nil {
  41. return "", "", err
  42. }
  43. return ips[0].String(), record.Country.IsoCode, nil
  44. }