121 lines
3.2 KiB
Go
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
|
|
}
|