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:
parent
89baf9846b
commit
21795154fa
1
go.mod
1
go.mod
@ -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
2
go.sum
@ -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=
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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{}
|
||||||
)
|
)
|
||||||
|
50
pkg/ip2region/ip2region.go
Normal file
50
pkg/ip2region/ip2region.go
Normal 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
49
pkg/ip2region/update.go
Normal 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
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user