2025-05-14 22:00:38 -04:00
|
|
|
package whois
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"bytes"
|
2025-05-15 16:23:59 -04:00
|
|
|
"dehasher/internal/query"
|
2025-05-14 22:00:38 -04:00
|
|
|
"dehasher/internal/sqlite"
|
|
|
|
|
"encoding/json"
|
|
|
|
|
"errors"
|
|
|
|
|
"fmt"
|
|
|
|
|
"go.uber.org/zap"
|
|
|
|
|
"io"
|
|
|
|
|
"net/http"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type DehashedWHOISSearchRequest struct {
|
|
|
|
|
Include []string `json:"include,omitempty"`
|
|
|
|
|
Exclude []string `json:"exclude,omitempty"`
|
|
|
|
|
IPAddress string `json:"ip_address,omitempty"`
|
|
|
|
|
ReverseType string `json:"reverse_type,omitempty"`
|
|
|
|
|
Domain string `json:"domain,omitempty"`
|
|
|
|
|
MXAddress string `json:"mx_address,omitempty"`
|
|
|
|
|
NSAddress string `json:"ns_address,omitempty"`
|
|
|
|
|
SearchType string `json:"search_type,omitempty"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func WhoisSearch(domain, apiKey string) (sqlite.WhoIsLookupResult, error) {
|
|
|
|
|
var whois sqlite.WhoIsLookupResult
|
|
|
|
|
whoisSearchRequest := DehashedWHOISSearchRequest{
|
|
|
|
|
Domain: domain,
|
|
|
|
|
SearchType: "whois",
|
|
|
|
|
}
|
|
|
|
|
reqBody, _ := json.Marshal(whoisSearchRequest)
|
|
|
|
|
req, err := http.NewRequest("POST", "https://api.dehashed.com/v2/whois/search", bytes.NewReader(reqBody))
|
|
|
|
|
if err != nil {
|
|
|
|
|
return whois, err
|
|
|
|
|
}
|
|
|
|
|
req.Header.Set("Content-Type", "application/json")
|
|
|
|
|
req.Header.Set("Dehashed-Api-Key", apiKey)
|
|
|
|
|
res, err := http.DefaultClient.Do(req)
|
|
|
|
|
if res != nil {
|
|
|
|
|
defer res.Body.Close()
|
|
|
|
|
}
|
|
|
|
|
if err != nil {
|
2025-05-15 16:23:59 -04:00
|
|
|
zap.L().Error("whois_search",
|
|
|
|
|
zap.String("message", "failed to perform request"),
|
|
|
|
|
zap.Error(err),
|
|
|
|
|
)
|
2025-05-14 22:00:38 -04:00
|
|
|
return whois, err
|
|
|
|
|
}
|
|
|
|
|
if res == nil {
|
2025-05-15 16:23:59 -04:00
|
|
|
zap.L().Error("whois_search",
|
|
|
|
|
zap.String("message", "response was nil"),
|
|
|
|
|
)
|
2025-05-14 22:00:38 -04:00
|
|
|
return whois, errors.New("response was nil")
|
|
|
|
|
}
|
2025-05-15 16:23:59 -04:00
|
|
|
|
|
|
|
|
// Check for HTTP status code errors
|
|
|
|
|
if res.StatusCode != 200 {
|
|
|
|
|
dhErr := query.GetDehashedError(res.StatusCode)
|
|
|
|
|
fmt.Printf("[%d] API Error message: %s\n", res.StatusCode, dhErr.Error())
|
|
|
|
|
zap.L().Error("whois_search",
|
|
|
|
|
zap.String("message", "received error status code"),
|
|
|
|
|
zap.Int("status_code", res.StatusCode),
|
|
|
|
|
zap.String("error", dhErr.Error()),
|
|
|
|
|
)
|
|
|
|
|
return whois, &dhErr
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-14 22:00:38 -04:00
|
|
|
b, err := io.ReadAll(res.Body)
|
|
|
|
|
if err != nil {
|
2025-05-15 16:23:59 -04:00
|
|
|
zap.L().Error("whois_search",
|
|
|
|
|
zap.String("message", "failed to read response body"),
|
|
|
|
|
zap.Error(err),
|
|
|
|
|
)
|
2025-05-14 22:00:38 -04:00
|
|
|
return whois, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = json.Unmarshal(b, &whois)
|
|
|
|
|
if err != nil {
|
|
|
|
|
zap.L().Error("whois_search",
|
|
|
|
|
zap.String("message", "failed to unmarshal response body"),
|
|
|
|
|
zap.Error(err),
|
|
|
|
|
)
|
|
|
|
|
fmt.Println("Error unmarshalling response body:", err)
|
|
|
|
|
fmt.Println("Response body:", string(b))
|
|
|
|
|
return whois, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return whois, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func WhoisHistory(domain, apiKey string) (sqlite.WhoIsHistory, error) {
|
|
|
|
|
var whois sqlite.WhoIsHistory
|
|
|
|
|
whoisSearchRequest := DehashedWHOISSearchRequest{
|
|
|
|
|
Domain: domain,
|
|
|
|
|
SearchType: "whois-history",
|
|
|
|
|
}
|
|
|
|
|
reqBody, _ := json.Marshal(whoisSearchRequest)
|
|
|
|
|
req, err := http.NewRequest("POST", "https://api.dehashed.com/v2/whois/search", bytes.NewReader(reqBody))
|
|
|
|
|
if err != nil {
|
|
|
|
|
return whois, err
|
|
|
|
|
}
|
|
|
|
|
req.Header.Set("Content-Type", "application/json")
|
|
|
|
|
req.Header.Set("Dehashed-Api-Key", apiKey)
|
|
|
|
|
res, err := http.DefaultClient.Do(req)
|
|
|
|
|
if res != nil {
|
|
|
|
|
zap.L().Info("whois_history",
|
|
|
|
|
zap.String("message", "response was not nil"),
|
|
|
|
|
)
|
|
|
|
|
defer res.Body.Close()
|
|
|
|
|
}
|
|
|
|
|
if err != nil {
|
|
|
|
|
zap.L().Error("whois_history",
|
|
|
|
|
zap.String("message", "failed to perform request"),
|
|
|
|
|
zap.Error(err),
|
|
|
|
|
)
|
|
|
|
|
return whois, err
|
|
|
|
|
}
|
|
|
|
|
if res == nil {
|
|
|
|
|
zap.L().Error("whois_history",
|
|
|
|
|
zap.String("message", "response was nil"),
|
|
|
|
|
)
|
|
|
|
|
return whois, errors.New("response was nil")
|
|
|
|
|
}
|
2025-05-15 16:23:59 -04:00
|
|
|
|
|
|
|
|
// Check for HTTP status code errors
|
|
|
|
|
if res.StatusCode != 200 {
|
|
|
|
|
dhErr := query.GetDehashedError(res.StatusCode)
|
|
|
|
|
fmt.Printf("[%d] API Error message: %s\n", res.StatusCode, dhErr.Error())
|
|
|
|
|
zap.L().Error("whois_history",
|
|
|
|
|
zap.String("message", "received error status code"),
|
|
|
|
|
zap.Int("status_code", res.StatusCode),
|
|
|
|
|
zap.String("error", dhErr.Error()),
|
|
|
|
|
)
|
|
|
|
|
return whois, &dhErr
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-14 22:00:38 -04:00
|
|
|
b, err := io.ReadAll(res.Body)
|
|
|
|
|
if err != nil {
|
|
|
|
|
zap.L().Error("whois_history",
|
|
|
|
|
zap.String("message", "failed to read response body"),
|
|
|
|
|
zap.Error(err),
|
|
|
|
|
)
|
|
|
|
|
return whois, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = json.Unmarshal(b, &whois)
|
|
|
|
|
if err != nil {
|
|
|
|
|
zap.L().Error("whois_history",
|
|
|
|
|
zap.String("message", "failed to unmarshal response body"),
|
|
|
|
|
zap.Error(err),
|
|
|
|
|
)
|
|
|
|
|
fmt.Println("Error unmarshalling response body:", err)
|
|
|
|
|
fmt.Println("Response body:", string(b))
|
|
|
|
|
return whois, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return whois, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func ReverseWHOIS(include []string, exclude []string, reverseType, apiKey string) (string, error) {
|
|
|
|
|
whoisSearchRequest := DehashedWHOISSearchRequest{
|
|
|
|
|
Include: include,
|
|
|
|
|
Exclude: exclude,
|
|
|
|
|
ReverseType: reverseType,
|
|
|
|
|
SearchType: "reverse-whois",
|
|
|
|
|
}
|
|
|
|
|
reqBody, _ := json.Marshal(whoisSearchRequest)
|
|
|
|
|
req, err := http.NewRequest("POST", "https://api.dehashed.com/v2/whois/search", bytes.NewReader(reqBody))
|
|
|
|
|
if err != nil {
|
|
|
|
|
return "", err
|
|
|
|
|
}
|
|
|
|
|
req.Header.Set("Content-Type", "application/json")
|
|
|
|
|
req.Header.Set("Dehashed-Api-Key", apiKey)
|
|
|
|
|
res, err := http.DefaultClient.Do(req)
|
|
|
|
|
if res != nil {
|
|
|
|
|
defer res.Body.Close()
|
|
|
|
|
}
|
|
|
|
|
if err != nil {
|
2025-05-15 16:23:59 -04:00
|
|
|
zap.L().Error("reverse_whois",
|
|
|
|
|
zap.String("message", "failed to perform request"),
|
|
|
|
|
zap.Error(err),
|
|
|
|
|
)
|
2025-05-14 22:00:38 -04:00
|
|
|
return "", err
|
|
|
|
|
}
|
|
|
|
|
if res == nil {
|
2025-05-15 16:23:59 -04:00
|
|
|
zap.L().Error("reverse_whois",
|
|
|
|
|
zap.String("message", "response was nil"),
|
|
|
|
|
)
|
2025-05-14 22:00:38 -04:00
|
|
|
return "", errors.New("response was nil")
|
|
|
|
|
}
|
2025-05-15 16:23:59 -04:00
|
|
|
|
|
|
|
|
// Check for HTTP status code errors
|
|
|
|
|
if res.StatusCode != 200 {
|
|
|
|
|
dhErr := query.GetDehashedError(res.StatusCode)
|
|
|
|
|
fmt.Printf("[%d] API Error message: %s\n", res.StatusCode, dhErr.Error())
|
|
|
|
|
zap.L().Error("reverse_whois",
|
|
|
|
|
zap.String("message", "received error status code"),
|
|
|
|
|
zap.Int("status_code", res.StatusCode),
|
|
|
|
|
zap.String("error", dhErr.Error()),
|
|
|
|
|
)
|
|
|
|
|
return "", &dhErr
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-14 22:00:38 -04:00
|
|
|
b, err := io.ReadAll(res.Body)
|
|
|
|
|
if err != nil {
|
2025-05-15 16:23:59 -04:00
|
|
|
zap.L().Error("reverse_whois",
|
|
|
|
|
zap.String("message", "failed to read response body"),
|
|
|
|
|
zap.Error(err),
|
|
|
|
|
)
|
2025-05-14 22:00:38 -04:00
|
|
|
return "", err
|
|
|
|
|
}
|
|
|
|
|
return string(b), nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func WhoisIP(ipAddress, apiKey string) ([]byte, error) {
|
|
|
|
|
whoisSearchRequest := DehashedWHOISSearchRequest{
|
|
|
|
|
IPAddress: ipAddress,
|
|
|
|
|
SearchType: "reverse-ip",
|
|
|
|
|
}
|
|
|
|
|
reqBody, _ := json.Marshal(whoisSearchRequest)
|
|
|
|
|
req, err := http.NewRequest("POST", "https://api.dehashed.com/v2/whois/search", bytes.NewReader(reqBody))
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
req.Header.Set("Content-Type", "application/json")
|
|
|
|
|
req.Header.Set("Dehashed-Api-Key", apiKey)
|
|
|
|
|
res, err := http.DefaultClient.Do(req)
|
|
|
|
|
if res != nil {
|
|
|
|
|
defer res.Body.Close()
|
|
|
|
|
}
|
|
|
|
|
if err != nil {
|
2025-05-15 16:23:59 -04:00
|
|
|
zap.L().Error("whois_ip",
|
|
|
|
|
zap.String("message", "failed to perform request"),
|
|
|
|
|
zap.Error(err),
|
|
|
|
|
)
|
2025-05-14 22:00:38 -04:00
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
if res == nil {
|
2025-05-15 16:23:59 -04:00
|
|
|
zap.L().Error("whois_ip",
|
|
|
|
|
zap.String("message", "response was nil"),
|
|
|
|
|
)
|
2025-05-14 22:00:38 -04:00
|
|
|
return nil, errors.New("response was nil")
|
|
|
|
|
}
|
2025-05-15 16:23:59 -04:00
|
|
|
|
|
|
|
|
// Check for HTTP status code errors
|
|
|
|
|
if res.StatusCode != 200 {
|
|
|
|
|
dhErr := query.GetDehashedError(res.StatusCode)
|
|
|
|
|
fmt.Printf("[%d] API Error message: %s\n", res.StatusCode, dhErr.Error())
|
|
|
|
|
zap.L().Error("whois_ip",
|
|
|
|
|
zap.String("message", "received error status code"),
|
|
|
|
|
zap.Int("status_code", res.StatusCode),
|
|
|
|
|
zap.String("error", dhErr.Error()),
|
|
|
|
|
)
|
|
|
|
|
return nil, &dhErr
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-14 22:00:38 -04:00
|
|
|
b, err := io.ReadAll(res.Body)
|
|
|
|
|
if err != nil {
|
2025-05-15 16:23:59 -04:00
|
|
|
zap.L().Error("whois_ip",
|
|
|
|
|
zap.String("message", "failed to read response body"),
|
|
|
|
|
zap.Error(err),
|
|
|
|
|
)
|
2025-05-14 22:00:38 -04:00
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
return b, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func WhoisMX(mxAddress, apiKey string) (string, error) {
|
|
|
|
|
whoisSearchRequest := DehashedWHOISSearchRequest{
|
|
|
|
|
MXAddress: mxAddress,
|
|
|
|
|
SearchType: "reverse-mx",
|
|
|
|
|
}
|
|
|
|
|
reqBody, _ := json.Marshal(whoisSearchRequest)
|
|
|
|
|
req, err := http.NewRequest("POST", "https://api.dehashed.com/v2/whois/search", bytes.NewReader(reqBody))
|
|
|
|
|
if err != nil {
|
|
|
|
|
return "", err
|
|
|
|
|
}
|
|
|
|
|
req.Header.Set("Content-Type", "application/json")
|
|
|
|
|
req.Header.Set("Dehashed-Api-Key", apiKey)
|
|
|
|
|
res, err := http.DefaultClient.Do(req)
|
|
|
|
|
if res != nil {
|
|
|
|
|
defer res.Body.Close()
|
|
|
|
|
}
|
|
|
|
|
if err != nil {
|
2025-05-15 16:23:59 -04:00
|
|
|
zap.L().Error("whois_mx",
|
|
|
|
|
zap.String("message", "failed to perform request"),
|
|
|
|
|
zap.Error(err),
|
|
|
|
|
)
|
2025-05-14 22:00:38 -04:00
|
|
|
return "", err
|
|
|
|
|
}
|
|
|
|
|
if res == nil {
|
2025-05-15 16:23:59 -04:00
|
|
|
zap.L().Error("whois_mx",
|
|
|
|
|
zap.String("message", "response was nil"),
|
|
|
|
|
)
|
2025-05-14 22:00:38 -04:00
|
|
|
return "", errors.New("response was nil")
|
|
|
|
|
}
|
2025-05-15 16:23:59 -04:00
|
|
|
|
|
|
|
|
// Check for HTTP status code errors
|
|
|
|
|
if res.StatusCode != 200 {
|
|
|
|
|
dhErr := query.GetDehashedError(res.StatusCode)
|
|
|
|
|
fmt.Printf("[%d] API Error message: %s\n", res.StatusCode, dhErr.Error())
|
|
|
|
|
zap.L().Error("whois_mx",
|
|
|
|
|
zap.String("message", "received error status code"),
|
|
|
|
|
zap.Int("status_code", res.StatusCode),
|
|
|
|
|
zap.String("error", dhErr.Error()),
|
|
|
|
|
)
|
|
|
|
|
return "", &dhErr
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-14 22:00:38 -04:00
|
|
|
b, err := io.ReadAll(res.Body)
|
|
|
|
|
if err != nil {
|
2025-05-15 16:23:59 -04:00
|
|
|
zap.L().Error("whois_mx",
|
|
|
|
|
zap.String("message", "failed to read response body"),
|
|
|
|
|
zap.Error(err),
|
|
|
|
|
)
|
2025-05-14 22:00:38 -04:00
|
|
|
return "", err
|
|
|
|
|
}
|
|
|
|
|
return string(b), nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func WhoisNS(nsAddress, apiKey string) (string, error) {
|
|
|
|
|
whoisSearchRequest := DehashedWHOISSearchRequest{
|
|
|
|
|
NSAddress: nsAddress,
|
|
|
|
|
SearchType: "reverse-ns",
|
|
|
|
|
}
|
|
|
|
|
reqBody, _ := json.Marshal(whoisSearchRequest)
|
|
|
|
|
req, err := http.NewRequest("POST", "https://api.dehashed.com/v2/whois/search", bytes.NewReader(reqBody))
|
|
|
|
|
if err != nil {
|
|
|
|
|
return "", err
|
|
|
|
|
}
|
|
|
|
|
req.Header.Set("Content-Type", "application/json")
|
|
|
|
|
req.Header.Set("Dehashed-Api-Key", apiKey)
|
|
|
|
|
res, err := http.DefaultClient.Do(req)
|
|
|
|
|
if res != nil {
|
|
|
|
|
defer res.Body.Close()
|
|
|
|
|
}
|
|
|
|
|
if err != nil {
|
2025-05-15 16:23:59 -04:00
|
|
|
zap.L().Error("whois_ns",
|
|
|
|
|
zap.String("message", "failed to perform request"),
|
|
|
|
|
zap.Error(err),
|
|
|
|
|
)
|
2025-05-14 22:00:38 -04:00
|
|
|
return "", err
|
|
|
|
|
}
|
|
|
|
|
if res == nil {
|
2025-05-15 16:23:59 -04:00
|
|
|
zap.L().Error("whois_ns",
|
|
|
|
|
zap.String("message", "response was nil"),
|
|
|
|
|
)
|
2025-05-14 22:00:38 -04:00
|
|
|
return "", errors.New("response was nil")
|
|
|
|
|
}
|
2025-05-15 16:23:59 -04:00
|
|
|
|
|
|
|
|
// Check for HTTP status code errors
|
|
|
|
|
if res.StatusCode != 200 {
|
|
|
|
|
dhErr := query.GetDehashedError(res.StatusCode)
|
|
|
|
|
fmt.Printf("[%d] API Error message: %s\n", res.StatusCode, dhErr.Error())
|
|
|
|
|
zap.L().Error("whois_ns",
|
|
|
|
|
zap.String("message", "received error status code"),
|
|
|
|
|
zap.Int("status_code", res.StatusCode),
|
|
|
|
|
zap.String("error", dhErr.Error()),
|
|
|
|
|
)
|
|
|
|
|
return "", &dhErr
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-14 22:00:38 -04:00
|
|
|
b, err := io.ReadAll(res.Body)
|
|
|
|
|
if err != nil {
|
2025-05-15 16:23:59 -04:00
|
|
|
zap.L().Error("whois_ns",
|
|
|
|
|
zap.String("message", "failed to read response body"),
|
|
|
|
|
zap.Error(err),
|
|
|
|
|
)
|
2025-05-14 22:00:38 -04:00
|
|
|
return "", err
|
|
|
|
|
}
|
|
|
|
|
return string(b), nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func WhoisSubdomainScan(domain, apiKey string) (sqlite.WhoIsSubdomainScan, error) {
|
|
|
|
|
var whois sqlite.WhoIsSubdomainScan
|
|
|
|
|
whoisSearchRequest := DehashedWHOISSearchRequest{
|
|
|
|
|
Domain: domain,
|
|
|
|
|
SearchType: "subdomain-scan",
|
|
|
|
|
}
|
|
|
|
|
reqBody, _ := json.Marshal(whoisSearchRequest)
|
|
|
|
|
req, err := http.NewRequest("POST", "https://api.dehashed.com/v2/whois/search", bytes.NewReader(reqBody))
|
|
|
|
|
if err != nil {
|
|
|
|
|
return whois, err
|
|
|
|
|
}
|
|
|
|
|
req.Header.Set("Content-Type", "application/json")
|
|
|
|
|
req.Header.Set("Dehashed-Api-Key", apiKey)
|
|
|
|
|
res, err := http.DefaultClient.Do(req)
|
|
|
|
|
if res != nil {
|
|
|
|
|
defer res.Body.Close()
|
|
|
|
|
}
|
|
|
|
|
if err != nil {
|
2025-05-15 16:23:59 -04:00
|
|
|
zap.L().Error("whois_subdomain_scan",
|
|
|
|
|
zap.String("message", "failed to perform request"),
|
|
|
|
|
zap.Error(err),
|
|
|
|
|
)
|
2025-05-14 22:00:38 -04:00
|
|
|
return whois, err
|
|
|
|
|
}
|
|
|
|
|
if res == nil {
|
2025-05-15 16:23:59 -04:00
|
|
|
zap.L().Error("whois_subdomain_scan",
|
|
|
|
|
zap.String("message", "response was nil"),
|
|
|
|
|
)
|
2025-05-14 22:00:38 -04:00
|
|
|
return whois, errors.New("response was nil")
|
|
|
|
|
}
|
2025-05-15 16:23:59 -04:00
|
|
|
|
|
|
|
|
// Check for HTTP status code errors
|
|
|
|
|
if res.StatusCode != 200 {
|
|
|
|
|
dhErr := query.GetDehashedError(res.StatusCode)
|
|
|
|
|
fmt.Printf("[%d] API Error message: %s\n", res.StatusCode, dhErr.Error())
|
|
|
|
|
zap.L().Error("whois_subdomain_scan",
|
|
|
|
|
zap.String("message", "received error status code"),
|
|
|
|
|
zap.Int("status_code", res.StatusCode),
|
|
|
|
|
zap.String("error", dhErr.Error()),
|
|
|
|
|
)
|
|
|
|
|
return whois, &dhErr
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-14 22:00:38 -04:00
|
|
|
b, err := io.ReadAll(res.Body)
|
|
|
|
|
if err != nil {
|
2025-05-15 16:23:59 -04:00
|
|
|
zap.L().Error("whois_subdomain_scan",
|
|
|
|
|
zap.String("message", "failed to read response body"),
|
|
|
|
|
zap.Error(err),
|
|
|
|
|
)
|
2025-05-14 22:00:38 -04:00
|
|
|
return whois, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = json.Unmarshal(b, &whois)
|
|
|
|
|
if err != nil {
|
|
|
|
|
zap.L().Error("whois_subdomain_scan",
|
|
|
|
|
zap.String("message", "failed to unmarshal response body"),
|
|
|
|
|
zap.Error(err),
|
|
|
|
|
)
|
|
|
|
|
fmt.Println("Error unmarshalling response body:", err)
|
|
|
|
|
fmt.Println("Response body:", string(b))
|
|
|
|
|
return whois, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return whois, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func GetWHOISCredits(apiKey string) (sqlite.WhoIsCredits, error) {
|
|
|
|
|
var whoisCredits sqlite.WhoIsCredits
|
|
|
|
|
|
|
|
|
|
req, err := http.NewRequest("GET", "https://api.dehashed.com/v2/whois/credits", nil)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return whoisCredits, err
|
|
|
|
|
}
|
|
|
|
|
req.Header.Set("Content-Type", "application/json")
|
|
|
|
|
req.Header.Set("Dehashed-Api-Key", apiKey)
|
|
|
|
|
res, err := http.DefaultClient.Do(req)
|
|
|
|
|
if res != nil {
|
|
|
|
|
defer res.Body.Close()
|
|
|
|
|
}
|
|
|
|
|
if err != nil {
|
2025-05-15 16:23:59 -04:00
|
|
|
zap.L().Error("get_whois_credits",
|
|
|
|
|
zap.String("message", "failed to perform request"),
|
|
|
|
|
zap.Error(err),
|
|
|
|
|
)
|
2025-05-14 22:00:38 -04:00
|
|
|
return whoisCredits, err
|
|
|
|
|
}
|
|
|
|
|
if res == nil {
|
2025-05-15 16:23:59 -04:00
|
|
|
zap.L().Error("get_whois_credits",
|
|
|
|
|
zap.String("message", "response was nil"),
|
|
|
|
|
)
|
2025-05-14 22:00:38 -04:00
|
|
|
return whoisCredits, errors.New("response was nil")
|
|
|
|
|
}
|
2025-05-15 16:23:59 -04:00
|
|
|
|
|
|
|
|
// Check for HTTP status code errors
|
|
|
|
|
if res.StatusCode != 200 {
|
|
|
|
|
dhErr := query.GetDehashedError(res.StatusCode)
|
|
|
|
|
fmt.Printf("[%d] API Error message: %s\n", res.StatusCode, dhErr.Error())
|
|
|
|
|
zap.L().Error("get_whois_credits",
|
|
|
|
|
zap.String("message", "received error status code"),
|
|
|
|
|
zap.Int("status_code", res.StatusCode),
|
|
|
|
|
zap.String("error", dhErr.Error()),
|
|
|
|
|
)
|
|
|
|
|
return whoisCredits, &dhErr
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-14 22:00:38 -04:00
|
|
|
b, err := io.ReadAll(res.Body)
|
|
|
|
|
if err != nil {
|
2025-05-15 16:23:59 -04:00
|
|
|
zap.L().Error("get_whois_credits",
|
|
|
|
|
zap.String("message", "failed to read response body"),
|
|
|
|
|
zap.Error(err),
|
|
|
|
|
)
|
2025-05-14 22:00:38 -04:00
|
|
|
return whoisCredits, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = json.Unmarshal(b, &whoisCredits)
|
|
|
|
|
if err != nil {
|
|
|
|
|
zap.L().Error("get_whois_credits",
|
|
|
|
|
zap.String("message", "failed to unmarshal response body"),
|
|
|
|
|
zap.Error(err),
|
|
|
|
|
)
|
|
|
|
|
fmt.Println("Error unmarshalling response body:", err)
|
|
|
|
|
fmt.Println("Response body:", string(b))
|
|
|
|
|
return whoisCredits, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return whoisCredits, nil
|
|
|
|
|
}
|