mirror of
https://github.com/Rain-kl/OpenFlare.git
synced 2026-10-04 07:06:36 +08:00
51 lines
1.2 KiB
Go
51 lines
1.2 KiB
Go
package service
|
|
|
|
import (
|
|
"errors"
|
|
"net"
|
|
"openflare/utils/geoip"
|
|
"strings"
|
|
)
|
|
|
|
type GeoIPLookupView struct {
|
|
Provider string `json:"provider"`
|
|
IP string `json:"ip"`
|
|
ISOCode string `json:"iso_code"`
|
|
Name string `json:"name"`
|
|
Latitude *float64 `json:"latitude,omitempty"`
|
|
Longitude *float64 `json:"longitude,omitempty"`
|
|
}
|
|
|
|
func LookupGeoIP(provider string, rawIP string) (*GeoIPLookupView, error) {
|
|
trimmedProvider := strings.TrimSpace(provider)
|
|
if !geoip.IsValidProvider(trimmedProvider) {
|
|
return nil, errors.New("归属方式仅支持 disabled、mmdb、ip-api、geojs、ipinfo")
|
|
}
|
|
|
|
trimmedIP := strings.TrimSpace(rawIP)
|
|
if trimmedIP == "" {
|
|
return nil, errors.New("IP 不能为空")
|
|
}
|
|
parsedIP := net.ParseIP(trimmedIP)
|
|
if parsedIP == nil {
|
|
return nil, errors.New("IP 格式无效")
|
|
}
|
|
|
|
info, err := geoip.LookupGeoInfoWithProvider(trimmedProvider, parsedIP)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if info == nil {
|
|
return nil, errors.New("未获取到 IP 归属结果")
|
|
}
|
|
|
|
return &GeoIPLookupView{
|
|
Provider: trimmedProvider,
|
|
IP: parsedIP.String(),
|
|
ISOCode: info.ISOCode,
|
|
Name: info.Name,
|
|
Latitude: info.Latitude,
|
|
Longitude: info.Longitude,
|
|
}, nil
|
|
}
|