mirror of
https://github.com/zu1k/nali.git
synced 2025-01-23 21:59:02 +08:00
60 lines
1.2 KiB
Go
60 lines
1.2 KiB
Go
package ipip
|
||
|
||
import (
|
||
"fmt"
|
||
"log"
|
||
"os"
|
||
|
||
"github.com/ipipdotnet/ipdb-go"
|
||
)
|
||
|
||
type IPIPFree struct {
|
||
*ipdb.City
|
||
}
|
||
|
||
func NewIPIPFree(filePath string) IPIPFree {
|
||
_, err := os.Stat(filePath)
|
||
if err != nil && os.IsNotExist(err) {
|
||
log.Printf("IPIP数据库不存在,请手动下载解压后保存到本地: %s \n", filePath)
|
||
log.Println("下载链接: https://www.ipip.net/product/ip.html")
|
||
os.Exit(1)
|
||
return IPIPFree{}
|
||
} else {
|
||
db, err := ipdb.NewCity(filePath)
|
||
if err != nil {
|
||
log.Fatalln("IPIP 数据库 初始化失败")
|
||
log.Fatal(err)
|
||
os.Exit(1)
|
||
}
|
||
return IPIPFree{City: db}
|
||
}
|
||
}
|
||
|
||
type Result struct {
|
||
Country string
|
||
Region string
|
||
City string
|
||
}
|
||
|
||
func (r Result) String() string {
|
||
if r.City == "" {
|
||
return fmt.Sprintf("%s %s", r.Country, r.Region)
|
||
}
|
||
return fmt.Sprintf("%s %s %s", r.Country, r.Region, r.City)
|
||
}
|
||
|
||
func (db IPIPFree) Find(query string, params ...string) (result fmt.Stringer, err error) {
|
||
info, err := db.FindInfo(query, "CN")
|
||
if err != nil || info == nil {
|
||
return nil, err
|
||
} else {
|
||
// info contains more info
|
||
result = Result{
|
||
Country: info.CountryName,
|
||
Region: info.RegionName,
|
||
City: info.CityName,
|
||
}
|
||
return
|
||
}
|
||
}
|