package domain import ( "encoding/json" "fmt" "os" "strings" ) // DomainInfo 域名信息结构体 type DomainInfo struct { Domain string `json:"domain"` Category string `json:"category"` Company string `json:"company"` } // GetDomainInfo 从域名信息数据库中查询域名信息 func GetDomainInfo(domain string) (DomainInfo, error) { // 读取域名信息文件 data, err := os.ReadFile("./static/domain-info/domains/domain-info.json") if err != nil { return DomainInfo{}, err } // 解析JSON数据 var domainDB struct { Categories map[string]string `json:"categories"` Domains map[string]map[string]interface{} `json:"domains"` } if err := json.Unmarshal(data, &domainDB); err != nil { return DomainInfo{}, err } // 遍历域名数据库,查找匹配的域名 for _, services := range domainDB.Domains { // 获取公司级别的 company 字段 companyLevelCompany := "" if companyData, ok := services["company"].(string); ok { companyLevelCompany = companyData } for serviceName, serviceInfo := range services { if serviceName == "company" { continue } // 检查 URL 字段 if urlData, ok := serviceInfo.(map[string]interface{}); ok { if urlField, ok := urlData["url"]; ok { switch v := urlField.(type) { case string: // 单个 URL if strings.Contains(v, domain) { categoryId := "" if cid, ok := urlData["categoryId"]; ok { if cidStr, ok := cid.(float64); ok { categoryId = fmt.Sprintf("%.0f", cidStr) } } categoryName := "未知" if categoryId != "" { if name, ok := domainDB.Categories[categoryId]; ok { categoryName = name } } // 确定公司名:优先使用服务级别的 company 字段,否则使用公司级别的 company 字段 itemCompany := companyLevelCompany if serviceCompany, ok := urlData["company"].(string); ok { itemCompany = serviceCompany } return DomainInfo{ Domain: domain, Category: categoryName, Company: itemCompany, }, nil } case map[string]interface{}: // 多个 URL for _, url := range v { if urlStr, ok := url.(string); ok { if strings.Contains(urlStr, domain) { categoryId := "" if cid, ok := urlData["categoryId"]; ok { if cidStr, ok := cid.(float64); ok { categoryId = fmt.Sprintf("%.0f", cidStr) } } categoryName := "未知" if categoryId != "" { if name, ok := domainDB.Categories[categoryId]; ok { categoryName = name } } // 确定公司名:优先使用服务级别的 company 字段,否则使用公司级别的 company 字段 itemCompany := companyLevelCompany if serviceCompany, ok := urlData["company"].(string); ok { itemCompany = serviceCompany } return DomainInfo{ Domain: domain, Category: categoryName, Company: itemCompany, }, nil } } } } } } } } // 如果没有找到匹配的域名,返回默认信息 return DomainInfo{ Domain: domain, Category: "未知", Company: "未知", }, nil }