Files
dns-server/domain/domain.go
T
Alex Yang f627244b8f 更新
2026-03-30 01:04:46 +08:00

121 lines
3.2 KiB
Go

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
}