Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d8e66f54a1 | |||
| 8a64bd7308 | |||
| 06a591debe | |||
| 7a77283b6e |
+233
-33
@@ -279,6 +279,12 @@ class Bot
|
||||
case preg_match('~^/userXr (\d+)$~', $this->input['callback'], $m):
|
||||
$this->userXr($m[1]);
|
||||
break;
|
||||
case preg_match('~^/choiceTemplate (\d+(?:_.+)?)$~', $this->input['callback'], $m):
|
||||
$this->choiceTemplate($m[1]);
|
||||
break;
|
||||
case preg_match('~^/templateUser (\d+)$~', $this->input['callback'], $m):
|
||||
$this->templateUser($m[1]);
|
||||
break;
|
||||
case preg_match('~^/timerXr (\d+)$~', $this->input['callback'], $m):
|
||||
$this->timerXr($m[1]);
|
||||
break;
|
||||
@@ -358,6 +364,21 @@ class Bot
|
||||
case preg_match('~^/xray(?: (\d+))?$~', $this->input['callback'], $m):
|
||||
$this->xray($m[1] ?: 0);
|
||||
break;
|
||||
case preg_match('~^/delTemplate(?: (.+))?$~', $this->input['callback'], $m):
|
||||
$this->delTemplate($m[1] ?: 0);
|
||||
break;
|
||||
case preg_match('~^/downloadTemplate(?: (.+))?$~', $this->input['callback'], $m):
|
||||
$this->downloadTemplate($m[1] ?: 0);
|
||||
break;
|
||||
case preg_match('~^/defaultTemplate(?: (.+))?$~', $this->input['callback'], $m):
|
||||
$this->defaultTemplate($m[1] ?: 0);
|
||||
break;
|
||||
case preg_match('~^/singbox(?: (\w+))?$~', $this->input['callback'], $m):
|
||||
$this->singbox($m[1] ?: false);
|
||||
break;
|
||||
case preg_match('~^/singAdd$~', $this->input['callback'], $m):
|
||||
$this->singAdd();
|
||||
break;
|
||||
case preg_match('~^/generateSecretXray$~', $this->input['callback'], $m):
|
||||
$this->generateSecretXray();
|
||||
break;
|
||||
@@ -1110,8 +1131,6 @@ class Bot
|
||||
'xray' => $this->getXray(),
|
||||
'oc' => file_get_contents('/config/ocserv.conf'),
|
||||
'ocu' => file_get_contents('/config/ocserv.passwd'),
|
||||
'v2ray' => file_get_contents('/config/v2ray.json'),
|
||||
'sing' => file_get_contents('/config/sing.json'),
|
||||
|
||||
];
|
||||
return json_encode($conf, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
@@ -1245,18 +1264,6 @@ class Bot
|
||||
$this->setUpstreamDomainOcserv($json['pac']['domain']);
|
||||
$this->setUpstreamDomainNaive($json['pac']['domain']);
|
||||
}
|
||||
// v2ray
|
||||
if (!empty($json['v2ray'])) {
|
||||
$out[] = 'update v2ray';
|
||||
$this->update($this->input['chat'], $this->input['message_id'], implode("\n", $out));
|
||||
file_put_contents('/config/v2ray.json', $json['v2ray']);
|
||||
}
|
||||
// sing
|
||||
if (!empty($json['sing'])) {
|
||||
$out[] = 'update sing-box';
|
||||
$this->update($this->input['chat'], $this->input['message_id'], implode("\n", $out));
|
||||
file_put_contents('/config/sing.json', $json['sing']);
|
||||
}
|
||||
// nginx
|
||||
$out[] = 'reset nginx';
|
||||
$this->update($this->input['chat'], $this->input['message_id'], implode("\n", $out));
|
||||
@@ -3560,6 +3567,127 @@ DNS-over-HTTPS with IP:
|
||||
$this->xray();
|
||||
}
|
||||
|
||||
public function singAdd()
|
||||
{
|
||||
$r = $this->send(
|
||||
$this->input['chat'],
|
||||
"@{$this->input['username']} send the template file:",
|
||||
$this->input['message_id'],
|
||||
reply: 'send the template file:',
|
||||
);
|
||||
$_SESSION['reply'][$r['result']['message_id']] = [
|
||||
'start_message' => $this->input['message_id'],
|
||||
'start_callback' => $this->input['callback_id'],
|
||||
'callback' => 'singAddTemplate',
|
||||
'args' => [],
|
||||
];
|
||||
}
|
||||
|
||||
public function singAddTemplate($n = null)
|
||||
{
|
||||
if (empty($this->input['caption'])) {
|
||||
$this->send($this->input['chat'], 'empty name');
|
||||
return;
|
||||
}
|
||||
$r = $this->request('getFile', ['file_id' => $this->input['file_id']]);
|
||||
$json = json_decode(file_get_contents($this->file . $r['result']['file_path']), true);
|
||||
if ($json === false) {
|
||||
$this->send($this->input['chat'], 'wrong format');
|
||||
return;
|
||||
}
|
||||
$pac = $this->getPacConf();
|
||||
$pac['singtemplates'][$this->input['caption']] = $json;
|
||||
$this->setPacConf($pac);
|
||||
$this->singbox();
|
||||
}
|
||||
|
||||
public function delTemplate($name)
|
||||
{
|
||||
$pac = $this->getPacConf();
|
||||
unset($pac['singtemplates'][base64_decode($name)]);
|
||||
$this->setPacConf($pac);
|
||||
$this->singbox();
|
||||
}
|
||||
|
||||
public function downloadTemplate($name)
|
||||
{
|
||||
$pac = $this->getPacConf();
|
||||
$f = new \CURLStringFile(json_encode($pac['singtemplates'][base64_decode($name)], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES), base64_decode($name) . '.json', 'application/json');
|
||||
$this->sendFile($this->input['chat'], $f);
|
||||
}
|
||||
|
||||
public function defaultTemplate($name)
|
||||
{
|
||||
$pac = $this->getPacConf();
|
||||
if (!empty($name)) {
|
||||
$pac['defaulttemplate'] = $name;
|
||||
} else {
|
||||
unset($pac['defaulttemplate']);
|
||||
}
|
||||
$this->setPacConf($pac);
|
||||
$this->singbox();
|
||||
}
|
||||
|
||||
public function singbox($name = false)
|
||||
{
|
||||
$pac = $this->getPacConf();
|
||||
$domain = $pac['domain'] ?: $this->ip;
|
||||
$scheme = empty($ssl = $this->nginxGetTypeCert()) ? 'http' : 'https';
|
||||
$hash = substr(md5($this->key), 0, 8);
|
||||
$text[] = "Menu -> " . $this->i18n('xray') . ' -> Sing-box templates';
|
||||
$templates = $pac['singtemplates'];
|
||||
|
||||
$data[] = [
|
||||
[
|
||||
'text' => $this->i18n('add'),
|
||||
'callback_data' => "/singAdd",
|
||||
],
|
||||
];
|
||||
$data[] = [
|
||||
[
|
||||
'text' => "default: " . $this->i18n('show'),
|
||||
'web_app' => ['url' => "$scheme://$domain/pac?h=$hash&t=te"],
|
||||
],
|
||||
[
|
||||
'text' => $this->i18n($pac['defaulttemplate'] ? 'off' : 'on'),
|
||||
'callback_data' => "/defaultTemplate",
|
||||
],
|
||||
];
|
||||
foreach ($templates as $k => $v) {
|
||||
$data[] = [
|
||||
[
|
||||
'text' => "$k: " . $this->i18n('show'),
|
||||
'web_app' => ['url' => "$scheme://$domain/pac?h=$hash&t=te&te=" . urlencode($k)],
|
||||
],
|
||||
[
|
||||
'text' => $this->i18n('download'),
|
||||
'callback_data' => "/downloadTemplate " . base64_encode($k),
|
||||
],
|
||||
[
|
||||
'text' => $this->i18n('delete'),
|
||||
'callback_data' => "/delTemplate " . base64_encode($k),
|
||||
],
|
||||
[
|
||||
'text' => $this->i18n($pac['defaulttemplate'] == base64_encode($k) ? 'on' : 'off'),
|
||||
'callback_data' => "/defaultTemplate " . base64_encode($k),
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
$data[] = [
|
||||
[
|
||||
'text' => $this->i18n('back'),
|
||||
'callback_data' => "/xray",
|
||||
],
|
||||
];
|
||||
$this->update(
|
||||
$this->input['chat'],
|
||||
$this->input['message_id'],
|
||||
implode("\n", $text ?: ['...']),
|
||||
$data ?: false,
|
||||
);
|
||||
}
|
||||
|
||||
public function xray($page = 0)
|
||||
{
|
||||
if (!$this->ssh('pgrep xray', 'xr')) {
|
||||
@@ -3580,10 +3708,12 @@ DNS-over-HTTPS with IP:
|
||||
];
|
||||
$data[] = [
|
||||
[
|
||||
'text' => $this->i18n('add peer'),
|
||||
'callback_data' => "/addXrUser",
|
||||
'text' => $this->i18n('sing-box templates'),
|
||||
'callback_data' => "/singbox",
|
||||
],
|
||||
];
|
||||
$data[] = [
|
||||
];
|
||||
foreach ($c['inbounds'][0]['settings']['clients'] as $k => $v) {
|
||||
if (!empty($v['off'])) {
|
||||
$off++;
|
||||
@@ -3592,16 +3722,6 @@ DNS-over-HTTPS with IP:
|
||||
}
|
||||
}
|
||||
$type = $this->getPacConf()['xtlslist'];
|
||||
$data[] = [
|
||||
[
|
||||
'text' => $this->i18n('on') . " $on " . (!$type ? "✅" : ''),
|
||||
'callback_data' => "/listXr 0",
|
||||
],
|
||||
[
|
||||
'text' => $this->i18n('off') . " $off " . ($type ? "✅" : ''),
|
||||
'callback_data' => "/listXr 1",
|
||||
],
|
||||
];
|
||||
$clients = array_filter($c['inbounds'][0]['settings']['clients'], fn($e) => !$type ? empty($e['off']) : !empty($e['off']));
|
||||
uasort($clients, fn($a, $b) => ($a['time'] ?: PHP_INT_MAX) <=> ($b['time'] ?: PHP_INT_MAX));
|
||||
|
||||
@@ -3630,6 +3750,20 @@ DNS-over-HTTPS with IP:
|
||||
]
|
||||
];
|
||||
}
|
||||
$data[] = [
|
||||
[
|
||||
'text' => $this->i18n('add'),
|
||||
'callback_data' => "/addXrUser",
|
||||
],
|
||||
[
|
||||
'text' => $this->i18n('on') . " $on " . (!$type ? "✅" : ''),
|
||||
'callback_data' => "/listXr 0",
|
||||
],
|
||||
[
|
||||
'text' => $this->i18n('off') . " $off " . ($type ? "✅" : ''),
|
||||
'callback_data' => "/listXr 1",
|
||||
],
|
||||
];
|
||||
|
||||
$data[] = [
|
||||
[
|
||||
@@ -3645,6 +3779,53 @@ DNS-over-HTTPS with IP:
|
||||
);
|
||||
}
|
||||
|
||||
public function choiceTemplate($arg)
|
||||
{
|
||||
$arg = explode('_', $arg);
|
||||
$c = $this->getXray();
|
||||
if (!empty($arg[1])) {
|
||||
$c['inbounds'][0]['settings']['clients'][$arg[0]]['template'] = $arg[1];
|
||||
} else {
|
||||
unset($c['inbounds'][0]['settings']['clients'][$arg[0]]['template']);
|
||||
}
|
||||
file_put_contents('/config/xray.json', json_encode($c, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
|
||||
$this->userXr($arg[0]);
|
||||
}
|
||||
|
||||
public function templateUser($i)
|
||||
{
|
||||
$c = $this->getXray();
|
||||
$pac = $this->getPacConf();
|
||||
$text[] = "Menu -> " . $this->i18n('xray') . " -> {$c['inbounds'][0]['settings']['clients'][$i]['email']}\n";
|
||||
$templates = $pac['singtemplates'];
|
||||
$data[] = [
|
||||
[
|
||||
'text' => 'default',
|
||||
'callback_data' => "/choiceTemplate $i",
|
||||
],
|
||||
];
|
||||
foreach ($templates as $k => $v) {
|
||||
$data[] = [
|
||||
[
|
||||
'text' => $k,
|
||||
'callback_data' => "/choiceTemplate {$i}_" . base64_encode($k),
|
||||
],
|
||||
];
|
||||
}
|
||||
$data[] = [
|
||||
[
|
||||
'text' => $this->i18n('back'),
|
||||
'callback_data' => "/userXr $i",
|
||||
],
|
||||
];
|
||||
$this->update(
|
||||
$this->input['chat'],
|
||||
$this->input['message_id'],
|
||||
implode("\n", $text ?: ['...']),
|
||||
$data ?: false,
|
||||
);
|
||||
}
|
||||
|
||||
public function userXr($i, $fs = 0, $fv = 0)
|
||||
{
|
||||
$c = $this->getXray();
|
||||
@@ -3677,6 +3858,13 @@ DNS-over-HTTPS with IP:
|
||||
'callback_data' => "/switchXr $i",
|
||||
],
|
||||
];
|
||||
$template = $c['inbounds'][0]['settings']['clients'][$i]['template'] ? base64_decode($c['inbounds'][0]['settings']['clients'][$i]['template']) : 'default';
|
||||
$data[] = [
|
||||
[
|
||||
'text' => $this->i18n('template') . ": $template",
|
||||
'callback_data' => "/templateUser $i",
|
||||
],
|
||||
];
|
||||
$data[] = [
|
||||
[
|
||||
'text' => $this->i18n('show QR'),
|
||||
@@ -3763,7 +3951,7 @@ DNS-over-HTTPS with IP:
|
||||
if (empty($v['off'])) {
|
||||
$flag = false;
|
||||
}
|
||||
|
||||
$template = $v['template'];
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -3771,7 +3959,15 @@ DNS-over-HTTPS with IP:
|
||||
return false;
|
||||
}
|
||||
|
||||
$c = json_decode(file_get_contents('/config/sing.json'), true);
|
||||
if (!empty($template) && !empty($pac['singtemplates'][base64_decode($template)])) {
|
||||
$c = $pac['singtemplates'][base64_decode($template)];
|
||||
} else {
|
||||
if (!empty($pac['defaulttemplate'])) {
|
||||
$c = $pac['singtemplates'][base64_decode($pac['defaulttemplate'])];
|
||||
} else {
|
||||
$c = json_decode(file_get_contents('/config/sing.json'), true);
|
||||
}
|
||||
}
|
||||
|
||||
if ($c['dns']['servers'][0]['address'] == '~dns~') {
|
||||
$c['dns']['servers'][0]['address'] = "tls://" . ($pac['adguardkey'] ? "{$pac['adguardkey']}." : '') . "$domain";
|
||||
@@ -3782,12 +3978,16 @@ DNS-over-HTTPS with IP:
|
||||
$c['outbounds'][0]['tls']['reality']['public_key'] = $pac['xray'];
|
||||
$c['outbounds'][0]['tls']['server_name'] = $xr['inbounds'][0]['streamSettings']['realitySettings']['serverNames'][0];
|
||||
$c['outbounds'][0]['tls']['reality']['short_id'] = $xr['inbounds'][0]['streamSettings']['realitySettings']['shortIds'][0];
|
||||
$c['route']['rules'][1]['domain_suffix'] = array_keys(array_filter($pac['includelist']));
|
||||
|
||||
if (empty($c['route']['rules'][1]['domain_suffix'])) {
|
||||
unset($c['route']['rules'][1]);
|
||||
$c['route']['rules'] = array_values($c['route']['rules']);
|
||||
foreach ($c['route']['rules'] as $k => $v) {
|
||||
if (array_key_exists('domain_suffix', $v) && $v['domain_suffix'] == '~pac~') {
|
||||
$c['route']['rules'][$k]['domain_suffix'] = array_keys(array_filter($pac['includelist']));
|
||||
if (empty($c['route']['rules'][$k]['domain_suffix'])) {
|
||||
unset($c['route']['rules'][$k]);
|
||||
}
|
||||
}
|
||||
}
|
||||
$c['route']['rules'] = array_values($c['route']['rules']);
|
||||
|
||||
return json_encode($c);
|
||||
}
|
||||
|
||||
|
||||
@@ -58,6 +58,21 @@ if ($hash == substr(md5($c['key']), 0, 8)) {
|
||||
}
|
||||
exit;
|
||||
|
||||
case 'te':
|
||||
require __DIR__ . '/bot.php';
|
||||
require __DIR__ . '/i18n.php';
|
||||
$bot = new Bot($c['key'], $i);
|
||||
if (!empty($_GET['te'])) {
|
||||
$t = $bot->getPacConf()['singtemplates'][urldecode($_GET['te'])];
|
||||
} else {
|
||||
$t = json_decode(file_get_contents('/config/sing.json'), true);
|
||||
}
|
||||
if ($t) {
|
||||
header('Content-Type: application/json');
|
||||
echo json_encode($t, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
exit;
|
||||
}
|
||||
|
||||
default:
|
||||
if (file_exists($file = __DIR__ . "/zapretlists/$type")) {
|
||||
$pac = file_get_contents($file);
|
||||
|
||||
+24
-3
@@ -1,4 +1,25 @@
|
||||
<div style="position:relative;width:100%;height:100%">
|
||||
<img style="position:absolute;top:0;right:0;width:35%" src="toncoin.png" alt="">
|
||||
<iframe style="width:100%;height:100%" src="https://www.donationalerts.com/r/mercurykd" frameborder="0"></iframe>
|
||||
<meta charset="utf-8">
|
||||
<script src="jquery-3.7.1.min.js"></script>
|
||||
<script>
|
||||
jQuery(function($){
|
||||
$('#copy').on('click', function (e){
|
||||
$(this).text('copied');
|
||||
var $temp = $("<input>");
|
||||
$("body").append($temp);
|
||||
$temp.val($(this).attr('data-id')).select();
|
||||
document.execCommand("copy");
|
||||
$temp.remove();
|
||||
});
|
||||
});
|
||||
</script>
|
||||
<div style="position:relative;width:100%;height:100%; background-color: white;">
|
||||
<div style="position:absolute;top:0;right:0;width:35%;text-align:center;background-color: #17212b;">
|
||||
<img src="toncoin.png" width="100%" alt="">
|
||||
<a href="javascript:;" id="copy" style="color:white;text-decoration:none" data-id="UQCDDkaX3fCAFBek28Hx4TfvDDRqeizOW74blVMVAM4_m4OW">copy</a>
|
||||
</div>
|
||||
<a style="background-color: #8B3FFD;height: 46px;display:inline-block;padding:0 54px;color: white;border-radius: 12px;text-decoration: none;font-size: 20px;line-height: 46px;font-family: arial;" href="https://yoomoney.ru/to/410011827900450">
|
||||
<svg style="width: 24px;fill: white;position: relative;top: 4px;" class="qa-fundraise-button-logo mui-m0okdh" viewBox="0 0 16 16"><path d="M4.638 8.5a5.67 5.67 0 015.681-5.68A5.693 5.693 0 0116 8.5a5.693 5.693 0 01-5.68 5.682A5.67 5.67 0 014.637 8.5zm3.56 0c0 1.151.97 2.122 2.121 2.122 1.15 0 2.085-.97 2.121-2.121 0-1.15-.97-2.121-2.12-2.121-1.151 0-2.122.97-2.122 2.12zm-3.596 4.243v-8.27H0l2.589 8.27h2.013z" clip-rule="evenodd"></path></svg>
|
||||
Перевести
|
||||
</a>
|
||||
<iframe style="width:100%;height:100%" src="https://pay.cloudtips.ru/p/757de378" frameborder="0"></iframe>
|
||||
</div>
|
||||
+1
-1
@@ -96,7 +96,7 @@
|
||||
"protocol": "dns",
|
||||
"outbound": "dns-out"
|
||||
}, {
|
||||
"domain_suffix": [],
|
||||
"domain_suffix": "~pac~",
|
||||
"outbound": "proxy"
|
||||
}, {
|
||||
"ip_cidr": ["0.0.0.0\/0"],
|
||||
|
||||
Reference in New Issue
Block a user