1
0
mirror of https://github.com/zu1k/nali.git synced 2025-01-23 05:39:03 +08:00

feat: Support ip2region

Signed-off-by: zu1k <i@lgf.im>
This commit is contained in:
zu1k 2022-02-20 11:28:25 +08:00
parent 89baf9846b
commit 21795154fa
No known key found for this signature in database
GPG Key ID: AF2CF33D9FE3F0C6
6 changed files with 110 additions and 0 deletions

1
go.mod
View File

@ -13,6 +13,7 @@ require (
require ( require (
github.com/inconshreveable/mousetrap v1.0.0 // indirect github.com/inconshreveable/mousetrap v1.0.0 // indirect
github.com/lionsoul2014/ip2region v2.2.0-release+incompatible // indirect
github.com/mattn/go-colorable v0.1.12 // indirect github.com/mattn/go-colorable v0.1.12 // indirect
github.com/mattn/go-isatty v0.0.14 // indirect github.com/mattn/go-isatty v0.0.14 // indirect
github.com/oschwald/maxminddb-golang v1.8.0 // indirect github.com/oschwald/maxminddb-golang v1.8.0 // indirect

2
go.sum
View File

@ -244,6 +244,8 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/lionsoul2014/ip2region v2.2.0-release+incompatible h1:1qp9iks+69h7IGLazAplzS9Ca14HAxuD5c0rbFdPGy4=
github.com/lionsoul2014/ip2region v2.2.0-release+incompatible/go.mod h1:+ZBN7PBoh5gG6/y0ZQ85vJDBe21WnfbRrQQwTfliJJI=
github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w=
github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=

View File

@ -5,6 +5,8 @@ import (
"path/filepath" "path/filepath"
"strings" "strings"
"github.com/zu1k/nali/pkg/ip2region"
"github.com/zu1k/nali/internal/constant" "github.com/zu1k/nali/internal/constant"
"github.com/zu1k/nali/pkg/cdn" "github.com/zu1k/nali/pkg/cdn"
"github.com/zu1k/nali/pkg/dbif" "github.com/zu1k/nali/pkg/dbif"
@ -19,6 +21,7 @@ var (
ZXIPv6WryPath = filepath.Join(constant.HomePath, "zxipv6wry.db") ZXIPv6WryPath = filepath.Join(constant.HomePath, "zxipv6wry.db")
GeoLite2CityPath = filepath.Join(constant.HomePath, "GeoLite2-City.mmdb") GeoLite2CityPath = filepath.Join(constant.HomePath, "GeoLite2-City.mmdb")
IPIPFreePath = filepath.Join(constant.HomePath, "ipipfree.ipdb") IPIPFreePath = filepath.Join(constant.HomePath, "ipipfree.ipdb")
Ip2RegionPath = filepath.Join(constant.HomePath, "ip2region.db")
CDNPath = filepath.Join(constant.HomePath, "cdn.json") CDNPath = filepath.Join(constant.HomePath, "cdn.json")
Language = "zh-CN" Language = "zh-CN"
@ -80,6 +83,7 @@ func GetDB(typ dbif.QueryType) (db dbif.DB) {
} }
func GetIPDBbyName(name string) (db dbif.DB) { func GetIPDBbyName(name string) (db dbif.DB) {
name = strings.ToLower(name)
switch name { switch name {
case "geo", "geoip", "geoip2": case "geo", "geoip", "geoip2":
return geoip.NewGeoIP(GeoLite2CityPath) return geoip.NewGeoIP(GeoLite2CityPath)
@ -87,6 +91,8 @@ func GetIPDBbyName(name string) (db dbif.DB) {
return qqwry.NewQQwry(QQWryPath) return qqwry.NewQQwry(QQWryPath)
case "ipip", "ipipfree", "ipip.net": case "ipip", "ipipfree", "ipip.net":
return ipip.NewIPIPFree(IPIPFreePath) return ipip.NewIPIPFree(IPIPFreePath)
case "ip2region", "region", "i2r":
return ip2region.NewIp2Region(Ip2RegionPath)
default: default:
return qqwry.NewQQwry(QQWryPath) return qqwry.NewQQwry(QQWryPath)
} }

View File

@ -5,6 +5,7 @@ import (
"github.com/zu1k/nali/pkg/cdn" "github.com/zu1k/nali/pkg/cdn"
"github.com/zu1k/nali/pkg/geoip" "github.com/zu1k/nali/pkg/geoip"
"github.com/zu1k/nali/pkg/ip2region"
"github.com/zu1k/nali/pkg/ipip" "github.com/zu1k/nali/pkg/ipip"
"github.com/zu1k/nali/pkg/qqwry" "github.com/zu1k/nali/pkg/qqwry"
"github.com/zu1k/nali/pkg/zxipv6wry" "github.com/zu1k/nali/pkg/zxipv6wry"
@ -27,5 +28,6 @@ var (
_ DB = zxipv6wry.ZXwry{} _ DB = zxipv6wry.ZXwry{}
_ DB = ipip.IPIPFree{} _ DB = ipip.IPIPFree{}
_ DB = geoip.GeoIP{} _ DB = geoip.GeoIP{}
_ DB = ip2region.Ip2Region{}
_ DB = cdn.CDN{} _ DB = cdn.CDN{}
) )

View File

@ -0,0 +1,50 @@
package ip2region
import (
"fmt"
"log"
"os"
"github.com/lionsoul2014/ip2region/binding/golang/ip2region"
"github.com/zu1k/nali/pkg/common"
)
type Ip2Region struct {
db *ip2region.Ip2Region
}
func NewIp2Region(filePath string) Ip2Region {
_, err := os.Stat(filePath)
if err != nil && os.IsNotExist(err) {
log.Println("文件不存在,尝试从网络获取最新 ip2region 库")
_, err = Download(filePath)
if err != nil {
os.Exit(1)
}
}
region, err := ip2region.New(filePath)
if err != nil {
panic(err)
}
return Ip2Region{
db: region,
}
}
func (db Ip2Region) Find(query string, params ...string) (result fmt.Stringer, err error) {
ip, err := db.db.MemorySearch(query)
if err != nil {
return nil, err
}
fmt.Println(ip)
result = common.Result{
Country: ip.Country,
Area: ip.Province,
}
return result, nil
}

49
pkg/ip2region/update.go Normal file
View File

@ -0,0 +1,49 @@
package ip2region
import (
"io/ioutil"
"log"
"net/http"
"github.com/zu1k/nali/pkg/common"
)
func Download(filePath string) (data []byte, err error) {
data, err = getData()
if err != nil {
log.Printf("CDN数据库下载失败请手动下载解压后保存到本地: %s \n", filePath)
log.Println("下载链接:", githubUrl)
return
}
common.ExistThenRemove(filePath)
if err := ioutil.WriteFile(filePath, data, 0644); err == nil {
log.Printf("已将最新的 ip2region 保存到本地: %s \n", filePath)
}
return
}
const (
githubUrl = "https://raw.githubusercontent.com/lionsoul2014/ip2region/master/data/ip2region.db"
jsdelivrUrl = "https://cdn.jsdelivr.net/gh/lionsoul2014/ip2region/data/ip2region.db"
)
func getData() (data []byte, err error) {
resp, err := http.Get(jsdelivrUrl)
if err != nil {
return nil, err
}
if resp.StatusCode != 200 {
resp, err = http.Get(githubUrl)
if err != nil {
return nil, err
}
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, err
}
return body, nil
}