Files
OpenFlare/openflare_server/service/geoip_lookup.go
T
2026-03-15 16:26:56 +08:00

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
}