|
|
package gorequest
|
|
|
|
|
|
import (
|
|
|
"context"
|
|
|
"go.dtapp.net/gojson"
|
|
|
"net"
|
|
|
"net/http"
|
|
|
"strings"
|
|
|
)
|
|
|
|
|
|
// ClientIp 尽最大努力实现获取客户端 IP 的算法。
|
|
|
// 解析 X-Real-IP 和 X-Forwarded-For 以便于反向代理(nginx 或 haproxy)可以正常工作。
|
|
|
func ClientIp(r *http.Request) string {
|
|
|
|
|
|
// CloudFlare
|
|
|
CfConnectingIp := strings.TrimSpace(r.Header.Get("Cf-Connecting-Ip"))
|
|
|
if CfConnectingIp != "" {
|
|
|
return CfConnectingIp
|
|
|
}
|
|
|
|
|
|
// 转发IP
|
|
|
xForwardedFor := strings.TrimSpace(strings.Split(r.Header.Get("X-Forwarded-For"), ",")[0])
|
|
|
if xForwardedFor != "" {
|
|
|
return xForwardedFor
|
|
|
}
|
|
|
|
|
|
// 真实Ip
|
|
|
XRealIp := strings.TrimSpace(r.Header.Get("X-Real-Ip"))
|
|
|
if XRealIp != "" {
|
|
|
return XRealIp
|
|
|
}
|
|
|
|
|
|
// HTTP客户端IP
|
|
|
HttpClientIp := strings.TrimSpace(strings.Split(r.Header.Get("HTTP_CLIENT_IP"), ",")[0])
|
|
|
if HttpClientIp != "" {
|
|
|
return HttpClientIp
|
|
|
}
|
|
|
|
|
|
// HTTP转发IP
|
|
|
HttpXForwardedFor := strings.TrimSpace(strings.Split(r.Header.Get("HTTP_X_FORWARDED_FOR"), ",")[0])
|
|
|
if HttpXForwardedFor != "" {
|
|
|
return HttpXForwardedFor
|
|
|
}
|
|
|
|
|
|
// 系统
|
|
|
ip, _, err := net.SplitHostPort(strings.TrimSpace(r.RemoteAddr))
|
|
|
if err == nil {
|
|
|
return ip
|
|
|
}
|
|
|
|
|
|
return ""
|
|
|
}
|
|
|
|
|
|
// GetInsideIp 内网ip
|
|
|
func GetInsideIp(ctx context.Context) string {
|
|
|
|
|
|
conn, err := net.Dial("udp", "8.8.8.8:80")
|
|
|
if err != nil {
|
|
|
panic(err)
|
|
|
}
|
|
|
defer conn.Close()
|
|
|
|
|
|
localAddr := conn.LocalAddr().(*net.UDPAddr)
|
|
|
return localAddr.IP.String()
|
|
|
}
|
|
|
|
|
|
// Ips 获取全部网卡的全部IP
|
|
|
func Ips(ctx context.Context) (map[string]string, error) {
|
|
|
|
|
|
ips := make(map[string]string)
|
|
|
|
|
|
//返回 interface 结构体对象的列表,包含了全部网卡信息
|
|
|
interfaces, err := net.Interfaces()
|
|
|
if err != nil {
|
|
|
return nil, err
|
|
|
}
|
|
|
|
|
|
//遍历全部网卡
|
|
|
for _, i := range interfaces {
|
|
|
|
|
|
// Addrs() 方法返回一个网卡上全部的IP列表
|
|
|
address, err := i.Addrs()
|
|
|
if err != nil {
|
|
|
return nil, err
|
|
|
}
|
|
|
|
|
|
//遍历一个网卡上全部的IP列表,组合为一个字符串,放入对应网卡名称的map中
|
|
|
for _, v := range address {
|
|
|
ips[i.Name] += v.String() + " "
|
|
|
}
|
|
|
}
|
|
|
return ips, nil
|
|
|
}
|
|
|
|
|
|
// GetOutsideIp 外网ip
|
|
|
func GetOutsideIp(ctx context.Context) string {
|
|
|
|
|
|
// 返回结果
|
|
|
type respGetOutsideIp struct {
|
|
|
Data struct {
|
|
|
Ip string `json:"ip,omitempty"`
|
|
|
} `json:"data"`
|
|
|
}
|
|
|
|
|
|
// 请求
|
|
|
getHttp := NewHttp()
|
|
|
getHttp.SetUri("https://api.dtapp.net/ip")
|
|
|
getHttp.SetUserAgent(GetRandomUserAgentSystem())
|
|
|
response, err := getHttp.Get(ctx)
|
|
|
if err != nil {
|
|
|
return "0.0.0.0"
|
|
|
}
|
|
|
// 解析
|
|
|
var responseJson respGetOutsideIp
|
|
|
err = gojson.Unmarshal(response.ResponseBody, &responseJson)
|
|
|
if err != nil {
|
|
|
return "0.0.0.0"
|
|
|
}
|
|
|
if responseJson.Data.Ip == "" {
|
|
|
responseJson.Data.Ip = "0.0.0.0"
|
|
|
}
|
|
|
return responseJson.Data.Ip
|
|
|
}
|
|
|
|
|
|
// GetMacAddr 获取Mac地址
|
|
|
func GetMacAddr(ctx context.Context) (arrays []string) {
|
|
|
netInterfaces, err := net.Interfaces()
|
|
|
if err != nil {
|
|
|
return arrays
|
|
|
}
|
|
|
for _, netInterface := range netInterfaces {
|
|
|
addr := netInterface.HardwareAddr.String()
|
|
|
if len(addr) == 0 {
|
|
|
continue
|
|
|
}
|
|
|
|
|
|
arrays = append(arrays, addr)
|
|
|
}
|
|
|
return arrays
|
|
|
}
|