mirror of
				https://github.com/oneclickvirt/backtrace.git
				synced 2025-11-04 15:52:37 +08:00 
			
		
		
		
	fix: 请求的缓存结果移动并复用
This commit is contained in:
		
							parent
							
								
									0c7727e3dc
								
							
						
					
					
						commit
						211c724509
					
				@ -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)
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										31
									
								
								bk/utils.go
									
									
									
									
									
								
							
							
						
						
									
										31
									
								
								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版本是否匹配
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user