diff --git a/app/Http/Controllers/Client/ClientController.php b/app/Http/Controllers/Client/ClientController.php index 8e8753d6..132321e8 100644 --- a/app/Http/Controllers/Client/ClientController.php +++ b/app/Http/Controllers/Client/ClientController.php @@ -5,6 +5,7 @@ namespace App\Http\Controllers\Client; use App\Http\Controllers\Controller; use App\Services\ServerService; use App\Utils\Clash; +use App\Utils\Origin; use App\Utils\QuantumultX; use App\Utils\Shadowrocket; use App\Utils\Shadowsocks; @@ -49,10 +50,27 @@ class ClientController extends Controller die($this->shaodowsocksSIP008($user, $servers)); } } - die('当前客户端不支持获取配置'); + die($this->origin($user, $servers)); } } + private function origin($user, $servers = []) + { + $uri = ''; + foreach ($servers as $item) { + if ($item['type'] === 'shadowsocks') { + $uri .= Origin::buildShadowsocks($item, $user); + } + if ($item['type'] === 'v2ray') { + $uri .= Origin::buildVmess($item, $user); + } + if ($item['type'] === 'trojan') { + $uri .= Origin::buildTrojan($item, $user); + } + } + return base64_encode($uri); + } + private function shadowrocket($user, $servers = []) { $uri = ''; diff --git a/app/Utils/Origin.php b/app/Utils/Origin.php new file mode 100644 index 00000000..75b9e04d --- /dev/null +++ b/app/Utils/Origin.php @@ -0,0 +1,59 @@ + "2", + "ps" => $server['name'], + "add" => $server['host'], + "port" => (string)$server['port'], + "id" => $user['uuid'], + "aid" => (string)$server['alter_id'], + "net" => $server['network'], + "type" => "none", + "host" => "", + "path" => "", + "tls" => $server['tls'] ? "tls" : "", + "sni" => $server['tls'] ? json_decode($server['tlsSettings'], true)['serverName'] : "" + ]; + if ((string)$server['network'] === 'ws') { + $wsSettings = json_decode($server['networkSettings'], true); + if (isset($wsSettings['path'])) $config['path'] = $wsSettings['path']; + if (isset($wsSettings['headers']['Host'])) $config['host'] = $wsSettings['headers']['Host']; + } + if ((string)$server['network'] === 'grpc') { + $grpcSettings = json_decode($server['networkSettings'], true); + if (isset($grpcSettings['path'])) $config['path'] = $grpcSettings['serviceName']; + } + return "vmess://" . base64_encode(json_encode($config)) . "\r\n"; + } + + public static function buildTrojan($server, User $user) + { + $name = rawurlencode($server['name']); + $query = http_build_query([ + 'allowInsecure' => $server['allow_insecure'], + 'peer' => $server['server_name'], + 'sni' => $server['server_name'] + ]); + $uri = "trojan://{$user['uuid']}@{$server['host']}:{$server['port']}?{$query}#{$name}"; + $uri .= "\r\n"; + return $uri; + } +}