openwrt-ddns-namesilo/subdomain_dns_info_fetcher.go
2025-02-07 16:39:02 +08:00

96 lines
2.4 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
import (
"encoding/json"
"fmt"
"io"
"log"
"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 {
log.Println("获取 DNS 记录失败:", err)
return "NULL"
}
// 打印完整 JSON 数据
_, err = json.MarshalIndent(response, "", " ")
if err != nil {
log.Println("JSON 格式化失败:", err)
return "NULL"
}
// 只获取指定子域名的信息
for _, record := range response.Reply.ResourceRecords {
if record.Host == Subdomain {
log.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"
}