package utils import ( "io" "net" "net/http" "regexp" ) // IPVersion specifies the IP version (IPv4 or IPv6). type IPVersion int const ( IPv4 IPVersion = 4 IPv6 IPVersion = 6 ) // fetchWebpage fetches the content of a URL and returns it as a string. // It uses the specified IP version for the HTTP request. func fetchWebpage(url string, version IPVersion) string { client := &http.Client{ Transport: &http.Transport{ DialContext: (&net.Dialer{}).DialContext, Dial: func(network, addr string) (net.Conn, error) { if version == IPv6 { addr = "[" + addr + "]" } return net.Dial(network, addr) }, }, } resp, err := client.Get(url) if err != nil { return "" } defer resp.Body.Close() body, err := io.ReadAll(resp.Body) if err != nil { return "" } return string(body) } // extractIPAddress extracts the IP address from the given string. func extractIPAddress(input string) string { re := regexp.MustCompile(`(?m)Your IP Address: ([^<]+)`) matches := re.FindStringSubmatch(input) if len(matches) < 1 { return "" } return matches[0] } // GetPublicIPAddress returns the public IP address of the machine. func GetPublicIPAddress() (string, string) { ipv4 := fetchWebpage("https://real-debrid.com/vpn", IPv4) ipv4address := extractIPAddress(ipv4) ipv6 := fetchWebpage("https://real-debrid.com/vpn", IPv6) ipv6address := extractIPAddress(ipv6) return ipv4address, ipv6address }