diff --git a/app/bot.php b/app/bot.php index a9812d0..6ca9304 100644 --- a/app/bot.php +++ b/app/bot.php @@ -3519,12 +3519,15 @@ DNS-over-HTTPS with IP: public function userXr($i) { $c = $this->getXray(); - $pac = $this->getPacConf(); + $domain = $this->getPacConf()['domain'] ?: $this->ip; + $scheme = empty($this->nginxGetTypeCert()) ? 'http' : 'https'; + $hash = substr(md5($this->key), 0, 8); + $link = "$scheme://{$domain}/pac?h=$hash&t=s&s={$c['inbounds'][0]['settings']['clients'][$i]['id']}"; + + $text[] = "Menu -> " . $this->i18n('xray') . " -> {$c['inbounds'][0]['settings']['clients'][$i]['email']}\n"; - // $text[] = "uuid: {$c['inbounds'][0]['settings']['clients'][$i]['id']}"; - // $text[] = "shortId: {$c['inbounds'][0]['streamSettings']['realitySettings']['shortIds'][0]}"; - // $text[] = "pubkey: {$pac['xray']}"; - $text[] = "{$this->linkXray($i)}"; + $text[] = "{$this->linkXray($i)}\n"; + $text[] = "v2ray subscription: $link"; $data[] = [ [ @@ -3558,6 +3561,137 @@ DNS-over-HTTPS with IP: ); } + public function v2raySubscription($key) + { + $domain = $this->getPacConf()['domain'] ?: $this->ip; + $xr = $this->getXray(); + $pac = $this->getPacConf(); + + $flag = true; + foreach ($xr['inbounds'][0]['settings']['clients'] as $k => $v) { + if ($v['id'] == $key) { + $flag = false; + break; + } + } + if ($flag) { + return; + } + + $c = [ + "log" => [ + "access" => "", + "error" => "", + "loglevel" => "warning" + ], + "inbounds" => [ + [ + "tag" => "socks", + "port" => 10808, + "listen" => "127.0.0.1", + "protocol" => "socks", + "sniffing" => [ + "enabled" => true, + "destOverride" => [ + "http", + "tls" + ], + "routeOnly" => false + ], + "settings" => [ + "auth" => "noauth", + "udp" => true, + "allowTransparent" => false + ] + ], + [ + "tag" => "http", + "port" => 10809, + "listen" => "127.0.0.1", + "protocol" => "http", + "sniffing" => [ + "enabled" => true, + "destOverride" => [ + "http", + "tls" + ], + "routeOnly" => false + ], + "settings" => [ + "auth" => "noauth", + "udp" => true, + "allowTransparent" => false + ] + ] + ], + "outbounds" => [ + [ + "tag" => "proxy", + "protocol" => "vless", + "settings" => [ + "vnext" => [[ + "address" => $domain, + "port" => 443, + "users" => [[ + "id" => $key, + "alterId" => 0, + "email" => "t@t.tt", + "security" => "auto", + "encryption" => "none", + "flow" => "xtls-rprx-vision" + ]] + ]] + ], + "streamSettings" => [ + "network" => "tcp", + "security" => "reality", + "realitySettings" => [ + "serverName" => $domain, + "fingerprint" => "chrome", + "show" => false, + "publicKey" => $pac['xray'], + "shortId" => $xr['inbounds'][0]['streamSettings']['realitySettings']['shortIds'][0], + "spiderX" => "" + ] + ], + "mux" => [ + "enabled" => false, + "concurrency" => -1 + ] + ], + [ + "tag" => "direct", + "protocol" => "freedom", + ], + [ + "tag" => "block", + "protocol" => "blackhole", + "settings" => [ + "response" => [ + "type" => "http" + ] + ] + ] + ], + "routing" => [ + "domainStrategy" => "AsIs", + "rules" => [ + [ + "type" => "field", + "outboundTag" => "proxy", + "domain" => array_keys(array_filter($pac['includelist'])) + ], + [ + "type" => "field", + "port" => "0-65535", + "outboundTag" => "direct" + ] + ] + ] + ]; + echo json_encode($c); + } + public function getXray() { return json_decode(file_get_contents('/config/xray.json'), true); diff --git a/app/index.php b/app/index.php index 0d1f538..911f6d1 100644 --- a/app/index.php +++ b/app/index.php @@ -22,24 +22,35 @@ $address = $_GET['a'] ?: '127.0.0.1'; $port = $_GET['p'] ?: '1080'; $hash = $_GET['h']; if ($hash == substr(md5($c['key']), 0, 8)) { - if ($type == 'mirror') { - require __DIR__ . '/bot.php'; - require __DIR__ . '/i18n.php'; - $bot = new Bot($c['key'], $i); - $bot->getMirror(); - } else { - if (file_exists($file = __DIR__ . "/zapretlists/$type")) { - $pac = file_get_contents($file); - header('Content-Type: text/plain'); - echo str_replace([ - '~address~', - '~port~', - ], [ - $address, - $port, - ], $pac); + switch ($type) { + case 'mirror': + require __DIR__ . '/bot.php'; + require __DIR__ . '/i18n.php'; + $bot = new Bot($c['key'], $i); + $bot->getMirror(); + break; + + case 's': + require __DIR__ . '/bot.php'; + require __DIR__ . '/i18n.php'; + $bot = new Bot($c['key'], $i); + $bot->v2raySubscription($_GET['s']); exit; - } + + default: + if (file_exists($file = __DIR__ . "/zapretlists/$type")) { + $pac = file_get_contents($file); + header('Content-Type: text/plain'); + echo str_replace([ + '~address~', + '~port~', + ], [ + $address, + $port, + ], $pac); + exit; + } + break; } } if (!empty($_GET['hash'])) {