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
import (
"fmt"
"os"
"strings"
"time"
)
func parse(domain string, result string) {
os.WriteFile(domain+".txt", []byte(result), 0644)
func parse(domain string, result string) (Result, error) {
ext := getExtension(domain)
secExt := getExtension(strings.TrimSuffix(domain, "."+ext))
_ = secExt
var data Result
var err error
switch ext {
@ -24,10 +19,7 @@ func parse(domain string, result string) {
default:
data, err = commonParser(domain, result)
}
fmt.Println(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)
return data, err
}
func commonParser(domain, data string) (Result, error) {
@ -38,6 +30,7 @@ func commonParser(domain, data string) (Result, error) {
var r, a, t PersonalInfo
split := strings.Split(data, "\n")
statusMap := make(map[string]struct{})
for _, line := range split {
line = strings.TrimSpace(line)
if !res.exists {
@ -69,7 +62,10 @@ func commonParser(domain, data string) (Result, error) {
res.registar = strings.TrimSpace(strings.TrimPrefix(line, "Registrar:"))
}
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:") {
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:"))
}
}
for status := range statusMap {
res.statusRaw = append(res.statusRaw, status)
}
res.registerInfo = r
res.adminInfo = a
res.techInfo = t
@ -206,6 +205,7 @@ func dotCNParser(domain, data string) (Result, error) {
return res, nil
}
res.exists = true
statusMap := make(map[string]struct{})
split := strings.Split(data, "\n")
for _, line := range split {
line = strings.TrimSpace(line)
@ -226,7 +226,10 @@ func dotCNParser(domain, data string) (Result, error) {
res.registar = strings.TrimSpace(strings.TrimPrefix(line, "Sponsoring Registrar:"))
}
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:") {
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:"))
}
}
for status := range statusMap {
res.statusRaw = append(res.statusRaw, status)
}
res.registerInfo = r
return res, nil
}
@ -260,6 +266,7 @@ func dotJPParser(domain, data string) (Result, error) {
}
line = strings.TrimSpace(line)
if strings.HasPrefix(line, "[Domain Name]") {
res.exists = true
res.nsServers = []string{}
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]")))
}
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, "[ロック状態]") {
res.statusRaw += strings.TrimSpace(strings.TrimPrefix(line, "[ロック状態]"))
res.statusRaw = append(res.statusRaw, strings.TrimSpace(strings.TrimPrefix(line, "[ロック状態]")))
}
if strings.HasPrefix(line, "[登録年月日]") {
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)")))
}
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:") {
startNs = true

View File

@ -7,5 +7,5 @@ import (
func TestWhois(t *testing.T) {
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"
)
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
var DefaultClient = NewClient()
@ -55,7 +109,7 @@ type Result struct {
registerDate time.Time
updateDate time.Time
expireDate time.Time
statusRaw string
statusRaw []string
nsServers []string
dnssec string
whoisSer string
@ -65,6 +119,70 @@ type Result struct {
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
func NewClient() *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)
if err != nil {
return data, err
return Result{}, err
}
parse(domain, data)
return "", err
return parse(domain, data)
}
func (c *Client) whois(domain string, servers ...string) (result string, err error) {