浏览代码

feat: 添加v2rayN、v2rayNG、v2rayU客户端订阅方式 (#180)

BobCoderS9 4 年之前
父节点
当前提交
634aba049d
共有 3 个文件被更改,包括 73 次插入0 次删除
  1. 44 0
      app/Components/Client/V2rayN.php
  2. 28 0
      app/Http/Controllers/ClientController.php
  3. 1 0
      resources/views/user/index.blade.php

+ 44 - 0
app/Components/Client/V2rayN.php

@@ -0,0 +1,44 @@
+<?php
+
+namespace App\Components\Client;
+
+class V2rayN
+{
+    public static function buildShadowsocksr($server)
+    {
+        $setting = "{$server['host']}:{$server['port']}:{$server['protocol']}:{$server['method']}:{$server['obfs']}:";
+
+        return 'ssr://'.base64url_encode($setting.base64url_encode($server['passwd']).'/?obfsparam='.base64url_encode($server['obfs_param']).'&protoparam='.base64url_encode($server['protocol_param']).'&remarks='.base64url_encode($server['name']).'&group='.base64url_encode($server['group']).'&udpport='.$server['udp'].'&uot=0').PHP_EOL;
+    }
+
+    public static function buildVmess($server)
+    {
+        $config = [
+            'v' => '2',
+            'ps' => $server['name'],
+            'add' => $server['host'],
+            'port' => $server['port'],
+            'id' => $server['uuid'],
+            'aid' => $server['v2_alter_id'],
+            'net' => $server['v2_net'],
+            'type' => $server['v2_type'],
+            'host' => $server['v2_host'],
+            'path' => $server['v2_path'],
+            'tls' => $server['v2_tls'],
+            'remark' => $server['name'],
+        ];
+
+        return 'vmess://'.base64_encode(json_encode($config)).PHP_EOL;
+    }
+
+    public static function buildTrojan($server)
+    {
+        $name = rawurlencode($server['name']);
+        $query = '';
+        if (array_key_exists('relay_server', $server)) {
+            $query = "?sni={$server['relay_server']}";
+        }
+
+        return "trojan://{$server['passwd']}@{$server['host']}:{$server['port']}{$query}#{$name}".PHP_EOL;
+    }
+}

+ 28 - 0
app/Http/Controllers/ClientController.php

@@ -7,6 +7,7 @@ use App\Components\Client\QuantumultX;
 use App\Components\Client\Surfboard;
 use App\Components\Client\Surge;
 use App\Components\Client\URLSchemes;
+use App\Components\Client\V2rayN;
 use App\Models\User;
 use File;
 use Symfony\Component\Yaml\Yaml;
@@ -33,6 +34,15 @@ class ClientController extends Controller
         if (strpos($target, 'shadowrocket') !== false) {
             return $this->shadowrocket($user, $servers);
         }
+        if (strpos($target, 'v2rayn') !== false) {
+            return $this->v2rayN($servers);
+        }
+        if (strpos($target, 'v2rayng') !== false) {
+            return $this->v2rayN($servers);
+        }
+        if (strpos($target, 'v2rayu') !== false) {
+            return $this->v2rayN($servers);
+        }
 //            if (strpos($target, 'shadowsocks') !== false) {
 //                exit($this->shaodowsocksSIP008($servers));
 //            }
@@ -222,4 +232,22 @@ class ClientController extends Controller
 
         return json_encode(['version' => 1, 'remark' => sysConfig('website_name'), 'servers' => $configs ?? []], JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT);
     }
+
+    private function v2rayN($servers)
+    {
+        $uri = '';
+        foreach ($servers as $server) {
+            if ($server['type'] === 'shadowsocksr') {
+                $uri .= V2rayN::buildShadowsocksr($server);
+            }
+            if ($server['type'] === 'v2ray') {
+                $uri .= V2rayN::buildVmess($server);
+            }
+            if ($server['type'] === 'trojan') {
+                $uri .= V2rayN::buildTrojan($server);
+            }
+        }
+
+        return base64_encode($uri);
+    }
 }

+ 1 - 0
resources/views/user/index.blade.php

@@ -170,6 +170,7 @@
                                                     <option value="surfboard">Surfboard</option>
                                                     <option value="surge">Surge</option>
                                                     <option value="shadowrocket">Shadowrocket</option>
+                                                    <option value="v2rayn">v2rayN</option>
                                                     {{--                                                    <option value="shadowsocks">SS路由器</option>--}}
                                                 </select>
                                             </div>