Compare commits

..

6 Commits

Author SHA1 Message Date
zu1k
6421e09c8e Bump version 2020-08-26 13:09:16 +08:00
zu1k
c3698f8ed5 Add flags.json to bindata and use map instead of slices 2020-08-26 13:07:30 +08:00
zu1k
84d037c0b8 Merge pull request #11 from sparkyvxcx/develop
Add country flag emoji before country code in each proxy name field, some typo fix
2020-08-26 12:49:01 +08:00
Sparkvix
ff52fc0ed1 Add getFlag method for GeoIP struct 2020-08-26 00:10:00 -04:00
Sparkvix
2f731b0acb Add country flag emoji before country code in each proxy name field, some typo fix 2020-08-25 13:41:59 -04:00
zu1k
cedd5b4ec4 update readme 2020-08-25 14:37:15 +08:00
8 changed files with 2091 additions and 22 deletions

View File

@@ -30,7 +30,7 @@ jobs:
if: startsWith(github.ref, 'refs/tags/')
run: |
go get -u github.com/go-bindata/go-bindata/...
go-bindata -o internal/bindata/geoip/geoip.go -pkg bingeoip assets/GeoLite2-City.mmdb
go-bindata -o internal/bindata/geoip/geoip.go -pkg bingeoip assets/GeoLite2-City.mmdb assets/flags.json
go-bindata -o internal/bindata/html/html.go -pkg binhtml assets/html/
- name: Build

View File

