Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5e72452a8d | |||
| 668756f1c7 | |||
| 29e7be6cd8 |
+64
-125
@@ -138,6 +138,12 @@ class Bot
|
||||
case preg_match('~^/mtproto$~', $this->input['callback'], $m):
|
||||
$this->mtproto();
|
||||
break;
|
||||
case preg_match('~^/addCommunityFilter$~', $this->input['callback'], $m):
|
||||
$this->addCommunityFilter();
|
||||
break;
|
||||
case preg_match('~^/pacMenu (\d+)$~', $this->input['callback'], $m):
|
||||
$this->pacMenu($m[1]);
|
||||
break;
|
||||
case preg_match('~^/applyupdatebot$~', $this->input['callback'], $m):
|
||||
$this->applyupdatebot();
|
||||
break;
|
||||
@@ -343,7 +349,7 @@ class Bot
|
||||
case preg_match('~^/deldomain$~', $this->input['callback'], $m):
|
||||
$this->delDomain();
|
||||
break;
|
||||
case preg_match('~^/(?P<action>change|delete)(?P<typelist>subzoneslist|reverselist|includelist|excludelist) (?P<arg>[^\s]+(?:_(?:-)?\d+)?)$~', $this->input['callback'], $m):
|
||||
case preg_match('~^/(?P<action>change|delete)(?P<typelist>includelist) (?P<arg>[^\s]+(?:_(?:-)?\d+)?)$~', $this->input['callback'], $m):
|
||||
$this->listPacChange($m['typelist'], $m['action'], ...explode('_', $m['arg']));
|
||||
break;
|
||||
case preg_match('~^/paczapret$~', $this->input['callback'], $m):
|
||||
@@ -481,6 +487,7 @@ class Bot
|
||||
|
||||
public function restartXray($c)
|
||||
{
|
||||
$c['inbounds'][0]['settings']['clients'] = array_values($c['inbounds'][0]['settings']['clients']);
|
||||
$this->ssh('pkill xray', 'xr');
|
||||
file_put_contents('/config/xray.json', json_encode($c, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
|
||||
$this->ssh('xray run -config /xray.json > /dev/null 2>&1 &', 'xr');
|
||||
@@ -2135,7 +2142,7 @@ DNS-over-HTTPS with IP:
|
||||
$page = (int) floor(array_search($v, array_keys($conf['includelist'])) / $count);
|
||||
}
|
||||
$page = $page ?: -2;
|
||||
$this->menu('includelist', $page);
|
||||
$this->pacUpdate();
|
||||
}
|
||||
|
||||
public function reverse(int $count)
|
||||
@@ -2860,25 +2867,31 @@ DNS-over-HTTPS with IP:
|
||||
return $r;
|
||||
}
|
||||
|
||||
public function pacMenu()
|
||||
public function addCommunityFilter()
|
||||
{
|
||||
$rmpac = stat(__DIR__ . '/zapretlists/rmpac');
|
||||
$rpac = stat(__DIR__ . '/zapretlists/rpac');
|
||||
$mpac = stat(__DIR__ . '/zapretlists/mpac');
|
||||
$pac = stat(__DIR__ . '/zapretlists/pac');
|
||||
$conf = $this->getPacConf();
|
||||
$zapret = $conf['zapret'] ? $this->i18n('on') : $this->i18n('off');
|
||||
$ip = $conf['domain'] ?: $this->ip;
|
||||
$hash = substr(md5($this->key), 0, 8);
|
||||
$scheme = empty($this->nginxGetTypeCert()) ? 'http' : 'https';
|
||||
$text = <<<text
|
||||
$pac = $this->getPacConf();
|
||||
$l = array_filter(array_map(fn($e) => trim($e), explode("\n", file_get_contents('https://community.antifilter.download/list/domains.lst'))));
|
||||
if (!empty($l)) {
|
||||
foreach ($l as $k => $v) {
|
||||
$pac['includelist'][$v] = true;
|
||||
}
|
||||
}
|
||||
$this->setPacConf($pac);
|
||||
$this->pacUpdate();
|
||||
}
|
||||
|
||||
public function pacMenu($page = 0)
|
||||
{
|
||||
$rmpac = stat(__DIR__ . '/zapretlists/rmpac');
|
||||
$rpac = stat(__DIR__ . '/zapretlists/rpac');
|
||||
$mpac = stat(__DIR__ . '/zapretlists/mpac');
|
||||
$pac = stat(__DIR__ . '/zapretlists/pac');
|
||||
$conf = $this->getPacConf();
|
||||
$ip = $conf['domain'] ?: $this->ip;
|
||||
$hash = substr(md5($this->key), 0, 8);
|
||||
$scheme = empty($this->nginxGetTypeCert()) ? 'http' : 'https';
|
||||
$text = <<<text
|
||||
Menu -> pac
|
||||
|
||||
<code>RU blacklist:</code> <code>https://github.com/zapret-info/z-i</code>
|
||||
|
||||
{$this->i18n('proxy')}{$this->i18n('self list explain')}
|
||||
|
||||
{$this->i18n('direct')}{$this->i18n('reverse list explain')}
|
||||
text;
|
||||
if ($pac) {
|
||||
$pac['time'] = date('d.m.Y H:i:s', $pac['mtime']);
|
||||
@@ -2890,12 +2903,8 @@ DNS-over-HTTPS with IP:
|
||||
<code>$scheme://$ip/pac?h=$hash&a=127.0.0.1&p=1080</code>
|
||||
text;
|
||||
$urls[0][] = [
|
||||
'text' => "PAC",
|
||||
'url' => "$scheme://$ip/pac?h=$hash&a=127.0.0.1&p=1080",
|
||||
];
|
||||
$urls[1][] = [
|
||||
'text' => "PAC Wireguard proxy",
|
||||
'url' => "$scheme://$ip/pac?h=$hash&a=10.10.0.3&p=1080",
|
||||
'text' => "PAC",
|
||||
'web_app' => ['url' => "https://$ip/pac?h=$hash&a=127.0.0.1&p=1080"],
|
||||
];
|
||||
}
|
||||
if ($mpac) {
|
||||
@@ -2907,9 +2916,9 @@ DNS-over-HTTPS with IP:
|
||||
<b>Shadowsocks-android PAC ({$mpac['time']} / {$mpac['sz']}):</b>
|
||||
<code>$scheme://$ip/pac?h=$hash&t=mpac</code>
|
||||
text;
|
||||
$urls[2][] = [
|
||||
'text' => "PAC ShadowSocks(Android)",
|
||||
'url' => "$scheme://$ip/pac?h=$hash&t=mpac",
|
||||
$urls[0][] = [
|
||||
'text' => "PAC ShadowSocks(Android)",
|
||||
'web_app' => ['url' => "https://$ip/pac?h=$hash&t=mpac"],
|
||||
];
|
||||
}
|
||||
if ($rpac) {
|
||||
@@ -2947,115 +2956,46 @@ DNS-over-HTTPS with IP:
|
||||
if ($urls) {
|
||||
$data = $urls;
|
||||
}
|
||||
if ($conf['zapret']) {
|
||||
$data[] = [
|
||||
[
|
||||
'text' => "RU blacklist : $zapret",
|
||||
'callback_data' => "/paczapret",
|
||||
],
|
||||
[
|
||||
'text' => $this->i18n('blacklist exclude'),
|
||||
'callback_data' => "/menu excludelist 0",
|
||||
],
|
||||
];
|
||||
} else {
|
||||
$data[] = [
|
||||
[
|
||||
'text' => "RU blacklist : $zapret",
|
||||
'callback_data' => "/paczapret",
|
||||
],
|
||||
];
|
||||
}
|
||||
$data[] = [
|
||||
[
|
||||
'text' => $this->i18n('proxy'),
|
||||
'callback_data' => "/menu includelist 0",
|
||||
'callback_data' => "/menu includelist 0",
|
||||
],
|
||||
// [
|
||||
// 'text' => $this->i18n('subzones'),
|
||||
// 'callback_data' => "/menu subzoneslist 0",
|
||||
// ],
|
||||
[
|
||||
'text' => $this->i18n('direct'),
|
||||
'callback_data' => "/menu reverselist 0",
|
||||
'text' => $this->i18n('add') . ' community antifilter',
|
||||
'callback_data' => "/addCommunityFilter",
|
||||
],
|
||||
];
|
||||
if ($conf['zapret'] || !empty($conf['includelist']) || !empty($conf['reverselist'])) {
|
||||
$data[] = [
|
||||
[
|
||||
'text' => "{$this->i18n('update')} PAC",
|
||||
'callback_data' => "/pacupdate",
|
||||
],
|
||||
[
|
||||
'text' => $this->i18n('check url'),
|
||||
'callback_data' => "/checkurl",
|
||||
],
|
||||
];
|
||||
}
|
||||
$data[] = [
|
||||
[
|
||||
'text' => $this->i18n('back'),
|
||||
'callback_data' => "/menu",
|
||||
],
|
||||
];
|
||||
return [
|
||||
'text' => $text,
|
||||
'data' => $data,
|
||||
];
|
||||
}
|
||||
|
||||
public function pacList($type, int $page, int $count = 5)
|
||||
{
|
||||
$count = $this->limit;
|
||||
$name = str_replace('list', '', $type);
|
||||
switch ($name) {
|
||||
case 'include':
|
||||
$additional = $this->i18n('self list explain');
|
||||
break;
|
||||
case 'reverse':
|
||||
$additional = $this->i18n('reverse list explain');
|
||||
break;
|
||||
}
|
||||
$text = "Menu -> pac -> {$name}list\n\n$additional";
|
||||
$data[] = [
|
||||
[
|
||||
'text' => $this->i18n('add'),
|
||||
'callback_data' => "/$name $count",
|
||||
'callback_data' => "/include {$this->limit}",
|
||||
],
|
||||
];
|
||||
$domains = $this->getPacConf()[$type];
|
||||
$domains = $this->getPacConf()['includelist'];
|
||||
if (!empty($domains)) {
|
||||
ksort($domains);
|
||||
$all = (int) ceil(count($domains) / $count);
|
||||
$all = (int) ceil(count($domains) / $this->limit);
|
||||
$page = min($page, $all - 1);
|
||||
$page = $page == -2 ? $all - 1 : $page;
|
||||
$domains = $page != -1 ? array_slice($domains, $page * $count, $count, true) : $domains;
|
||||
$page = $page < 0 ? $all - 1 : $page;
|
||||
$domains = array_slice($domains, $page * $this->limit, $this->limit, true);
|
||||
foreach ($domains as $k => $v) {
|
||||
$data[] = [
|
||||
[
|
||||
'text' => '(' . ($v ? 'ON' : 'OFF') . ') ' . ($type == 'includelist' ? idn_to_utf8($k) : $k),
|
||||
'callback_data' => "/change{$name}list {$k}_$count",
|
||||
'text' => '(' . ($v ? 'ON' : 'OFF') . ') ' . idn_to_utf8($k),
|
||||
'callback_data' => "/changeincludelist {$k}_{$this->limit}",
|
||||
],
|
||||
[
|
||||
'text' => 'delete',
|
||||
'callback_data' => "/delete{$name}list {$k}_$count",
|
||||
'callback_data' => "/deleteincludelist {$k}_{$this->limit}",
|
||||
],
|
||||
];
|
||||
}
|
||||
if ($page != -1 && $all > 1) {
|
||||
if ($all > 1) {
|
||||
$data[] = [
|
||||
[
|
||||
'text' => '<<',
|
||||
'callback_data' => "/menu $type " . ($page - 1 >= 0 ? $page - 1 : $all - 1),
|
||||
'callback_data' => "/pacMenu " . ($page - 1 >= 0 ? $page - 1 : $all - 1),
|
||||
],
|
||||
// [
|
||||
// 'text' => 'all',
|
||||
// 'callback_data' => "/menu $type -1",
|
||||
// ],
|
||||
[
|
||||
'text' => '>>',
|
||||
'callback_data' => "/menu $type " . ($page < $all - 1 ? $page + 1 : 0),
|
||||
'callback_data' => "/pacMenu " . ($page < $all - 1 ? $page + 1 : 0),
|
||||
]
|
||||
];
|
||||
}
|
||||
@@ -3063,13 +3003,15 @@ DNS-over-HTTPS with IP:
|
||||
$data[] = [
|
||||
[
|
||||
'text' => $this->i18n('back'),
|
||||
'callback_data' => "/menu pac",
|
||||
'callback_data' => "/menu",
|
||||
],
|
||||
];
|
||||
return [
|
||||
'text' => $text,
|
||||
'data' => $data,
|
||||
];
|
||||
$this->update(
|
||||
$this->input['chat'],
|
||||
$this->input['message_id'],
|
||||
$text,
|
||||
$data ?: false,
|
||||
);
|
||||
}
|
||||
|
||||
public function listPacChange($type, $action, $key, int $count)
|
||||
@@ -3087,7 +3029,7 @@ DNS-over-HTTPS with IP:
|
||||
break;
|
||||
}
|
||||
$this->setPacConf($conf);
|
||||
$this->menu($type, $page);
|
||||
$this->pacUpdate();
|
||||
}
|
||||
|
||||
public function pacZapret()
|
||||
@@ -3232,7 +3174,7 @@ DNS-over-HTTPS with IP:
|
||||
],
|
||||
[
|
||||
'text' => $this->i18n('pac'),
|
||||
'callback_data' => "/menu pac",
|
||||
'callback_data' => "/pacMenu 0",
|
||||
],
|
||||
],
|
||||
[
|
||||
@@ -3258,12 +3200,8 @@ DNS-over-HTTPS with IP:
|
||||
'wg' => $type == 'wg' ? $this->statusWg($arg) : false,
|
||||
'client' => $type == 'client' ? $this->getClient(...explode('_', $arg)) : false,
|
||||
'addpeer' => $type == 'addpeer' ? $this->addWg(...explode('_', $arg)) : false,
|
||||
'pac' => $type == 'pac' ? $this->pacMenu() : false,
|
||||
'pac' => $type == 'pac' ? $this->pacMenu($arg) : false,
|
||||
'adguard' => $type == 'adguard' ? $this->adguardMenu() : false,
|
||||
'includelist' => $type == 'includelist' ? $this->pacList($type, $arg) : false,
|
||||
'excludelist' => $type == 'excludelist' ? $this->pacList($type, $arg) : false,
|
||||
'reverselist' => $type == 'reverselist' ? $this->pacList($type, $arg) : false,
|
||||
'subzoneslist' => $type == 'subzoneslist' ? $this->pacList($type, $arg) : false,
|
||||
'config' => $type == 'config' ? $this->configMenu() : false,
|
||||
'ss' => $type == 'ss' ? $this->menuSS() : false,
|
||||
'lang' => $type == 'lang' ? $this->menuLang() : false,
|
||||
@@ -3829,7 +3767,8 @@ DNS-over-HTTPS with IP:
|
||||
public function userXr($i, $fs = 0, $fv = 0)
|
||||
{
|
||||
$c = $this->getXray();
|
||||
$domain = $this->getPacConf()['domain'] ?: $this->ip;
|
||||
$pac = $this->getPacConf() ?: $this->ip;
|
||||
$domain = $pac['domain'] ?: $this->ip;
|
||||
$scheme = empty($this->nginxGetTypeCert()) ? 'http' : 'https';
|
||||
$hash = substr(md5($this->key), 0, 8);
|
||||
$v2ray = "$scheme://{$domain}/pac?h=$hash&t=s&b=1&s={$c['inbounds'][0]['settings']['clients'][$i]['id']}";
|
||||
@@ -3858,10 +3797,10 @@ 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';
|
||||
$template = $c['inbounds'][0]['settings']['clients'][$i]['template'] ? base64_decode($c['inbounds'][0]['settings']['clients'][$i]['template']) : 'default(' . ($pac['defaulttemplate'] ? base64_decode($pac['defaulttemplate']) : 'origin') . ')';
|
||||
$data[] = [
|
||||
[
|
||||
'text' => $this->i18n('template') . ": $template",
|
||||
'text' => $this->i18n('template singbox') . ": $template",
|
||||
'callback_data' => "/templateUser $i",
|
||||
],
|
||||
];
|
||||
|
||||
+1
-89
@@ -93,95 +93,7 @@ function start()
|
||||
|
||||
// check && exclude
|
||||
$include = array_filter($conf['includelist'], fn($x) => $x == true);
|
||||
if ($conf['zapret']) {
|
||||
foreach ($source as $k => $v) {
|
||||
$size = getSize($v['source']);
|
||||
if ($size > 0) {
|
||||
if (file_exists($v['dest'])) {
|
||||
unlink($v['dest']);
|
||||
}
|
||||
touch($v['dest']);
|
||||
$percent = 0;
|
||||
$curr = 0;
|
||||
exec("php updatepac.php download $k > /dev/null &");
|
||||
$i = $j = 0;
|
||||
while ($curr <= $size) {
|
||||
$rotate = $curr != $size ? $load[$j % count($load)] : '';
|
||||
$tail = <<<text
|
||||
Downloading {$v['source']}
|
||||
$curr/$size $percent% $rotate
|
||||
text;
|
||||
update($text . $tail);
|
||||
if ($curr == $size || $i > 50) {
|
||||
break;
|
||||
}
|
||||
usleep(50000);
|
||||
clearstatcache();
|
||||
if ($curr == filesize($v['dest'])) {
|
||||
$i++;
|
||||
}
|
||||
$curr = filesize($v['dest']);
|
||||
$percent = (int) ceil($curr * 100 / $size);
|
||||
$j++;
|
||||
}
|
||||
if ($curr != $size) {
|
||||
$text .= "\nError downloading {$v['source']}\nabort script";
|
||||
endScript($text);
|
||||
}
|
||||
} else {
|
||||
$text .= "\nError size {$v['source']}\nabort script";
|
||||
endScript($text);
|
||||
}
|
||||
$text .= $tail ? "$tail\n" : '';
|
||||
}
|
||||
// prepare
|
||||
$reg = '~^([^.*]+\.(?:(?:' . implode('|', $subzones) . ')\.)?[^.]+)$~';
|
||||
|
||||
foreach ($source as $k => $v) {
|
||||
$size = filesize($v['dest']);
|
||||
$curr = $j = 0;
|
||||
$time = microtime(true);
|
||||
$name = basename($v['dest']);
|
||||
$f = fopen($v['dest'], 'r');
|
||||
while (($s = fgets($f)) !== false) {
|
||||
$curr += strlen($s);
|
||||
$percent = (int) ceil($curr * 100 / $size);
|
||||
$rotate = $curr != $size ? $load[$j % count($load)] : '';
|
||||
$tail = <<<text
|
||||
Prepare $name $percent% $rotate
|
||||
text;
|
||||
if (microtime(true) - $time > 0.1) {
|
||||
update($text . $tail);
|
||||
$time = microtime(true);
|
||||
$j++;
|
||||
}
|
||||
if ($name == 'dump.csv') {
|
||||
if (!preg_match('~;.*;~', $s)) {
|
||||
continue;
|
||||
}
|
||||
$t = explode(';', iconv('CP1251', 'utf-8', $s));
|
||||
if (empty($t[1])) {
|
||||
continue;
|
||||
}
|
||||
if (preg_match($reg, idn_to_ascii(trim($t[1])), $m)) {
|
||||
$domains[$m[1]] = 0;
|
||||
}
|
||||
} else {
|
||||
if (preg_match($reg, idn_to_ascii(iconv('CP1251', 'utf-8', trim($s))), $m)) {
|
||||
$domains[$m[1]] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
fclose($f);
|
||||
$text .= $tail ? "$tail\n" : '';
|
||||
}
|
||||
$exclude = array_keys(array_filter($conf['excludelist'], fn($x) => $x == true));
|
||||
foreach ($include as $k => $v) {
|
||||
$domains[$k] = 0;
|
||||
}
|
||||
} else {
|
||||
$domains = $include;
|
||||
}
|
||||
$domains = $include;
|
||||
if (empty($domains)) {
|
||||
$text = "Empty domains. Delete pac files";
|
||||
unlink(__DIR__ . '/zapretlists/mpac');
|
||||
|
||||
@@ -1,3 +1,9 @@
|
||||
11.04.2024 v1.25
|
||||
- подпись дефолтного шаблона в разделе пользователя xtls
|
||||
11.04.2024 v1.24
|
||||
- обновлен раздел PAC, добавлена возможность добавить домены из https://community.antifilter.download/
|
||||
11.04.2024 v1.23
|
||||
- фикс совместимости старого конфига xray из бэкапа
|
||||
11.04.2024 v1.22
|
||||
- улучшение гибкости выбора шаблона sing-box
|
||||
11.04.2024 v1.21
|
||||
|
||||
Reference in New Issue
Block a user