utils.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package main
  2. import (
  3. "errors"
  4. "fmt"
  5. "log"
  6. "reflect"
  7. "strings"
  8. "github.com/honwen/golibs/cip"
  9. "github.com/honwen/ip2loc"
  10. )
  11. var funcs = map[string]interface{}{
  12. "myip": cip.MyIPv4,
  13. "reslove": cip.ResloveIPv4,
  14. }
  15. func ip2locCN(ip string) (str string) {
  16. if strings.Count(ip, `.`) < 3 {
  17. return
  18. }
  19. if loc, err := ip2loc.IP2loc(ip); err != nil {
  20. log.Printf("%+v", err)
  21. } else {
  22. str = fmt.Sprintf("[%s %s %s %s]", loc.CountryName, loc.RegionName, loc.CityName, loc.IspDomain)
  23. for strings.Contains(str, " ]") {
  24. str = strings.ReplaceAll(str, " ]", "]")
  25. }
  26. for strings.Contains(str, " ") {
  27. str = strings.ReplaceAll(str, " ", " ")
  28. }
  29. }
  30. return
  31. }
  32. func Call(m map[string]interface{}, name string, params ...interface{}) (result []reflect.Value, err error) {
  33. f := reflect.ValueOf(m[name])
  34. if len(params) != f.Type().NumIn() {
  35. err = errors.New("The number of params is not adapted.")
  36. return
  37. }
  38. in := make([]reflect.Value, len(params))
  39. for k, param := range params {
  40. in[k] = reflect.ValueOf(param)
  41. }
  42. result = f.Call(in)
  43. return
  44. }
  45. func myip() (ip string) {
  46. if result, err := Call(funcs, "myip"); err == nil {
  47. for _, r := range result {
  48. return r.String()
  49. }
  50. }
  51. return
  52. }
  53. func reslove(domain string) (ip string) {
  54. if result, err := Call(funcs, "reslove", domain); err == nil {
  55. for _, r := range result {
  56. return r.String()
  57. }
  58. }
  59. return
  60. }