diff --git a/pkg/proxy/link_test.go b/pkg/proxy/link_test.go index 1edea19..17a98ce 100644 --- a/pkg/proxy/link_test.go +++ b/pkg/proxy/link_test.go @@ -19,6 +19,20 @@ func TestSSLink(t *testing.T) { fmt.Println(ss) } +func TestSSRLink(t *testing.T) { + ssr, err := ParseSSRLink("ssr://MTcyLjEwNC4xNjEuNTQ6ODA5OTpvcmlnaW46YWVzLTI1Ni1jZmI6cGxhaW46WlVsWE1FUnVhelk1TkRVMFpUWnVVM2QxYzNCMk9VUnRVekl3TVhSUk1FUT0vP29iZnNwYXJhbT0mcHJvdG9wYXJhbT0mcmVtYXJrcz01Ny03NWFLWjVZV2FNakl6TGpFejVwYXc1WXFnNVoyaCZncm91cD01cGF3NVlxZzVaMmg=") + if err != nil { + t.Error(err) + } + fmt.Println(ssr) + fmt.Println(ssr.Link()) + ssr, err = ParseSSRLink(ssr.Link()) + if err != nil { + t.Error(err) + } + fmt.Println(ssr) +} + func TestTrojanLink(t *testing.T) { trojan, err := ParseTrojanLink("trojan://65474277@sqcu.hostmsu.ru:55551?allowinsecure=0&peer=mza.hkfq.xyz&mux=1&ws=0&wspath=&wshost=&ss=0&ssmethod=aes-128-gcm&sspasswd=&group=#%E9%A6%99%E6%B8%AFCN2-MZA%E8%8A%82%E7%82%B9-%E5%AE%BF%E8%BF%81%E8%81%94%E9%80%9A%E4%B8%AD%E8%BD%AC") if err != nil { diff --git a/pkg/proxy/shadowsocksr.go b/pkg/proxy/shadowsocksr.go index 489efe5..2319152 100644 --- a/pkg/proxy/shadowsocksr.go +++ b/pkg/proxy/shadowsocksr.go @@ -3,6 +3,7 @@ package proxy import ( "encoding/json" "errors" + "fmt" "math/rand" "net" "net/url" @@ -61,6 +62,18 @@ func (ssr ShadowsocksR) Clone() Proxy { return &ssr } +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)) + query := url.Values{} + query.Add("obfsparam", tool.Base64EncodeString(ssr.ObfsParam)) + query.Add("protoparam", tool.Base64EncodeString(ssr.ProtocolParam)) + query.Add("remarks", tool.Base64EncodeString(ssr.Name)) + query.Add("group", tool.Base64EncodeString("proxy.tgbot.co")) + payload = tool.Base64EncodeString(fmt.Sprintf("%s/?%s", payload, query.Encode())) + return fmt.Sprintf("ssr://%s", payload) +} + func ParseSSRLink(link string) (*ShadowsocksR, error) { if !strings.HasPrefix(link, "ssr") { return nil, ErrorNotSSRLink