Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alpkeskin
GitHub Repository: alpkeskin/mosint
Path: blob/master/v3/pkg/services/ipapi/ipapi.go
689 views
1
/*
2
Copyright © 2023 github.com/alpkeskin
3
*/
4
package ipapi
5
6
import (
7
"encoding/json"
8
"fmt"
9
"io"
10
"net"
11
"net/http"
12
"strings"
13
14
"github.com/alpkeskin/mosint/v3/internal/spinner"
15
"github.com/fatih/color"
16
)
17
18
type Ipapi struct {
19
Response IpApiResponse
20
}
21
22
type IpApiResponse struct {
23
IP string `json:"ip"`
24
Version string `json:"version"`
25
City string `json:"city"`
26
Region string `json:"region"`
27
RegionCode string `json:"region_code"`
28
Country string `json:"country"`
29
CountryName string `json:"country_name"`
30
CountryCode string `json:"country_code"`
31
CountryCodeIso3 string `json:"country_code_iso3"`
32
CountryCapital string `json:"country_capital"`
33
CountryTld string `json:"country_tld"`
34
ContinentCode string `json:"continent_code"`
35
InEu bool `json:"in_eu"`
36
Postal string `json:"postal"`
37
Latitude float64 `json:"latitude"`
38
Longitude float64 `json:"longitude"`
39
Timezone string `json:"timezone"`
40
UtcOffset string `json:"utc_offset"`
41
CountryCallingCode string `json:"country_calling_code"`
42
Currency string `json:"currency"`
43
CurrencyName string `json:"currency_name"`
44
Languages string `json:"languages"`
45
CountryArea float64 `json:"country_area"`
46
CountryPopulation int `json:"country_population"`
47
Asn string `json:"asn"`
48
Org string `json:"org"`
49
}
50
51
func New() *Ipapi {
52
return &Ipapi{}
53
}
54
55
func (i *Ipapi) GetInfo(email string) {
56
spinner := spinner.New("IPApi Lookup")
57
spinner.Start()
58
59
domain := email[strings.IndexByte(email, '@')+1:]
60
ip := domainToIP(domain)
61
if strings.EqualFold(ip, "") {
62
spinner.StopFail()
63
spinner.SetMessage("IP not found")
64
return
65
}
66
url := fmt.Sprintf("https://ipapi.co/%s/json/", ip)
67
req, err := http.NewRequest("GET", url, nil)
68
69
if err != nil {
70
spinner.StopFail()
71
spinner.SetMessage(err.Error())
72
return
73
}
74
75
req.Header.Add("User-Agent", "mosint")
76
client := &http.Client{}
77
resp, err := client.Do(req)
78
79
if err != nil {
80
spinner.StopFail()
81
spinner.SetMessage(err.Error())
82
return
83
}
84
85
defer resp.Body.Close()
86
body, err := io.ReadAll(resp.Body)
87
88
if err != nil {
89
spinner.StopFail()
90
spinner.SetMessage(err.Error())
91
return
92
}
93
94
var r IpApiResponse
95
err = json.Unmarshal(body, &r)
96
97
if err != nil {
98
spinner.StopFail()
99
spinner.SetMessage(err.Error())
100
return
101
}
102
103
i.Response = r
104
spinner.Stop()
105
}
106
107
func (i *Ipapi) Print() {
108
fmt.Println("[*] IP Lookup")
109
fmt.Println(color.GreenString("[+]"), "IP:", i.Response.IP)
110
fmt.Println(color.GreenString("[+]"), "City:", i.Response.City)
111
fmt.Println(color.GreenString("[+]"), "Region:", i.Response.Region)
112
fmt.Println(color.GreenString("[+]"), "Country:", i.Response.CountryName)
113
fmt.Println(color.GreenString("[+]"), "Country Code:", i.Response.CountryCode)
114
fmt.Println(color.GreenString("[+]"), "Timezone:", i.Response.Timezone)
115
fmt.Println(color.GreenString("[+]"), "Organization:", i.Response.Org)
116
fmt.Println(color.GreenString("[+]"), "ASN:", i.Response.Asn)
117
}
118
119
func domainToIP(domain string) string {
120
ips, _ := net.LookupIP(domain)
121
for _, ip := range ips {
122
if ip.To4() != nil {
123
return ip.String()
124
}
125
}
126
return ""
127
}
128
129