init: 1.0.0

This commit is contained in:
Chang lue Tsen
2025-04-25 12:08:29 +09:00
commit 8addcc584b
1031 changed files with 76472 additions and 0 deletions
+48
View File
@@ -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))
}
+57
View File
@@ -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
}