try surge list
This commit is contained in:
@@ -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() {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
2
go.mod
2
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
|
||||
)
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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",
|
||||
|
||||
37
provider/surge.go
Normal file
37
provider/surge.go
Normal file
@@ -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
|
||||
}
|
||||
@@ -11,6 +11,7 @@ type Base struct {
|
||||
type Proxy interface {
|
||||
String() string
|
||||
ToClash() string
|
||||
ToSurge() string
|
||||
Identifier() string
|
||||
SetName(name string)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user