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'])) {