1
0

V2rayN.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. <?php
  2. namespace App\Http\Controllers\Client\Protocols;
  3. use App\Utils\Helper;
  4. class V2rayN
  5. {
  6. public $flag = 'v2rayn';
  7. private $servers;
  8. private $user;
  9. public function __construct($user, $servers)
  10. {
  11. $this->user = $user;
  12. $this->servers = $servers;
  13. }
  14. public function handle()
  15. {
  16. $servers = $this->servers;
  17. $user = $this->user;
  18. $uri = '';
  19. foreach ($servers as $item) {
  20. if ($item['type'] === 'vmess') {
  21. $uri .= self::buildVmess($user['uuid'], $item);
  22. }
  23. if ($item['type'] === 'shadowsocks') {
  24. $uri .= self::buildShadowsocks($user['uuid'], $item);
  25. }
  26. if ($item['type'] === 'trojan') {
  27. $uri .= self::buildTrojan($user['uuid'], $item);
  28. }
  29. }
  30. return base64_encode($uri);
  31. }
  32. public static function buildShadowsocks($password, $server)
  33. {
  34. if ($server['cipher'] === '2022-blake3-aes-128-gcm') {
  35. $serverKey = Helper::getServerKey($server['created_at'], 16);
  36. $userKey = Helper::uuidToBase64($password, 16);
  37. $password = "{$serverKey}:{$userKey}";
  38. }
  39. if ($server['cipher'] === '2022-blake3-aes-256-gcm') {
  40. $serverKey = Helper::getServerKey($server['created_at'], 32);
  41. $userKey = Helper::uuidToBase64($password, 32);
  42. $password = "{$serverKey}:{$userKey}";
  43. }
  44. $name = rawurlencode($server['name']);
  45. $str = str_replace(
  46. ['+', '/', '='],
  47. ['-', '_', ''],
  48. base64_encode("{$server['cipher']}:{$password}")
  49. );
  50. return "ss://{$str}@{$server['host']}:{$server['port']}#{$name}\r\n";
  51. }
  52. public static function buildVmess($uuid, $server)
  53. {
  54. $config = [
  55. "v" => "2",
  56. "ps" => $server['name'],
  57. "add" => $server['host'],
  58. "port" => (string)$server['port'],
  59. "id" => $uuid,
  60. "aid" => '0',
  61. "net" => $server['network'],
  62. "type" => "none",
  63. "host" => "",
  64. "path" => "",
  65. "tls" => $server['tls'] ? "tls" : "",
  66. ];
  67. if ($server['tls']) {
  68. if ($server['tlsSettings']) {
  69. $tlsSettings = $server['tlsSettings'];
  70. if (isset($tlsSettings['serverName']) && !empty($tlsSettings['serverName']))
  71. $config['sni'] = $tlsSettings['serverName'];
  72. }
  73. }
  74. if ((string)$server['network'] === 'tcp') {
  75. $tcpSettings = $server['networkSettings'];
  76. if (isset($tcpSettings['header']['type'])) $config['type'] = $tcpSettings['header']['type'];
  77. if (isset($tcpSettings['header']['request']['path'][0])) $config['path'] = $tcpSettings['header']['request']['path'][0];
  78. }
  79. if ((string)$server['network'] === 'ws') {
  80. $wsSettings = $server['networkSettings'];
  81. if (isset($wsSettings['path'])) $config['path'] = $wsSettings['path'];
  82. if (isset($wsSettings['headers']['Host'])) $config['host'] = $wsSettings['headers']['Host'];
  83. }
  84. if ((string)$server['network'] === 'grpc') {
  85. $grpcSettings = $server['networkSettings'];
  86. if (isset($grpcSettings['serviceName'])) $config['path'] = $grpcSettings['serviceName'];
  87. }
  88. return "vmess://" . base64_encode(json_encode($config)) . "\r\n";
  89. }
  90. public static function buildTrojan($password, $server)
  91. {
  92. $name = rawurlencode($server['name']);
  93. $query = http_build_query([
  94. 'allowInsecure' => $server['allow_insecure'],
  95. 'peer' => $server['server_name'],
  96. 'sni' => $server['server_name']
  97. ]);
  98. $uri = "trojan://{$password}@{$server['host']}:{$server['port']}?{$query}#{$name}";
  99. $uri .= "\r\n";
  100. return $uri;
  101. }
  102. }