From 211c72450953c428b259b982b50440a7aefb8f70 Mon Sep 17 00:00:00 2001 From: spiritlhl <103393591+spiritLHLS@users.noreply.github.com> Date: Fri, 11 Apr 2025 14:15:20 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=AF=B7=E6=B1=82=E7=9A=84=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E7=BB=93=E6=9E=9C=E7=A7=BB=E5=8A=A8=E5=B9=B6=E5=A4=8D?= =?UTF-8?q?=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bk/backtrace.go | 7 +++++++ bk/utils.go | 31 ++++--------------------------- model/model.go | 13 +++++++++++++ 3 files changed, 24 insertions(+), 27 deletions(-) diff --git a/bk/backtrace.go b/bk/backtrace.go index dfb6952..d4f20be 100644 --- a/bk/backtrace.go +++ b/bk/backtrace.go @@ -8,6 +8,13 @@ import ( ) func BackTrace(enableIpv6 bool) { + if model.CachedIcmpData == "" || model.ParsedIcmpTargets == nil || time.Since(model.CachedIcmpDataFetchTime) > time.Hour { + model.CachedIcmpData = getData(model.IcmpTargets) + model.CachedIcmpDataFetchTime = time.Now() + if model.CachedIcmpData != "" { + model.ParsedIcmpTargets = parseIcmpTargets(model.CachedIcmpData) + } + } if enableIpv6 { ipv4Count := len(model.Ipv4s) ipv6Count := len(model.Ipv6s) diff --git a/bk/utils.go b/bk/utils.go index c11798b..5d3d2cf 100644 --- a/bk/utils.go +++ b/bk/utils.go @@ -17,19 +17,6 @@ type Result struct { s string } -// IcmpTarget 定义ICMP目标的JSON结构 -type IcmpTarget struct { - Province string `json:"province"` - ISP string `json:"isp"` - IPVersion string `json:"ip_version"` - IPs string `json:"ips"` // IP列表,以逗号分隔 -} - -// 用于缓存ICMP数据的全局变量 -var cachedIcmpData string -var cachedIcmpDataFetchTime time.Time -var parsedIcmpTargets []IcmpTarget - func removeDuplicates(elements []string) []string { encountered := map[string]bool{} // 用于存储已经遇到的元素 result := []string{} // 存储去重后的结果 @@ -80,14 +67,14 @@ func getData(endpoint string) string { } // parseIcmpTargets 解析ICMP目标数据 -func parseIcmpTargets(jsonData string) []IcmpTarget { +func parseIcmpTargets(jsonData string) []model.IcmpTarget { // 确保JSON数据格式正确,如果返回的是数组,需要添加[和] if !strings.HasPrefix(jsonData, "[") { jsonData = "[" + jsonData + "]" } // 如果JSON数据中的对象没有正确用逗号分隔,修复它 jsonData = strings.ReplaceAll(jsonData, "}{", "},{") - var targets []IcmpTarget + var targets []model.IcmpTarget err := json.Unmarshal([]byte(jsonData), &targets) if err != nil { if model.EnableLoger { @@ -100,17 +87,7 @@ func parseIcmpTargets(jsonData string) []IcmpTarget { // tryAlternativeIPs 从IcmpTargets获取备选IP地址 func tryAlternativeIPs(targetName string, ipVersion string) []string { - if cachedIcmpData == "" || parsedIcmpTargets == nil || time.Since(cachedIcmpDataFetchTime) > time.Hour { - cachedIcmpData = getData(model.IcmpTargets) - cachedIcmpDataFetchTime = time.Now() - if cachedIcmpData != "" { - parsedIcmpTargets = parseIcmpTargets(cachedIcmpData) - } - if model.EnableLoger { - Logger.Info("Fetched new ICMP targets data") - } - } - if parsedIcmpTargets == nil || len(parsedIcmpTargets) == 0 { + if model.ParsedIcmpTargets == nil || (model.ParsedIcmpTargets != nil && len(model.ParsedIcmpTargets) == 0) { return nil } // 从目标名称中提取省份和ISP信息 @@ -137,7 +114,7 @@ func tryAlternativeIPs(targetName string, ipVersion string) []string { } // 查找匹配条件的目标 var result []string - for _, target := range parsedIcmpTargets { + for _, target := range model.ParsedIcmpTargets { // 检查省份是否匹配(可能带有"省"字或不带) provinceMatch := (target.Province == targetProvince) || (target.Province == targetProvince+"省") // 检查ISP和IP版本是否匹配 diff --git a/model/model.go b/model/model.go index 85997f3..dce2019 100644 --- a/model/model.go +++ b/model/model.go @@ -1,9 +1,19 @@ package model +import "time" + const BackTraceVersion = "v0.0.5" var EnableLoger = false +// IcmpTarget 定义ICMP目标的JSON结构 +type IcmpTarget struct { + Province string `json:"province"` + ISP string `json:"isp"` + IPVersion string `json:"ip_version"` + IPs string `json:"ips"` // IP列表,以逗号分隔 +} + var ( IcmpTargets = "https://raw.githubusercontent.com/spiritLHLS/icmp_targets/refs/heads/main/nodes.json" CdnList = []string{ @@ -62,4 +72,7 @@ var ( "AS9808": "移动CMI [普通线路]", "AS58453": "移动CMI [普通线路]", } + CachedIcmpData string + CachedIcmpDataFetchTime time.Time + ParsedIcmpTargets []IcmpTarget )