mirror of
https://github.com/TeaOSLab/EdgeAPI.git
synced 2025-11-25 00:10:26 +08:00
优化DNSPod和Alidns相关代码
This commit is contained in:
@@ -4,6 +4,7 @@ import (
|
||||
"crypto/tls"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnspod"
|
||||
"github.com/TeaOSLab/EdgeAPI/internal/dnsclients/dnstypes"
|
||||
"github.com/TeaOSLab/EdgeAPI/internal/utils/numberutils"
|
||||
"github.com/iwind/TeaGo/maps"
|
||||
@@ -30,6 +31,8 @@ var dnsPodHTTPClient = &http.Client{
|
||||
}
|
||||
|
||||
// DNSPodProvider DNSPod服务商
|
||||
// TODO 考虑支持线路ID
|
||||
// TODO 支持自定义线路
|
||||
type DNSPodProvider struct {
|
||||
BaseProvider
|
||||
|
||||
@@ -59,28 +62,23 @@ func (this *DNSPodProvider) GetDomains() (domains []string, err error) {
|
||||
var size = 3000
|
||||
|
||||
for {
|
||||
domainsResp, err := this.post("/Domain.List", map[string]string{
|
||||
var resp = new(dnspod.DomainListResponse)
|
||||
|
||||
err := this.doAPI("/Domain.List", map[string]string{
|
||||
"offset": numberutils.FormatInt(offset),
|
||||
"length": numberutils.FormatInt(size),
|
||||
})
|
||||
}, resp)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
offset += size
|
||||
|
||||
var domainsSlice = domainsResp.GetSlice("domains")
|
||||
if len(domainsSlice) == 0 {
|
||||
break
|
||||
}
|
||||
|
||||
for _, domain := range domainsSlice {
|
||||
domainMap := maps.NewMap(domain)
|
||||
domains = append(domains, domainMap.GetString("name"))
|
||||
for _, domain := range resp.Domains {
|
||||
domains = append(domains, domain.Name)
|
||||
}
|
||||
|
||||
// 检查是否到头
|
||||
var info = domainsResp.GetMap("info")
|
||||
var recordTotal = info.GetInt("all_total")
|
||||
var recordTotal = resp.Info.AllTotal
|
||||
if offset >= recordTotal {
|
||||
break
|
||||
}
|
||||
@@ -93,33 +91,31 @@ func (this *DNSPodProvider) GetRecords(domain string) (records []*dnstypes.Recor
|
||||
var offset = 0
|
||||
var size = 3000
|
||||
for {
|
||||
recordsResp, err := this.post("/Record.List", map[string]string{
|
||||
var resp = new(dnspod.RecordListResponse)
|
||||
err := this.doAPI("/Record.List", map[string]string{
|
||||
"domain": domain,
|
||||
"offset": numberutils.FormatInt(offset),
|
||||
"length": numberutils.FormatInt(size),
|
||||
})
|
||||
}, resp)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
offset += size
|
||||
|
||||
// 记录
|
||||
var recordSlice = recordsResp.GetSlice("records")
|
||||
for _, record := range recordSlice {
|
||||
recordMap := maps.NewMap(record)
|
||||
for _, record := range resp.Records {
|
||||
records = append(records, &dnstypes.Record{
|
||||
Id: recordMap.GetString("id"),
|
||||
Name: recordMap.GetString("name"),
|
||||
Type: recordMap.GetString("type"),
|
||||
Value: recordMap.GetString("value"),
|
||||
Route: recordMap.GetString("line"),
|
||||
TTL: recordMap.GetInt32("ttl"),
|
||||
Id: types.String(record.Id),
|
||||
Name: record.Name,
|
||||
Type: record.Type,
|
||||
Value: record.Value,
|
||||
Route: record.Line,
|
||||
TTL: types.Int32(record.TTL),
|
||||
})
|
||||
}
|
||||
|
||||
// 检查是否到头
|
||||
var info = recordsResp.GetMap("info")
|
||||
var recordTotal = info.GetInt("record_total")
|
||||
var recordTotal = types.Int(resp.Info.RecordTotal)
|
||||
if offset >= recordTotal {
|
||||
break
|
||||
}
|
||||
@@ -129,24 +125,25 @@ func (this *DNSPodProvider) GetRecords(domain string) (records []*dnstypes.Recor
|
||||
|
||||
// GetRoutes 读取线路数据
|
||||
func (this *DNSPodProvider) GetRoutes(domain string) (routes []*dnstypes.Route, err error) {
|
||||
infoResp, err := this.post("/Domain.Info", map[string]string{
|
||||
var domainInfoResp = new(dnspod.DomainInfoResponse)
|
||||
err = this.doAPI("/Domain.Info", map[string]string{
|
||||
"domain": domain,
|
||||
})
|
||||
}, domainInfoResp)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
domainInfo := infoResp.GetMap("domain")
|
||||
grade := domainInfo.GetString("grade")
|
||||
var grade = domainInfoResp.Domain.Grade
|
||||
|
||||
linesResp, err := this.post("/Record.Line", map[string]string{
|
||||
var linesResp = new(dnspod.RecordLineResponse)
|
||||
err = this.doAPI("/Record.Line", map[string]string{
|
||||
"domain": domain,
|
||||
"domain_grade": grade,
|
||||
})
|
||||
}, linesResp)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
lines := linesResp.GetSlice("lines")
|
||||
var lines = linesResp.Lines
|
||||
if len(lines) == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
@@ -196,8 +193,13 @@ func (this *DNSPodProvider) AddRecord(domain string, newRecord *dnstypes.Record)
|
||||
if newRecord.TTL > 0 && newRecord.TTL <= DNSPodMaxTTL {
|
||||
args["ttl"] = types.String(newRecord.TTL)
|
||||
}
|
||||
_, err := this.post("/Record.Create", args)
|
||||
return this.WrapError(err, domain, newRecord)
|
||||
var resp = new(dnspod.RecordCreateResponse)
|
||||
err := this.doAPI("/Record.Create", args, resp)
|
||||
if err != nil {
|
||||
return this.WrapError(err, domain, newRecord)
|
||||
}
|
||||
newRecord.Id = types.String(resp.Record.Id)
|
||||
return nil
|
||||
}
|
||||
|
||||
// UpdateRecord 修改记录
|
||||
@@ -225,7 +227,8 @@ func (this *DNSPodProvider) UpdateRecord(domain string, record *dnstypes.Record,
|
||||
if newRecord.TTL > 0 && newRecord.TTL <= DNSPodMaxTTL {
|
||||
args["ttl"] = types.String(newRecord.TTL)
|
||||
}
|
||||
_, err := this.post("/Record.Modify", args)
|
||||
var resp = new(dnspod.RecordModifyResponse)
|
||||
err := this.doAPI("/Record.Modify", args, resp)
|
||||
return this.WrapError(err, domain, newRecord)
|
||||
}
|
||||
|
||||
@@ -235,16 +238,17 @@ func (this *DNSPodProvider) DeleteRecord(domain string, record *dnstypes.Record)
|
||||
return errors.New("invalid record to delete")
|
||||
}
|
||||
|
||||
_, err := this.post("/Record.Remove", map[string]string{
|
||||
var resp = new(dnspod.RecordRemoveResponse)
|
||||
err := this.doAPI("/Record.Remove", map[string]string{
|
||||
"domain": domain,
|
||||
"record_id": record.Id,
|
||||
})
|
||||
}, resp)
|
||||
|
||||
return this.WrapError(err, domain, record)
|
||||
}
|
||||
|
||||
// 发送请求
|
||||
func (this *DNSPodProvider) post(path string, params map[string]string) (maps.Map, error) {
|
||||
func (this *DNSPodProvider) doAPI(path string, params map[string]string, respPtr dnspod.ResponseInterface) error {
|
||||
var apiHost = "https://dnsapi.cn"
|
||||
var lang = "cn"
|
||||
if this.isInternational() { // 国际版
|
||||
@@ -263,7 +267,7 @@ func (this *DNSPodProvider) post(path string, params map[string]string) (maps.Ma
|
||||
|
||||
req, err := http.NewRequest(http.MethodPost, apiHost+path, strings.NewReader(query.Encode()))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return errors.New("create request failed: " + err.Error())
|
||||
}
|
||||
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
||||
req.Header.Set("User-Agent", "GoEdge-Client/1.0.0 (iwind.liu@gmail.com)")
|
||||
@@ -271,27 +275,25 @@ func (this *DNSPodProvider) post(path string, params map[string]string) (maps.Ma
|
||||
|
||||
resp, err := dnsPodHTTPClient.Do(req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return err
|
||||
}
|
||||
defer func() {
|
||||
_ = resp.Body.Close()
|
||||
}()
|
||||
body, err := io.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return err
|
||||
}
|
||||
var m = maps.Map{}
|
||||
err = json.Unmarshal(body, &m)
|
||||
err = json.Unmarshal(body, &respPtr)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return err
|
||||
}
|
||||
var status = m.GetMap("status")
|
||||
var code = status.GetString("code")
|
||||
if code != "1" {
|
||||
return nil, errors.New("API response error: code: " + code + ", message: " + status.GetString("message"))
|
||||
if !respPtr.IsOk() {
|
||||
code, message := respPtr.LastError()
|
||||
return errors.New("API response error: code: " + code + ", message: " + message)
|
||||
}
|
||||
|
||||
return m, nil
|
||||
return nil
|
||||
}
|
||||
|
||||
// DefaultRoute 默认线路
|
||||
|
||||
Reference in New Issue
Block a user