package utils import ( "encoding/json" "fmt" "git.echol.cn/loser/lckt/global" user2 "git.echol.cn/loser/lckt/model/user" "go.uber.org/zap" "net/http" "strings" "time" ) type ipAdcodeResp struct { Adcode struct { O string `json:"o"` } `json:"adcode"` } func GetIPAdcode(ip string) string { url := fmt.Sprintf("https://api.vore.top/api/IPdata?ip=%s", ip) client := &http.Client{Timeout: 5 * time.Second} resp, err := client.Get(url) if err != nil { return "" } defer resp.Body.Close() var result ipAdcodeResp if err = json.NewDecoder(resp.Body).Decode(&result); err != nil { return "" } return result.Adcode.O } // CheckIPInAdcodes 检测用户IP是否在指定的地区编码范围内 func CheckIPInAdcodes(ipAdcode string) bool { // 查询IP配置 ipCon := user2.IpCheck{} err := global.GVA_DB.First(&ipCon).Error if err != nil { global.GVA_LOG.Error("获取IP配置失败", zap.Error(err)) return false } // 如果IP检测未启用,直接返回true if !ipCon.Status { return true } // 解析允许的地区编码列表 var adcodes []string // 通过逗号分隔 for _, code := range strings.Split(ipCon.Addrs, ",") { trimmed := strings.TrimSpace(code) if trimmed != "" { adcodes = append(adcodes, trimmed) } } lower := strings.ToLower(ipAdcode) for _, code := range adcodes { // 检测是否包含 if strings.Contains(lower, strings.ToLower(code)) { return true } } return false }