Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| bb83ab0684 | |||
| 05267f44be | |||
| d1be532270 | |||
| 48798c7e61 | |||
| 84e71ab45b | |||
| 068f2d0cc9 | |||
| 759cf1973a | |||
| a11b7e0664 |
+85
-14
@@ -368,6 +368,12 @@ class Bot
|
||||
case preg_match('~^/domain$~', $this->input['callback'], $m):
|
||||
$this->domain();
|
||||
break;
|
||||
case preg_match('~^/warp$~', $this->input['callback'], $m):
|
||||
$this->warp();
|
||||
break;
|
||||
case preg_match('~^/warpPlus$~', $this->input['callback'], $m):
|
||||
$this->warpPlus();
|
||||
break;
|
||||
case preg_match('~^/xray(?: (\d+))?$~', $this->input['callback'], $m):
|
||||
$this->xray($m[1] ?: 0);
|
||||
break;
|
||||
@@ -455,9 +461,9 @@ class Bot
|
||||
{
|
||||
$r = $this->send(
|
||||
$this->input['chat'],
|
||||
"@{$this->input['username']} enter url",
|
||||
"@{$this->input['username']} enter key or 0 for stop mtproto",
|
||||
$this->input['message_id'],
|
||||
reply: 'enter url',
|
||||
reply: 'enter key or 0 for stop mtproto',
|
||||
);
|
||||
$_SESSION['reply'][$r['result']['message_id']] = [
|
||||
'start_message' => $this->input['message_id'],
|
||||
@@ -512,10 +518,7 @@ class Bot
|
||||
|
||||
public function mtproto()
|
||||
{
|
||||
$s = file_get_contents('/config/mtprotosecret');
|
||||
$d = file_get_contents('/config/mtprotodomain') ?: 'vk.com';
|
||||
$p = getenv('TGPORT');
|
||||
$ip = $this->getPacConf()['domain'] ?: $this->ip;
|
||||
$st = $this->ssh('pgrep mtproto-proxy', 'tg') ? 'on' : 'off';
|
||||
$text[] = "Menu -> MTProto\n";
|
||||
$text[] = "status: $st\n";
|
||||
@@ -994,13 +997,15 @@ class Bot
|
||||
if (!empty($c['admin']) && (empty($this->time) || ((time() - $this->time) > 3600))) {
|
||||
$this->time = time();
|
||||
$current = file_get_contents('/version');
|
||||
$last = file_get_contents('https://raw.githubusercontent.com/mercurykd/vpnbot/master/version');
|
||||
$b = exec('git -C / rev-parse --abbrev-ref HEAD');
|
||||
$last = file_get_contents("https://raw.githubusercontent.com/mercurykd/vpnbot/$b/version");
|
||||
if (!empty($last) && $last != $this->last && $last != $current) {
|
||||
$this->last = $last;
|
||||
$diff = array_slice(explode("\n", $last), 0, count(explode("\n", $last)) - count(explode("\n", $current)));
|
||||
$diff = array_slice($diff, 0, 10);
|
||||
if (!empty($diff)) {
|
||||
foreach ($c['admin'] as $k => $v) {
|
||||
$this->send($v, "update:\n{$diff[0]}");
|
||||
$this->send($v, implode("\n", $diff));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3276,8 +3281,8 @@ DNS-over-HTTPS with IP:
|
||||
'callback_data' => "/menu ss",
|
||||
],
|
||||
[
|
||||
'text' => $this->i18n('mirror'),
|
||||
'callback_data' => "/menu mirror",
|
||||
'text' => $this->i18n('warp') . ': ' . $this->warpStatus(),
|
||||
'callback_data' => "/warp",
|
||||
],
|
||||
],
|
||||
[
|
||||
@@ -3694,7 +3699,7 @@ DNS-over-HTTPS with IP:
|
||||
'web_app' => ['url' => "https://$domain/pac?h=$hash&t=te&ty=$type"],
|
||||
],
|
||||
[
|
||||
'text' => $this->i18n($pac["default{$type}template"] ? 'off' : 'on'),
|
||||
'text' => $this->i18n($pac["default{$type}template"] && !empty($pac["{$type}templates"][$pac["default{$type}template"]]) ? 'off' : 'on'),
|
||||
'callback_data' => "/defaultTemplate $type",
|
||||
],
|
||||
];
|
||||
@@ -3838,6 +3843,64 @@ DNS-over-HTTPS with IP:
|
||||
);
|
||||
}
|
||||
|
||||
public function warpPlus()
|
||||
{
|
||||
$r = $this->send(
|
||||
$this->input['chat'],
|
||||
"@{$this->input['username']} enter key",
|
||||
$this->input['message_id'],
|
||||
reply: 'enter key',
|
||||
);
|
||||
$_SESSION['reply'][$r['result']['message_id']] = [
|
||||
'start_message' => $this->input['message_id'],
|
||||
'start_callback' => $this->input['callback_id'],
|
||||
'callback' => 'addWarpPlus',
|
||||
'args' => [],
|
||||
];
|
||||
}
|
||||
|
||||
public function addWarpPlus($key)
|
||||
{
|
||||
$c = $this->getPacConf();
|
||||
$c['warp'] = $key;
|
||||
$this->setPacConf($c);
|
||||
$this->send($this->input['chat'], 'Warp registration license: ' . $this->ssh("warp-cli --accept-tos registration license $key", 'wp'));
|
||||
sleep(1);
|
||||
$this->warp();
|
||||
}
|
||||
|
||||
public function warpStatus()
|
||||
{
|
||||
$st = $this->ssh('curl -m 1 -x socks5://127.0.0.1:40000 https://cloudflare.com/cdn-cgi/trace', 'wp');
|
||||
preg_match('~warp=(\w+)~', $st, $m);
|
||||
return $m[1];
|
||||
}
|
||||
|
||||
public function warp()
|
||||
{
|
||||
$text[] = "Menu -> " . $this->i18n('warp');
|
||||
$text[] = "status: " . $this->warpStatus();
|
||||
$data[] = [
|
||||
[
|
||||
'text' => $this->i18n('set key'),
|
||||
'callback_data' => "/warpPlus",
|
||||
],
|
||||
];
|
||||
|
||||
$data[] = [
|
||||
[
|
||||
'text' => $this->i18n('back'),
|
||||
'callback_data' => "/menu",
|
||||
],
|
||||
];
|
||||
$this->update(
|
||||
$this->input['chat'],
|
||||
$this->input['message_id'],
|
||||
implode("\n", $text ?: ['...']),
|
||||
$data ?: false,
|
||||
);
|
||||
}
|
||||
|
||||
public function choiceTemplate($arg)
|
||||
{
|
||||
$arg = explode('_', $arg);
|
||||
@@ -3932,8 +3995,8 @@ DNS-over-HTTPS with IP:
|
||||
'callback_data' => "/switchXr $i",
|
||||
],
|
||||
];
|
||||
$singtemplate = $c['singtemplate'] ? base64_decode($c['singtemplate']) : 'default(' . ($pac['defaultsingtemplate'] ? base64_decode($pac['defaultsingtemplate']) : 'origin') . ')';
|
||||
$v2raytemplate = $c['v2raytemplate'] ? base64_decode($c['v2raytemplate']) : 'default(' . ($pac['defaultv2raytemplate'] ? base64_decode($pac['defaultv2raytemplate']) : 'origin') . ')';
|
||||
$singtemplate = $c['singtemplate'] ? base64_decode($c['singtemplate']) : 'default(' . ($pac['defaultsingtemplate'] && !empty($pac['singtemplates'][base64_decode($pac['defaultsingtemplate'])]) ? base64_decode($pac['defaultsingtemplate']) : 'origin') . ')';
|
||||
$v2raytemplate = $c['v2raytemplate'] ? base64_decode($c['v2raytemplate']) : 'default(' . ($pac['defaultv2raytemplate'] && !empty($pac['v2raytemplates'][base64_decode($pac['defaultv2raytemplate'])]) ? base64_decode($pac['defaultv2raytemplate']) : 'origin') . ')';
|
||||
$data[] = [
|
||||
[
|
||||
'text' => $this->i18n('v2ray') . ": $v2raytemplate",
|
||||
@@ -4073,6 +4136,7 @@ DNS-over-HTTPS with IP:
|
||||
switch (true) {
|
||||
case !empty($template) && $template == 'origin':
|
||||
case empty($template) && empty($pac['default' . ($_GET['t'] == 's' ? 'v2ray' : 'sing') . 'template']):
|
||||
case empty($template) && !empty($pac['default' . ($_GET['t'] == 's' ? 'v2ray' : 'sing') . 'template']) && empty($pac[($_GET['t'] == 's' ? 'v2ray' : 'sing') . 'templates'][$pac['default' . ($_GET['t'] == 's' ? 'v2ray' : 'sing') . 'template']]):
|
||||
$c = json_decode(file_get_contents('/config/' . ($_GET['t'] == 's' ? 'v2ray' : 'sing') . '.json'), true);
|
||||
break;
|
||||
case !empty($template):
|
||||
@@ -4417,6 +4481,12 @@ DNS-over-HTTPS with IP:
|
||||
$this->exportManual($this->update);
|
||||
$r = $this->send($this->input['from'], 'update...');
|
||||
file_put_contents('/update/reload_message', "{$this->input['from']}:{$r['result']['message_id']}");
|
||||
file_put_contents('/update/key', $this->key);
|
||||
file_put_contents('/update/curl', json_encode([
|
||||
'chat_id' => $this->input['chat'],
|
||||
'message_id' => $r['result']['message_id'],
|
||||
'text' => '~t~'
|
||||
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
|
||||
file_put_contents('/update/pipe', '1');
|
||||
$this->delete($this->input['from'], $this->input['message_id']);
|
||||
}
|
||||
@@ -5054,8 +5124,9 @@ DNS-over-HTTPS with IP:
|
||||
fclose($s);
|
||||
ssh2_disconnect($c);
|
||||
} catch (Exception | Error $e) {
|
||||
$this->send($this->input['chat'], $e->getMessage(), $this->input['message_id']);
|
||||
die();
|
||||
if (!empty($GLOBALS['debug'])) {
|
||||
$this->send($this->input['chat'], $e->getMessage(), $this->input['message_id']);
|
||||
}
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,10 @@
|
||||
<?php
|
||||
|
||||
$i = [
|
||||
'warp' => [
|
||||
'en' => 'Warp',
|
||||
'ru' => 'Warp',
|
||||
],
|
||||
'wg_title' => [
|
||||
'en' => 'Wireguard',
|
||||
'ru' => 'Wireguard',
|
||||
|
||||
+1
-1
@@ -36,7 +36,7 @@ if ($hash == substr(md5($c['key']), 0, 8)) {
|
||||
|
||||
case 'te':
|
||||
if (!empty($_GET['te'])) {
|
||||
$t = $bot->getPacConf()["{$_GET['ty']}templates"][urldecode($_GET['te'])];
|
||||
$t = $bot->getPacConf()["{$_GET['ty']}templates"][$_GET['te']];
|
||||
} else {
|
||||
$t = json_decode(file_get_contents("/config/{$_GET['ty']}.json"), true);
|
||||
}
|
||||
|
||||
+3
-1
@@ -2,10 +2,12 @@
|
||||
|
||||
require __DIR__ . '/timezone.php';
|
||||
|
||||
// require __DIR__ . '/debug.php';
|
||||
require __DIR__ . '/bot.php';
|
||||
require __DIR__ . '/config.php';
|
||||
require __DIR__ . '/i18n.php';
|
||||
if ($c['debug']) {
|
||||
require __DIR__ . '/debug.php';
|
||||
}
|
||||
|
||||
$bot = new Bot($c['key'], $i);
|
||||
$bot->adguardProtect();
|
||||
|
||||
+4
-1
@@ -2,11 +2,14 @@
|
||||
|
||||
require __DIR__ . '/timezone.php';
|
||||
|
||||
// require __DIR__ . '/debug.php';
|
||||
require __DIR__ . '/bot.php';
|
||||
require __DIR__ . '/config.php';
|
||||
require __DIR__ . '/i18n.php';
|
||||
|
||||
if ($c['debug']) {
|
||||
require __DIR__ . '/debug.php';
|
||||
}
|
||||
|
||||
$bot = new Bot($c['key'], $i);
|
||||
|
||||
if (!empty($c['admin'])) {
|
||||
|
||||
+1
-1
@@ -491,7 +491,7 @@ services:
|
||||
ipv4_address: 10.10.0.12
|
||||
logging: *default-logging
|
||||
wp:
|
||||
image: mercurykd/vpnbot-wp:1
|
||||
image: mercurykd/vpnbot-wp:1.1
|
||||
build:
|
||||
dockerfile: dockerfile/warp.dockerfile
|
||||
args:
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
FROM ubuntu:22.04
|
||||
RUN apt update && apt install -y curl gpg socat lsb-release \
|
||||
RUN apt update && apt install -y curl gpg socat jq lsb-release openssh-server \
|
||||
&& curl -fsSL https://pkg.cloudflareclient.com/pubkey.gpg | gpg --yes --dearmor --output /usr/share/keyrings/cloudflare-warp-archive-keyring.gpg \
|
||||
&& echo "deb [signed-by=/usr/share/keyrings/cloudflare-warp-archive-keyring.gpg] https://pkg.cloudflareclient.com/ $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/cloudflare-client.list \
|
||||
&& apt update && apt install -y cloudflare-warp
|
||||
&& apt update && apt install -y cloudflare-warp \
|
||||
&& mkdir /root/.ssh
|
||||
|
||||
@@ -1,6 +1,15 @@
|
||||
cat /ssh/key.pub > /root/.ssh/authorized_keys
|
||||
echo 'HostKeyAlgorithms +ssh-rsa' >> /etc/ssh/sshd_config
|
||||
echo 'PubkeyAcceptedKeyTypes +ssh-rsa' >> /etc/ssh/sshd_config
|
||||
service ssh start
|
||||
warp-svc > /dev/null &
|
||||
sleep 3
|
||||
warp-cli --accept-tos registration new
|
||||
key=$(cat /config/pac.json | jq -r .warp)
|
||||
if [ ! -z "$key" ]
|
||||
then
|
||||
warp-cli --accept-tos registration license $key
|
||||
fi
|
||||
warp-cli --accept-tos mode proxy
|
||||
warp-cli --accept-tos connect
|
||||
socat TCP-LISTEN:4000,fork TCP:127.0.0.1:40000
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
winsw3.exe stop
|
||||
winsw3.exe start
|
||||
@@ -9,16 +9,25 @@ do
|
||||
branch=$(cat $pwd/update/branch 2>/dev/null)
|
||||
if [[ -n "$cmd" ]]
|
||||
then
|
||||
key=$(cat $pwd/update/key)
|
||||
curl -H "Content-Type: application/json" -X POST https://api.telegram.org/bot$key/editMessageText -d "$(cat $pwd/update/curl | sed 's/"text":"~t~"/"text": "останавливаю бота"/')"
|
||||
docker compose down --remove-orphans
|
||||
curl -H "Content-Type: application/json" -X POST https://api.telegram.org/bot$key/editMessageText -d "$(cat $pwd/update/curl | sed 's/"text":"~t~"/"text": "очищаю директорию"/')"
|
||||
git reset --hard && git clean -fd
|
||||
curl -H "Content-Type: application/json" -X POST https://api.telegram.org/bot$key/editMessageText -d "$(cat $pwd/update/curl | sed 's/"text":"~t~"/"text": "скачиваю обновление"/')"
|
||||
git fetch
|
||||
if [[ -n "$branch" ]]
|
||||
then
|
||||
curl -H "Content-Type: application/json" -X POST https://api.telegram.org/bot$key/editMessageText -d "$(cat $pwd/update/curl | sed 's/"text":"~t~"/"text": "меняю ветку"/')"
|
||||
git checkout -t origin/$branch || git checkout $branch
|
||||
fi
|
||||
curl -H "Content-Type: application/json" -X POST https://api.telegram.org/bot$key/editMessageText -d "$(cat $pwd/update/curl | sed 's/"text":"~t~"/"text": "применяю обновления"/')"
|
||||
git pull > ./update/message
|
||||
curl -H "Content-Type: application/json" -X POST https://api.telegram.org/bot$key/editMessageText -d "$(cat $pwd/update/curl | sed 's/"text":"~t~"/"text": "запускаю бота"/')"
|
||||
IP=$(curl https://ipinfo.io/ip) VER=$(git describe --tags) docker compose up -d --force-recreate
|
||||
bash $pwd/update/update.sh &
|
||||
> $pwd/update/key
|
||||
> $pwd/update/curl
|
||||
exit 0
|
||||
fi
|
||||
sleep 1
|
||||
|
||||
@@ -1,3 +1,13 @@
|
||||
18.04.2024 v1.33
|
||||
- вывод статуса warp в меню
|
||||
18.04.2024 v1.32
|
||||
- фиксы в названии и отображении выбранного шаблона xtls
|
||||
18.04.2024 v1.31
|
||||
- возможность устанавливать ключ для warp
|
||||
16.04.2024 v1.30.1
|
||||
- улучшение сообщения об обновлениях
|
||||
16.04.2024 v1.30
|
||||
- улучшение скрипта обновления
|
||||
16.04.2024 v1.29
|
||||
- рефакторинг подписок
|
||||
- кнопки импорта для различных клиентов
|
||||
|
||||
Reference in New Issue
Block a user