1
0
mirror of https://github.com/proxysu/ProxySU.git synced 2024-11-23 05:36:08 +03:00
ProxySU/ProxySU_Core/Models/ShareLink.cs

170 lines
5.4 KiB
C#
Raw Normal View History

2021-03-17 06:58:56 +03:00
using Newtonsoft.Json;
using ProxySU_Core.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;
namespace ProxySU_Core.Models
{
public class ShareLink
{
public static string Build(XrayType xrayType, XraySettings settings)
{
switch (xrayType)
{
2021-03-26 13:13:32 +03:00
case XrayType.VLESS_TCP:
2021-03-17 06:58:56 +03:00
case XrayType.VLESS_TCP_XTLS:
2021-03-26 13:13:32 +03:00
case XrayType.VLESS_WS:
case XrayType.Trojan_TCP:
2021-03-17 06:58:56 +03:00
return BuildVlessShareLink(xrayType, settings);
2021-03-26 13:13:32 +03:00
case XrayType.VMESS_TCP:
case XrayType.VMESS_WS:
2021-03-17 06:58:56 +03:00
return BuildVmessShareLink(xrayType, settings);
default:
return string.Empty;
}
}
private static string BuildVmessShareLink(XrayType xrayType, XraySettings settings)
{
var vmess = new Vmess
{
v = "2",
add = settings.Domain,
port = settings.Port.ToString(),
id = settings.UUID,
aid = "0",
net = "",
type = "none",
host = settings.Domain,
path = "",
tls = "tls",
ps = "",
};
switch (xrayType)
{
2021-03-26 13:13:32 +03:00
case XrayType.VMESS_TCP:
2021-03-17 06:58:56 +03:00
vmess.ps = "vmess-tcp-tls";
vmess.net = "tcp";
vmess.type = "http";
vmess.path = settings.VMESS_TCP_Path;
break;
2021-03-26 13:13:32 +03:00
case XrayType.VMESS_WS:
2021-03-17 06:58:56 +03:00
vmess.ps = "vmess-ws-tls";
vmess.net = "ws";
vmess.type = "none";
vmess.path = settings.VMESS_WS_Path;
break;
default:
return string.Empty;
}
var base64Url = Base64.Encode(JsonConvert.SerializeObject(vmess));
return $"vmess://" + base64Url;
}
private static string BuildVlessShareLink(XrayType xrayType, XraySettings settings)
{
var _protocol = string.Empty;
var _uuid = settings.UUID;
var _domain = settings.Domain;
var _port = settings.Port;
var _type = string.Empty;
var _encryption = string.Empty;
var _security = "tls";
var _path = "/";
var _host = settings.Domain;
var _descriptiveText = string.Empty;
switch (xrayType)
{
2021-03-26 13:13:32 +03:00
case XrayType.VLESS_TCP:
2021-03-17 06:58:56 +03:00
_protocol = "vless";
_type = "tcp";
_encryption = "none";
_descriptiveText = "vless-tcp-tls";
break;
case XrayType.VLESS_TCP_XTLS:
_protocol = "vless";
_type = "tcp";
_security = "xtls";
_encryption = "none";
_descriptiveText = "vless-tcp-xtls";
break;
2021-03-26 13:13:32 +03:00
case XrayType.VLESS_WS:
2021-03-17 06:58:56 +03:00
_protocol = "vless";
_type = "ws";
_path = settings.VLESS_WS_Path;
_encryption = "none";
_descriptiveText = "vless-ws-tls";
break;
2021-03-26 13:13:32 +03:00
case XrayType.VMESS_TCP:
2021-03-17 06:58:56 +03:00
_protocol = "vmess";
_type = "tcp";
_path = settings.VMESS_TCP_Path;
_encryption = "auto";
_descriptiveText = "vmess-tcp-tls";
break;
2021-03-26 13:13:32 +03:00
case XrayType.VMESS_WS:
2021-03-17 06:58:56 +03:00
_protocol = "vmess";
_type = "ws";
_path = settings.VMESS_WS_Path;
_encryption = "auto";
_descriptiveText = "vmess-ws-tls";
break;
2021-03-26 13:13:32 +03:00
case XrayType.Trojan_TCP:
2021-03-17 06:58:56 +03:00
_protocol = "trojan";
_descriptiveText = "trojan-tcp";
break;
default:
throw new Exception("暂未实现的协议");
}
string parametersURL = string.Empty;
2021-03-26 13:13:32 +03:00
if (xrayType != XrayType.Trojan_TCP)
2021-03-17 06:58:56 +03:00
{
// 4.3 传输层相关段
parametersURL = $"?type={_type}&encryption={_encryption}&security={_security}&host={_host}&path={HttpUtility.UrlEncode(_path)}";
// if mKCP
// if QUIC
// 4.4 TLS 相关段
if (xrayType == XrayType.VLESS_TCP_XTLS)
{
parametersURL += "&flow=xtls-rprx-direct";
}
}
return $"{_protocol}://{HttpUtility.UrlEncode(_uuid)}@{_domain}:{_port}{parametersURL}#{HttpUtility.UrlEncode(_descriptiveText)}";
}
}
class Vmess
{
public string v { get; set; }
public string ps { get; set; }
public string add { get; set; }
public string port { get; set; }
public string id { get; set; }
public string aid { get; set; }
public string net { get; set; }
public string type { get; set; }
public string host { get; set; }
public string path { get; set; }
public string tls { get; set; }
}
}