@@ -53,8 +53,6 @@ $ go get -u -v github.com/zu1k/proxypool
从这里下载预编译好的程序 [release](https://github.com/zu1k/proxypool/releases)
除了编译好的二进制程序,你还需要下载仓库 `assets` 文件夹,放置在可执行文件同目录
### 使用docker
```sh

View File

@@ -13,7 +13,7 @@ import (
"github.com/zu1k/proxypool/pkg/provider"
)
const version = "v0.3.2"
const version = "v0.3.3"
var router *gin.Engine

2000
assets/flags.json Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -51,9 +51,9 @@ func CrawlGo() {
cache.LastCrawlTime = time.Now().In(location).Format("2006-01-02 15:04:05")
// 可用性检测
log.Println("Now check proxy health...")
log.Println("Now proceed proxy health check...")
proxies = proxy.CleanBadProxiesWithGrpool(proxies)
log.Println("CrawlGo clash usefull node count:", len(proxies))
log.Println("CrawlGo clash usable node count:", len(proxies))
proxies.NameReIndex()
cache.SetProxies("proxies", proxies)
cache.UsefullProxiesCount = proxies.Len()

View File

@@ -1,6 +1,7 @@
// Code generated for package bingeoip by go-bindata DO NOT EDIT. (@generated)
// sources:
// assets/GeoLite2-City.mmdb
// assets/flags.json
package bingeoip
import (
@@ -43,6 +44,24 @@ func assetsGeolite2CityMmdb() (*asset, error) {
return a, err
}
// assetsFlagsJson reads file data from disk. It returns an error on failure.
func assetsFlagsJson() (*asset, error) {
path := "assets/flags.json"
name := "assets/flags.json"
bytes, err := bindataRead(path, name)
if err != nil {
return nil, err
}
fi, err := os.Stat(path)
if err != nil {
err = fmt.Errorf("Error reading asset info %s at %s: %v", name, path, err)
}
a := &asset{bytes: bytes, info: fi}
return a, err
}
// Asset loads and returns the asset for the given name.
// It returns an error if the asset could not be found or
// could not be loaded.
@@ -96,6 +115,7 @@ func AssetNames() []string {
// _bindata is a table, holding each asset generator, mapped to its name.
var _bindata = map[string]func() (*asset, error){
"assets/GeoLite2-City.mmdb": assetsGeolite2CityMmdb,
"assets/flags.json": assetsFlagsJson,
}
// AssetDir returns the file names below a certain
@@ -141,6 +161,7 @@ type bintree struct {
var _bintree = &bintree{nil, map[string]*bintree{
"assets": &bintree{nil, map[string]*bintree{
"GeoLite2-City.mmdb": &bintree{assetsGeolite2CityMmdb, map[string]*bintree{}},
"flags.json": &bintree{assetsFlagsJson, map[string]*bintree{}},
}},
}}

View File

@@ -1,6 +1,9 @@
package proxy
import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net"
"os"
@@ -16,27 +19,61 @@ func InitGeoIpDB() {
if err != nil {
panic(err)
}
geoIp = NewGeoIP("assets/GeoLite2-City.mmdb")
err = bingeoip.RestoreAsset("", "assets/flags.json")
if err != nil {
panic(err)
}
geoIp = NewGeoIP("assets/GeoLite2-City.mmdb", "assets/flags.json")
}
// GeoIP2
type GeoIP struct {
db *geoip2.Reader
db *geoip2.Reader
emojiMap map[string]string
}
type CountryEmoji struct {
Code string `json:"code"`
Emoji string `json:"emoji"`
}
// new geoip from db file
func NewGeoIP(filePath string) (geoip GeoIP) {
func NewGeoIP(geodb, flags string) (geoip GeoIP) {
// 判断文件是否存在
_, err := os.Stat(filePath)
_, err := os.Stat(geodb)
if err != nil && os.IsNotExist(err) {
log.Println("文件不存在,请自行下载 Geoip2 City库并保存在", filePath)
log.Println("文件不存在,请自行下载 Geoip2 City库并保存在", geodb)
os.Exit(1)
} else {
db, err := geoip2.Open(filePath)
db, err := geoip2.Open(geodb)
if err != nil {
log.Fatal(err)
}
geoip = GeoIP{db: db}
geoip.db = db
}
_, err = os.Stat(flags)
if err != nil && os.IsNotExist(err) {
log.Println("flags 文件不存在,请自行下载 flags.json并保存在", flags)
os.Exit(1)
} else {
data, err := ioutil.ReadFile(flags)
if err != nil {
log.Fatal(err)
return
}
var countryEmojiList = make([]CountryEmoji, 0)
err = json.Unmarshal(data, &countryEmojiList)
if err != nil {
log.Fatalln(err.Error())
return
}
emojiMap := make(map[string]string)
for _, i := range countryEmojiList {
emojiMap[i.Code] = i.Emoji
}
geoip.emojiMap = emojiMap
}
return
}
@@ -47,10 +84,22 @@ func (g GeoIP) Find(ipORdomain string) (ip, country string, err error) {
if err != nil {
return "", "", err
}
ipData := net.ParseIP(ips[0].String())
record, err := g.db.City(ipData)
ip = ips[0].String()
var record *geoip2.City
record, err = g.db.City(ips[0])
if err != nil {
return "", "", err
return
}
return ips[0].String(), record.Country.IsoCode, nil
countryIsoCode := record.Country.IsoCode
if countryIsoCode == "" {
country = fmt.Sprintf("🏁 ZZ")
}
emoji, found := g.emojiMap[countryIsoCode]
if found {
country = fmt.Sprintf("%v %v", emoji, countryIsoCode)
} else {
country = fmt.Sprintf("🏁 ZZ")
}
return
}

View File

@@ -71,8 +71,8 @@ func (ps ProxyList) NameAddCounrty() ProxyList {
go func() {
defer wg.Done()
_, country, err := geoIp.Find(ps[ii].BaseInfo().Server)
if err != nil || country == "" {
country = "ZZ"
if err != nil {
country = "🏁 ZZ"
}
ps[ii].SetName(fmt.Sprintf("%s", country))
//ps[ii].SetIP(ip)
@@ -85,7 +85,7 @@ func (ps ProxyList) NameAddCounrty() ProxyList {
func (ps ProxyList) NameAddIndex() ProxyList {
num := len(ps)
for i := 0; i < num; i++ {
ps[i].SetName(fmt.Sprintf("%s_%d", ps[i].BaseInfo().Name, i+1))
ps[i].SetName(fmt.Sprintf("%s_%+02v", ps[i].BaseInfo().Name, i+1))
}
return ps
}
@@ -94,8 +94,9 @@ func (ps ProxyList) NameReIndex() ProxyList {
num := len(ps)
for i := 0; i < num; i++ {
originName := ps[i].BaseInfo().Name
country := string([]rune(originName)[:2])
ps[i].SetName(fmt.Sprintf("%s_%d", country, i+1))
// country := string([]rune(originName)[:2])
country := string([]rune(originName)[:5])
ps[i].SetName(fmt.Sprintf("%s_%+02v", country, i+1))
}
return ps
}