95 lines
2.4 KiB
Go
95 lines
2.4 KiB
Go
|
package main
|
|||
|
|
|||
|
import (
|
|||
|
"encoding/json"
|
|||
|
"fmt"
|
|||
|
"io"
|
|||
|
"net/http"
|
|||
|
)
|
|||
|
|
|||
|
// NameSilo API 响应结构
|
|||
|
type NameSiloAPIResponse struct {
|
|||
|
Request struct {
|
|||
|
Operation string `json:"operation"`
|
|||
|
IP string `json:"ip"`
|
|||
|
} `json:"request"`
|
|||
|
Reply struct {
|
|||
|
Code int `json:"code"`
|
|||
|
Detail string `json:"detail"`
|
|||
|
ResourceRecords []struct {
|
|||
|
RecordID string `json:"record_id"`
|
|||
|
Type string `json:"type"`
|
|||
|
Host string `json:"host"`
|
|||
|
Value string `json:"value"`
|
|||
|
TTL string `json:"ttl"`
|
|||
|
Distance json.RawMessage `json:"distance"` // 兼容数字和字符串
|
|||
|
} `json:"resource_record"`
|
|||
|
} `json:"reply"`
|
|||
|
}
|
|||
|
|
|||
|
// 解析 distance,兼容数字和字符串
|
|||
|
func parseDistance(raw json.RawMessage) string {
|
|||
|
var str string
|
|||
|
if err := json.Unmarshal(raw, &str); err == nil {
|
|||
|
return str
|
|||
|
}
|
|||
|
var num int
|
|||
|
if err := json.Unmarshal(raw, &num); err == nil {
|
|||
|
return fmt.Sprintf("%d", num)
|
|||
|
}
|
|||
|
return "0"
|
|||
|
}
|
|||
|
|
|||
|
// RetrieveDNSRecords 使用 Namesilo API 获取指定域名的所有 DNS 记录
|
|||
|
func RetrieveDNSRecords(apiKey, domain string) (*NameSiloAPIResponse, error) {
|
|||
|
url := fmt.Sprintf("https://www.namesilo.com/api/dnsListRecords?version=1&type=json&key=%s&domain=%s", apiKey, domain)
|
|||
|
|
|||
|
resp, err := http.Get(url)
|
|||
|
if err != nil {
|
|||
|
return nil, err
|
|||
|
}
|
|||
|
defer resp.Body.Close()
|
|||
|
|
|||
|
body, err := io.ReadAll(resp.Body)
|
|||
|
if err != nil {
|
|||
|
return nil, err
|
|||
|
}
|
|||
|
|
|||
|
var apiResponse NameSiloAPIResponse
|
|||
|
if err := json.Unmarshal(body, &apiResponse); err != nil {
|
|||
|
return nil, err
|
|||
|
}
|
|||
|
|
|||
|
return &apiResponse, nil
|
|||
|
}
|
|||
|
|
|||
|
// FetchSubdomainRecord 获取指定子域名的 DNS 记录信息
|
|||
|
func FetchSubdomainRecord(key string, domain string, Subdomain string) string {
|
|||
|
|
|||
|
// 获取 DNS 记录
|
|||
|
response, err := RetrieveDNSRecords(key, domain)
|
|||
|
if err != nil {
|
|||
|
fmt.Println("获取 DNS 记录失败:", err)
|
|||
|
return "NULL"
|
|||
|
}
|
|||
|
|
|||
|
// 打印完整 JSON 数据
|
|||
|
_, err = json.MarshalIndent(response, "", " ")
|
|||
|
if err != nil {
|
|||
|
fmt.Println("JSON 格式化失败:", err)
|
|||
|
return "NULL"
|
|||
|
}
|
|||
|
|
|||
|
// 只获取指定子域名的信息
|
|||
|
for _, record := range response.Reply.ResourceRecords {
|
|||
|
if record.Host == Subdomain {
|
|||
|
fmt.Printf("RecordID: %s, Host: %s, Type: %s, Value: %s, TTL: %s, Distance: %s\n",
|
|||
|
record.RecordID, record.Host, record.Type, record.Value, record.TTL, parseDistance(record.Distance))
|
|||
|
|
|||
|
return record.RecordID
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return "NULL"
|
|||
|
}
|