From 5222a11d2036fcaf87825db170c832f740e4683d Mon Sep 17 00:00:00 2001 From: zu1k Date: Fri, 14 Aug 2020 10:24:15 +0800 Subject: [PATCH] try surge list --- api/router.go | 11 +++++++++++ app/task.go | 2 ++ go.mod | 2 +- provider/base.go | 9 +++++++++ provider/clash.go | 9 --------- provider/surge.go | 37 +++++++++++++++++++++++++++++++++++++ proxy/base.go | 1 + proxy/shadowsocks.go | 12 ++++++++++++ proxy/shadowsocksr.go | 4 ++++ proxy/vmess.go | 20 ++++++++++++++++++++ 10 files changed, 97 insertions(+), 10 deletions(-) create mode 100644 provider/surge.go diff --git a/api/router.go b/api/router.go index edb514e..05d6e9f 100644 --- a/api/router.go +++ b/api/router.go @@ -13,6 +13,7 @@ var router *gin.Engine func setupRouter() { router = gin.Default() + router.StaticFile("/", "example/clash.html") router.StaticFile("/clash", "example/clash.html") router.StaticFile("/clash/config", "example/clash-config.yaml") router.GET("/clash/proxies", func(c *gin.Context) { @@ -25,6 +26,16 @@ func setupRouter() { } c.String(200, text) }) + router.GET("/surge/proxies", func(c *gin.Context) { + text := cache.GetString("surgeproxies") + if text == "" { + proxies := cache.GetProxies() + surge := provider.Surge{Proxies: proxies} + text = surge.Provide() + cache.SetString("surgeproxies", text) + } + c.String(200, text) + }) } func Run() { diff --git a/app/task.go b/app/task.go index 744935b..4fa8670 100644 --- a/app/task.go +++ b/app/task.go @@ -37,6 +37,7 @@ func Crawl() { log.Println("Crawl node count:", num) cache.SetProxies(proxies) cache.SetString("clashproxies", provider.Clash{Proxies: proxies}.Provide()) + cache.SetString("surgeproxies", provider.Surge{Proxies: proxies}.Provide()) } func CrawlGo() { @@ -68,6 +69,7 @@ func CrawlGo() { log.Println("CrawlGo node count:", num) cache.SetProxies(proxies) cache.SetString("clashproxies", provider.Clash{Proxies: proxies}.Provide()) + cache.SetString("surgeproxies", provider.Surge{Proxies: proxies}.Provide()) } func FetchNewConfigFileThenInit() { diff --git a/go.mod b/go.mod index a22bc9a..b7b0800 100644 --- a/go.mod +++ b/go.mod @@ -31,5 +31,5 @@ require ( google.golang.org/appengine v1.6.6 // indirect google.golang.org/protobuf v1.25.0 // indirect gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect - gopkg.in/yaml.v2 v2.3.0 // indirect + gopkg.in/yaml.v2 v2.3.0 ) diff --git a/provider/base.go b/provider/base.go index 457e384..4e9ae37 100644 --- a/provider/base.go +++ b/provider/base.go @@ -3,3 +3,12 @@ package provider type Provider interface { Provide() string } + +func checkInList(list []string, item string) bool { + for _, i := range list { + if item == i { + return true + } + } + return false +} diff --git a/provider/clash.go b/provider/clash.go index c889d2a..3cd58f3 100644 --- a/provider/clash.go +++ b/provider/clash.go @@ -46,15 +46,6 @@ func checkClashSupport(p proxy.Proxy) bool { return false } -func checkInList(list []string, item string) bool { - for _, i := range list { - if item == i { - return true - } - } - return false -} - var ssrCipherList = []string{ "aes-128-cfb", "aes-192-cfb", diff --git a/provider/surge.go b/provider/surge.go new file mode 100644 index 0000000..657a724 --- /dev/null +++ b/provider/surge.go @@ -0,0 +1,37 @@ +package provider + +import ( + "strings" + + "github.com/zu1k/proxypool/proxy" +) + +type Surge struct { + Proxies []proxy.Proxy `yaml:"proxies"` +} + +func (s Surge) Provide() string { + var resultBuilder strings.Builder + + for _, p := range s.Proxies { + if checkClashSupport(p) { + resultBuilder.WriteString(p.ToSurge() + "\n") + } + } + + return resultBuilder.String() +} + +func checkSurgeSupport(p proxy.Proxy) bool { + switch p.(type) { + case *proxy.ShadowsocksR: + return false + case *proxy.Vmess: + return true + case *proxy.Shadowsocks: + return true + default: + return false + } + return false +} diff --git a/proxy/base.go b/proxy/base.go index 21715df..608ba19 100644 --- a/proxy/base.go +++ b/proxy/base.go @@ -11,6 +11,7 @@ type Base struct { type Proxy interface { String() string ToClash() string + ToSurge() string Identifier() string SetName(name string) } diff --git a/proxy/shadowsocks.go b/proxy/shadowsocks.go index c5c793c..5aa62f0 100644 --- a/proxy/shadowsocks.go +++ b/proxy/shadowsocks.go @@ -3,6 +3,7 @@ package proxy import ( "encoding/json" "errors" + "fmt" "math/rand" "net" "net/url" @@ -45,6 +46,17 @@ func (ss Shadowsocks) ToClash() string { return "- " + string(data) } +func (ss Shadowsocks) ToSurge() string { + // node1 = ss, server, port, encrypt-method=, password=, obfs=, obfs-host=, udp-relay=false + if ss.Plugin == "obfs" { + return fmt.Sprintf("%s = ss, %s, %d, encrypt-method=%s, password=%s, obfs=%s, obfs-host=%s, udp-relay=false", + ss.Name, ss.Server, ss.Port, ss.Cipher, ss.Password, ss.PluginOpts["mode"], ss.PluginOpts["host"]) + } else { + return fmt.Sprintf("%s = ss, %s, %d, encrypt-method=%s, password=%s, udp-relay=false", + ss.Name, ss.Server, ss.Port, ss.Cipher, ss.Password) + } +} + func (ss *Shadowsocks) SetName(name string) { ss.Name = name } diff --git a/proxy/shadowsocksr.go b/proxy/shadowsocksr.go index cfb4d2b..521edb7 100644 --- a/proxy/shadowsocksr.go +++ b/proxy/shadowsocksr.go @@ -53,6 +53,10 @@ func (ssr ShadowsocksR) ToClash() string { return "- " + string(data) } +func (ssr ShadowsocksR) ToSurge() string { + return "" +} + func (ssr *ShadowsocksR) SetName(name string) { ssr.Name = name } diff --git a/proxy/vmess.go b/proxy/vmess.go index 25e4141..beb15ca 100644 --- a/proxy/vmess.go +++ b/proxy/vmess.go @@ -3,6 +3,7 @@ package proxy import ( "encoding/json" "errors" + "fmt" "math/rand" "net" "net/url" @@ -58,6 +59,25 @@ func (v Vmess) ToClash() string { return "- " + string(data) } +func (v Vmess) ToSurge() string { + // node2 = vmess, server, port, username=, ws=true, ws-path=, ws-headers= + if v.Network == "ws" { + wsHeasers := "" + for k, v := range v.WSHeaders { + if wsHeasers == "" { + wsHeasers = k + ":" + v + } else { + wsHeasers += "|" + k + ":" + v + } + } + return fmt.Sprintf("%s = vmess, %s, %d, username=%s, ws=true, tls=%t, ws-path=%s, ws-headers=%s", + v.Name, v.Server, v.Port, v.UUID, v.TLS, v.WSPath, wsHeasers) + } else { + return fmt.Sprintf("%s = vmess, %s, %d, username=%s, tls=%t", + v.Name, v.Server, v.Port, v.UUID, v.TLS) + } +} + func (v *Vmess) SetName(name string) { v.Name = name }