fix parse domain status issue

This commit is contained in:
兔子 2024-08-15 15:10:18 +08:00
parent 6a8915039e
commit 83cfd8c5e7
3 changed files with 145 additions and 21 deletions

View File

@ -1,17 +1,12 @@
package whois package whois
import ( import (
"fmt"
"os"
"strings" "strings"
"time" "time"
) )
func parse(domain string, result string) { func parse(domain string, result string) (Result, error) {
os.WriteFile(domain+".txt", []byte(result), 0644)
ext := getExtension(domain) ext := getExtension(domain)
secExt := getExtension(strings.TrimSuffix(domain, "."+ext))
_ = secExt
var data Result var data Result
var err error var err error
switch ext { switch ext {
@ -24,10 +19,7 @@ func parse(domain string, result string) {
default: default:
data, err = commonParser(domain, result) data, err = commonParser(domain, result)
} }
fmt.Println(err) return data, err
fmt.Println(data.domain, data.registerDate, data.expireDate, data.nsServers)
fmt.Println(data.exists, data.statusRaw, data.nsServers)
fmt.Printf("%+v\n%+v\n", data.adminInfo, data.registerInfo)
} }
func commonParser(domain, data string) (Result, error) { func commonParser(domain, data string) (Result, error) {
@ -38,6 +30,7 @@ func commonParser(domain, data string) (Result, error) {
var r, a, t PersonalInfo var r, a, t PersonalInfo
split := strings.Split(data, "\n") split := strings.Split(data, "\n")
statusMap := make(map[string]struct{})
for _, line := range split { for _, line := range split {
line = strings.TrimSpace(line) line = strings.TrimSpace(line)
if !res.exists { if !res.exists {
@ -69,7 +62,10 @@ func commonParser(domain, data string) (Result, error) {
res.registar = strings.TrimSpace(strings.TrimPrefix(line, "Registrar:")) res.registar = strings.TrimSpace(strings.TrimPrefix(line, "Registrar:"))
} }
if strings.HasPrefix(line, "Status:") { if strings.HasPrefix(line, "Status:") {
res.statusRaw = strings.TrimSpace(strings.TrimPrefix(line, "Status:")) statusMap[strings.Split(strings.TrimSpace(strings.TrimPrefix(line, "Status:")), " ")[0]] = struct{}{}
}
if strings.HasPrefix(line, "Domain Status:") {
statusMap[strings.Split(strings.TrimSpace(strings.TrimPrefix(line, "Domain Status:")), " ")[0]] = struct{}{}
} }
if strings.HasPrefix(line, "Name Server:") { if strings.HasPrefix(line, "Name Server:") {
res.nsServers = append(res.nsServers, strings.TrimSpace(strings.TrimPrefix(line, "Name Server:"))) res.nsServers = append(res.nsServers, strings.TrimSpace(strings.TrimPrefix(line, "Name Server:")))
@ -189,6 +185,9 @@ func commonParser(domain, data string) (Result, error) {
t.Email = strings.TrimSpace(strings.TrimPrefix(line, "Tech Email:")) t.Email = strings.TrimSpace(strings.TrimPrefix(line, "Tech Email:"))
} }
} }
for status := range statusMap {
res.statusRaw = append(res.statusRaw, status)
}
res.registerInfo = r res.registerInfo = r
res.adminInfo = a res.adminInfo = a
res.techInfo = t res.techInfo = t
@ -206,6 +205,7 @@ func dotCNParser(domain, data string) (Result, error) {
return res, nil return res, nil
} }
res.exists = true res.exists = true
statusMap := make(map[string]struct{})
split := strings.Split(data, "\n") split := strings.Split(data, "\n")
for _, line := range split { for _, line := range split {
line = strings.TrimSpace(line) line = strings.TrimSpace(line)
@ -226,7 +226,10 @@ func dotCNParser(domain, data string) (Result, error) {
res.registar = strings.TrimSpace(strings.TrimPrefix(line, "Sponsoring Registrar:")) res.registar = strings.TrimSpace(strings.TrimPrefix(line, "Sponsoring Registrar:"))
} }
if strings.HasPrefix(line, "Status:") { if strings.HasPrefix(line, "Status:") {
res.statusRaw = strings.TrimSpace(strings.TrimPrefix(line, "Status:")) statusMap[strings.Split(strings.TrimSpace(strings.TrimPrefix(line, "Status:")), " ")[0]] = struct{}{}
}
if strings.HasPrefix(line, "Domain Status:") {
statusMap[strings.Split(strings.TrimSpace(strings.TrimPrefix(line, "Domain Status:")), " ")[0]] = struct{}{}
} }
if strings.HasPrefix(line, "Name Server:") { if strings.HasPrefix(line, "Name Server:") {
res.nsServers = append(res.nsServers, strings.TrimSpace(strings.TrimPrefix(line, "Name Server:"))) res.nsServers = append(res.nsServers, strings.TrimSpace(strings.TrimPrefix(line, "Name Server:")))
@ -241,6 +244,9 @@ func dotCNParser(domain, data string) (Result, error) {
r.Email = strings.TrimSpace(strings.TrimPrefix(line, "Registrant Contact Email:")) r.Email = strings.TrimSpace(strings.TrimPrefix(line, "Registrant Contact Email:"))
} }
} }
for status := range statusMap {
res.statusRaw = append(res.statusRaw, status)
}
res.registerInfo = r res.registerInfo = r
return res, nil return res, nil
} }
@ -260,6 +266,7 @@ func dotJPParser(domain, data string) (Result, error) {
} }
line = strings.TrimSpace(line) line = strings.TrimSpace(line)
if strings.HasPrefix(line, "[Domain Name]") { if strings.HasPrefix(line, "[Domain Name]") {
res.exists = true
res.nsServers = []string{} res.nsServers = []string{}
res.domain = strings.TrimSpace(strings.TrimPrefix(line, "[Domain Name]")) res.domain = strings.TrimSpace(strings.TrimPrefix(line, "[Domain Name]"))
} }
@ -270,10 +277,10 @@ func dotJPParser(domain, data string) (Result, error) {
res.nsServers = append(res.nsServers, strings.TrimSpace(strings.TrimPrefix(line, "[Name Server]"))) res.nsServers = append(res.nsServers, strings.TrimSpace(strings.TrimPrefix(line, "[Name Server]")))
} }
if strings.HasPrefix(line, "[状態]") { if strings.HasPrefix(line, "[状態]") {
res.statusRaw += strings.TrimSpace(strings.TrimPrefix(line, "[状態]")) res.statusRaw = append(res.statusRaw, strings.TrimSpace(strings.TrimPrefix(line, "[状態]")))
} }
if strings.HasPrefix(line, "[ロック状態]") { if strings.HasPrefix(line, "[ロック状態]") {
res.statusRaw += strings.TrimSpace(strings.TrimPrefix(line, "[ロック状態]")) res.statusRaw = append(res.statusRaw, strings.TrimSpace(strings.TrimPrefix(line, "[ロック状態]")))
} }
if strings.HasPrefix(line, "[登録年月日]") { if strings.HasPrefix(line, "[登録年月日]") {
res.registerDate = parseJPDate(strings.TrimSpace(strings.TrimPrefix(line, "[登録年月日]")), true) res.registerDate = parseJPDate(strings.TrimSpace(strings.TrimPrefix(line, "[登録年月日]")), true)
@ -348,7 +355,7 @@ func dotTWParser(domain, data string) (Result, error) {
res.expireDate = parseCNDate(strings.TrimSpace(strings.TrimSuffix(strings.TrimPrefix(line, "Record expires on"), "(UTC+8)"))) res.expireDate = parseCNDate(strings.TrimSpace(strings.TrimSuffix(strings.TrimPrefix(line, "Record expires on"), "(UTC+8)")))
} }
if strings.HasPrefix(line, "Domain Status:") { if strings.HasPrefix(line, "Domain Status:") {
res.statusRaw = strings.TrimSpace(strings.TrimPrefix(line, "Domain Status:")) res.statusRaw = append(res.statusRaw, strings.TrimSpace(strings.TrimPrefix(line, "Domain Status:")))
} }
if strings.HasPrefix(line, "Domain servers in listed order:") { if strings.HasPrefix(line, "Domain servers in listed order:") {
startNs = true startNs = true

View File

@ -7,5 +7,5 @@ import (
func TestWhois(t *testing.T) { func TestWhois(t *testing.T) {
c := NewClient() c := NewClient()
fmt.Println(c.Whois("b612.com")) fmt.Println(c.Whois("b612.in"))
} }

127
whois.go
View File

@ -19,6 +19,60 @@ const (
asnPrefix = "AS" asnPrefix = "AS"
) )
const (
StatusAddPeriod = "AddPeriod"
StatusAutoRenewPeriod = "AutoRenewPeriod"
StatusInActive = "Inactive"
StatusOk = "Ok"
StatusPendingDelete = "PendingDelete"
StatusPendingCreate = "PendingCreate"
StatusPendingRenew = "PendingRenew"
StatusPendingTransfer = "PendingTransfer"
StatusPendingRestore = "PendingRestore"
StatusPendingUpdate = "PendingUpdate"
StatusRedemptionPeriod = "RedemptionPeriod"
StatusRenewPeriod = "RenewPeriod"
StatusServerDeleteProhibited = "ServerDeleteProhibited"
StatusServerHold = "ServerHold"
StatusServerRenewProhibited = "ServerRenewProhibited"
StatusServerTransferProhibited = "ServerTransferProhibited"
StatusServerUpdateProhibited = "ServerUpdateProhibited"
StatusTransferPeriod = "TransferPeriod"
StatusClientDeleteProhibited = "ClientDeleteProhibited"
StatusClientHold = "ClientHold"
StatusClientRenewProhibited = "ClientRenewProhibited"
StatusClientTransferProhibited = "ClientTransferProhibited"
StatusClientUpdateProhibited = "ClientUpdateProhibited"
)
/*
var statusMap = map[string]string{
"addPeriod": StatusAddPeriod,
"autoRenewPeriod": StatusAutoRenewPeriod,
"inactive": StatusInActive,
"ok": StatusOk,
"pendingDelete": StatusPendingDelete,
"pendingCreate": StatusPendingCreate,
"pendingRenew": StatusPendingRenew,
"pendingTransfer": StatusPendingTransfer,
"pendingRestore": StatusPendingRestore,
"pendingUpdate": StatusPendingUpdate,
"redemptionPeriod": StatusRedemptionPeriod,
"renewPeriod": StatusRenewPeriod,
"serverDeleteProhibited": StatusServerDeleteProhibited,
"serverHold": StatusServerHold,
"serverRenewProhibited": StatusServerRenewProhibited,
"serverTransferProhibited": StatusServerTransferProhibited,
"serverUpdateProhibited": StatusServerUpdateProhibited,
"transferPeriod": StatusTransferPeriod,
"clientDeleteProhibited": StatusClientDeleteProhibited,
"clientHold": StatusClientHold,
"clientRenewProhibited": StatusClientRenewProhibited,
"clientTransferProhibited": StatusClientTransferProhibited,
"clientUpdateProhibited": StatusClientUpdateProhibited,
}
*/
// DefaultClient is default whois client // DefaultClient is default whois client
var DefaultClient = NewClient() var DefaultClient = NewClient()
@ -55,7 +109,7 @@ type Result struct {
registerDate time.Time registerDate time.Time
updateDate time.Time updateDate time.Time
expireDate time.Time expireDate time.Time
statusRaw string statusRaw []string
nsServers []string nsServers []string
dnssec string dnssec string
whoisSer string whoisSer string
@ -65,6 +119,70 @@ type Result struct {
techInfo PersonalInfo techInfo PersonalInfo
} }
func (r Result) Exists() bool {
return r.exists
}
func (r Result) Domain() string {
return r.domain
}
func (r Result) DomainID() string {
return r.domainID
}
func (r Result) RawData() string {
return r.rawData
}
func (r Result) Registar() string {
return r.registar
}
func (r Result) RegisterDate() time.Time {
return r.registerDate
}
func (r Result) UpdateDate() time.Time {
return r.updateDate
}
func (r Result) ExpireDate() time.Time {
return r.expireDate
}
func (r Result) Status() []string {
return r.statusRaw
}
func (r Result) NsServers() []string {
return r.nsServers
}
func (r Result) Dnssec() string {
return r.dnssec
}
func (r Result) WhoisSer() string {
return r.whoisSer
}
func (r Result) IanaID() string {
return r.ianaID
}
func (r Result) RegisterInfo() PersonalInfo {
return r.registerInfo
}
func (r Result) AdminInfo() PersonalInfo {
return r.adminInfo
}
func (r Result) TechInfo() PersonalInfo {
return r.techInfo
}
// NewClient returns new whois client // NewClient returns new whois client
func NewClient() *Client { func NewClient() *Client {
return &Client{ return &Client{
@ -75,13 +193,12 @@ func NewClient() *Client {
} }
} }
func (c *Client) Whois(domain string, servers ...string) (string, error) { func (c *Client) Whois(domain string, servers ...string) (Result, error) {
data, err := c.whois(domain) data, err := c.whois(domain)
if err != nil { if err != nil {
return data, err return Result{}, err
} }
parse(domain, data) return parse(domain, data)
return "", err
} }
func (c *Client) whois(domain string, servers ...string) (result string, err error) { func (c *Client) whois(domain string, servers ...string) (result string, err error) {