Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6421e09c8e | ||
|
|
c3698f8ed5 | ||
|
|
84d037c0b8 | ||
|
|
ff52fc0ed1 | ||
|
|
2f731b0acb | ||
|
|
cedd5b4ec4 |
2
.github/workflows/go.yml
vendored
2
.github/workflows/go.yml
vendored
@@ -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
|
||||
|
||||
@@ -53,8 +53,6 @@ $ go get -u -v github.com/zu1k/proxypool
|
||||
|
||||
从这里下载预编译好的程序 [release](https://github.com/zu1k/proxypool/releases)
|
||||
|
||||
除了编译好的二进制程序,你还需要下载仓库 `assets` 文件夹,放置在可执行文件同目录
|
||||
|
||||
### 使用docker
|
||||
|
||||
```sh
|
||||
|
||||
@@ -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
2000
assets/flags.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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()
|
||||
|
||||
@@ -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{}},
|
||||
}},
|
||||
}}
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user