66 lines
1.4 KiB
Go
66 lines
1.4 KiB
Go
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:</strong> ([^<]+)`)
|
|
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
|
|
}
|