Преглед на файлове

add link export for vmess

zu1k преди 5 години
родител
ревизия
9de327fb29
променени са 6 файла, в които са добавени 55 реда и са изтрити 4 реда
  1. 1 0
      go.sum
  2. 1 0
      pkg/proxy/base.go
  3. 14 0
      pkg/proxy/link_test.go
  4. 1 0
      pkg/proxy/shadowsocksr.go
  5. 34 4
      pkg/proxy/vmess.go
  6. 4 0
      pkg/tool/base64.go

+ 1 - 0
go.sum

@@ -203,6 +203,7 @@ github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeV
 github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
 github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
 github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
+github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a h1:pa8hGb/2YqsZKovtsgrwcDH1RZhVbTKCjLp47XpqCDs=
 github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
 github.com/soveran/redisurl v0.0.0-20180322091936-eb325bc7a4b8/go.mod h1:FVJ8jbHu7QrNFs3bZEsv/L5JjearIAY9N0oXh2wk+6Y=
 github.com/spf13/cobra v0.0.2/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=

+ 1 - 0
pkg/proxy/base.go

@@ -36,6 +36,7 @@ type Proxy interface {
 	String() string
 	ToClash() string
 	ToSurge() string
+	Link() string
 	Identifier() string
 	SetName(name string)
 	SetIP(ip string)

+ 14 - 0
pkg/proxy/link_test.go

@@ -46,3 +46,17 @@ func TestTrojanLink(t *testing.T) {
 	}
 	fmt.Println(trojan)
 }
+
+func TestVmessLink(t *testing.T) {
+	v, err := ParseVmessLink("vmess://ew0KICAidiI6ICIyIiwNCiAgInBzIjogIuW+ruS/oeWFrOS8l+WPtyDlpJrlvannmoTlpKfljYPkuJbnlYwiLA0KICAiYWRkIjogInMyNzEuc25vZGUueHl6IiwNCiAgInBvcnQiOiAiNDQzIiwNCiAgImlkIjogIjZhOTAwZDYzLWNiOTItMzVhMC1hZWYwLTNhMGMxMWFhODUyMyIsDQogICJhaWQiOiAiMSIsDQogICJuZXQiOiAid3MiLA0KICAidHlwZSI6ICJub25lIiwNCiAgImhvc3QiOiAiczI3MS5zbm9kZS54eXoiLA0KICAicGF0aCI6ICIvcGFuZWwiLA0KICAidGxzIjogInRscyINCn0=")
+	if err != nil {
+		t.Error(err)
+	}
+	fmt.Println(v)
+	fmt.Println(v.Link())
+	v, err = ParseVmessLink(v.Link())
+	if err != nil {
+		t.Error(err)
+	}
+	fmt.Println(v)
+}

+ 1 - 0
pkg/proxy/shadowsocksr.go

@@ -62,6 +62,7 @@ func (ssr ShadowsocksR) Clone() Proxy {
 	return &ssr
 }
 
+// https://github.com/HMBSbige/ShadowsocksR-Windows/wiki/SSR-QRcode-scheme
 func (ssr ShadowsocksR) Link() (link string) {
 	payload := fmt.Sprintf("%s:%d:%s:%s:%s:%s",
 		ssr.Server, ssr.Port, ssr.Protocol, ssr.Cipher, ssr.Obfs, tool.Base64EncodeString(ssr.Password))

+ 34 - 4
pkg/proxy/vmess.go

@@ -86,6 +86,14 @@ func (v Vmess) Clone() Proxy {
 	return &v
 }
 
+func (v Vmess) Link() (link string) {
+	vjv, err := json.Marshal(v.toLinkJson())
+	if err != nil {
+		return
+	}
+	return fmt.Sprintf("vmess://%s", tool.Base64EncodeBytes(vjv))
+}
+
 type vmessLinkJson struct {
 	Add  string      `json:"add"`
 	V    string      `json:"v"`
@@ -100,6 +108,27 @@ type vmessLinkJson struct {
 	Tls  string      `json:"tls"`
 }
 
+func (v Vmess) toLinkJson() vmessLinkJson {
+	vj := vmessLinkJson{
+		Add:  v.Server,
+		Ps:   v.Name,
+		Port: v.Port,
+		Id:   v.UUID,
+		Aid:  strconv.Itoa(v.AlterID),
+		Net:  v.Network,
+		Path: v.WSPath,
+		Host: v.ServerName,
+		V:    "2",
+	}
+	if v.TLS {
+		vj.Tls = "tls"
+	}
+	if host, ok := v.WSHeaders["HOST"]; ok && host != "" {
+		vj.Host = host
+	}
+	return vj
+}
+
 func ParseVmessLink(link string) (*Vmess, error) {
 	if !strings.HasPrefix(link, "vmess") {
 		return nil, ErrorNotVmessLink
@@ -190,10 +219,11 @@ func ParseVmessLink(link string) (*Vmess, error) {
 		}
 		port := 443
 		portInterface := vmessJson.Port
-		if i, ok := portInterface.(int); ok {
-			port = i
-		} else if s, ok := portInterface.(string); ok {
-			port, _ = strconv.Atoi(s)
+		switch portInterface.(type) {
+		case int:
+			port = portInterface.(int)
+		case string:
+			port, _ = strconv.Atoi(portInterface.(string))
 		}
 
 		alterId, err := strconv.Atoi(vmessJson.Aid)

+ 4 - 0
pkg/tool/base64.go

@@ -30,3 +30,7 @@ func Base64DecodeString(src string) (dst string, err error) {
 func Base64EncodeString(origin string) (result string) {
 	return base64.StdEncoding.EncodeToString([]byte(origin))
 }
+
+func Base64EncodeBytes(origin []byte) (result string) {
+	return base64.StdEncoding.EncodeToString([]byte(origin))
+}