init: 1.0.0
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
package shadowrocket
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/perfect-panel/ppanel-server/pkg/adapter/general"
|
||||
|
||||
"encoding/base64"
|
||||
|
||||
"github.com/perfect-panel/ppanel-server/pkg/adapter/proxy"
|
||||
"github.com/perfect-panel/ppanel-server/pkg/traffic"
|
||||
)
|
||||
|
||||
type UserInfo struct {
|
||||
Upload int64
|
||||
Download int64
|
||||
TotalTraffic int64
|
||||
ExpiredDate time.Time
|
||||
}
|
||||
|
||||
func BuildShadowrocket(servers []proxy.Proxy, uuid string, userinfo UserInfo) []byte {
|
||||
upload := traffic.AutoConvert(userinfo.Upload, false)
|
||||
download := traffic.AutoConvert(userinfo.Download, false)
|
||||
total := traffic.AutoConvert(userinfo.TotalTraffic, false)
|
||||
expiredAt := userinfo.ExpiredDate.Format("2006-01-02 15:04:05")
|
||||
uri := fmt.Sprintf("STATUS=🚀↑:%s,↓:%s,TOT:%s💡Expires:%s\r\n", upload, download, total, expiredAt)
|
||||
for _, s := range servers {
|
||||
switch s.Protocol {
|
||||
case "vmess":
|
||||
uri += buildVmess(s, uuid)
|
||||
case "shadowsocks":
|
||||
uri += general.ShadowsocksUri(s, uuid) + "\r\n"
|
||||
case "trojan":
|
||||
uri += general.TrojanUri(s, uuid) + "\r\n"
|
||||
case "vless":
|
||||
uri += general.VlessUri(s, uuid) + "\r\n"
|
||||
case "hysteria2":
|
||||
uri += general.Hysteria2Uri(s, uuid) + "\r\n"
|
||||
case "tuic":
|
||||
uri += general.TuicUri(s, uuid) + "\r\n"
|
||||
default:
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
return []byte(base64.StdEncoding.EncodeToString([]byte(uri)))
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
package shadowrocket
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/perfect-panel/ppanel-server/pkg/adapter/proxy"
|
||||
)
|
||||
|
||||
func createVMess() proxy.Proxy {
|
||||
return proxy.Proxy{
|
||||
Name: "Vmess",
|
||||
Server: "test.xxxx.com",
|
||||
Port: 13002,
|
||||
Protocol: "vmess",
|
||||
Option: proxy.Vmess{
|
||||
Port: 13002,
|
||||
Transport: "websocket",
|
||||
TransportConfig: proxy.TransportConfig{
|
||||
Path: "/ws",
|
||||
Host: "test.xx.com",
|
||||
},
|
||||
Security: "none",
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func createSS() proxy.Proxy {
|
||||
return proxy.Proxy{
|
||||
Name: "Shadowsocks",
|
||||
Server: "test.xxxx.com",
|
||||
Port: 10301,
|
||||
Protocol: "shadowsocks",
|
||||
Option: proxy.Shadowsocks{
|
||||
Port: 10301,
|
||||
Method: "aes-256-gcm",
|
||||
ServerKey: "123456",
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func createTrojan() proxy.Proxy {
|
||||
|
||||
return proxy.Proxy{
|
||||
Name: "Trojan",
|
||||
Server: "test.xxxx.com",
|
||||
Port: 13002,
|
||||
Protocol: "trojan",
|
||||
Option: proxy.Trojan{
|
||||
Port: 13002,
|
||||
Transport: "websocket",
|
||||
TransportConfig: proxy.TransportConfig{
|
||||
Path: "/ws",
|
||||
Host: "baidu.com",
|
||||
},
|
||||
SecurityConfig: proxy.SecurityConfig{
|
||||
SNI: "baidu.com",
|
||||
AllowInsecure: true,
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
func TestBuildShadowrocket(t *testing.T) {
|
||||
s := []proxy.Proxy{
|
||||
createVMess(),
|
||||
createSS(),
|
||||
createTrojan(),
|
||||
}
|
||||
uri := BuildShadowrocket(s, "uuid", UserInfo{
|
||||
Upload: 1024,
|
||||
Download: 1024,
|
||||
TotalTraffic: 2048,
|
||||
ExpiredDate: time.Now().AddDate(0, 0, 1),
|
||||
})
|
||||
t.Log(string(uri))
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
package shadowrocket
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"encoding/base64"
|
||||
|
||||
"github.com/perfect-panel/ppanel-server/pkg/adapter/proxy"
|
||||
)
|
||||
|
||||
func buildVmess(data proxy.Proxy, uuid string) string {
|
||||
vmess := data.Option.(proxy.Vmess)
|
||||
|
||||
userinfo := fmt.Sprintf("auto:%s@%s:%d", uuid, data.Server, data.Port)
|
||||
// 准备 config,使用默认值
|
||||
config := map[string]interface{}{
|
||||
"tfo": 1,
|
||||
"remark": data.Name,
|
||||
"alterId": 0,
|
||||
}
|
||||
|
||||
// tls 配置
|
||||
if vmess.Security == "tls" {
|
||||
config["tls"] = 1
|
||||
if vmess.SecurityConfig.AllowInsecure {
|
||||
config["allowInsecure"] = 1
|
||||
}
|
||||
if vmess.SecurityConfig.SNI != "" {
|
||||
config["peer"] = vmess.SecurityConfig.SNI
|
||||
}
|
||||
}
|
||||
|
||||
// transport 配置
|
||||
switch vmess.Transport {
|
||||
case "websocket":
|
||||
config["obfs"] = "websocket"
|
||||
if vmess.TransportConfig.Path != "" {
|
||||
config["path"] = vmess.TransportConfig.Path
|
||||
}
|
||||
if vmess.TransportConfig.Host != "" {
|
||||
config["obfsParam"] = vmess.TransportConfig.Host
|
||||
}
|
||||
case "grpc":
|
||||
config["obfs"] = "grpc"
|
||||
if vmess.TransportConfig.ServiceName != "" {
|
||||
config["path"] = vmess.TransportConfig.ServiceName
|
||||
}
|
||||
}
|
||||
query := make([]string, 0)
|
||||
for k, v := range config {
|
||||
query = append(query, fmt.Sprintf("%s=%v", k, v))
|
||||
}
|
||||
queryStr := strings.Join(query, "&")
|
||||
uri := fmt.Sprintf("vmess://%s?%s\r\n", base64.StdEncoding.EncodeToString([]byte(userinfo)), queryStr)
|
||||
return uri
|
||||
}
|
||||
Reference in New Issue
Block a user