From d5a3ce7531acac86ce2f84368145e5825e39211a Mon Sep 17 00:00:00 2001 From: Sergey Date: Tue, 23 Feb 2021 23:22:16 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=BE=D0=B2=D1=8B=D0=B9=20=D1=83=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D1=89=D0=B8=D0=BA=20=D0=B8=20?= =?UTF-8?q?=D0=B8=D0=BD=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=86=D0=B8=D1=8F.?= =?UTF-8?q?=20=D0=94=D0=B0=20=D0=B2=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=20=D0=B2?= =?UTF-8?q?=D1=81=D1=91=20=D0=BD=D0=BE=D0=B2=D0=BE=D0=B5=20(=D0=BA=D1=80?= =?UTF-8?q?=D0=BE=D0=BC=D0=B5=20=D0=B1=D0=BE=D1=82=D0=B0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 48 +++++++++++++++++++++++++++++++++++++++++ docker-compose.yml | 2 +- install.sh | 53 +++++++++++++++++++++++++++++++--------------- setenv.py | 18 +++++++++++----- telegram.py | 6 +++++- 5 files changed, 103 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 67786ed..1f66c11 100644 --- a/README.md +++ b/README.md @@ -1 +1,49 @@ # tgvkbot +Общайтесь в VK через Telegram бота. + +- Бот от разработчика - [@tgvkbot](https://t.me/tgvkbot) + +- Канал - [@tg_vk](https://t.me/tg_vk) + +- Чат - https://t.me/joinchat/BZq6jwxeTh04qBzilM5x3g + + +# Простая Установка (Ubuntu) +```bash +git clone https://github.com/Kylmakalle/tgvkbot +cd tgvkbot +./install.sh + +Токен Telegram бота: 123456789:AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLL +VK APP ID (можно оставить пустым): +``` + +Далее потребуется ввести пароль от `sudo` пользователя и Telegram-token, остальные переменные необязательны. + +_Установщик поставит Docker и docker-compose, настроит переменные окружения и запустит контейнер для обновлений, а затем поднимет бота с его базой данных._ + + +### Ограничение пользователей +Если по каким-то причинам хочется чтобы ботом пользовались исключительно определенные пользователи, то это можно сделать изменив файл конфигурации. +Потребуется прописать параметр в таком виде, где числа - Telegram ID пользователей через запятую. + +`ALLOWED_USER_IDS=12345678,001238091` + +ID можно узнать командой `/id` в боте или через других ботов/софт. + + +### Обновление +Бот автоматически обновляется через образ на [dockerhub](https://hub.docker.com/r/kylmakalle/tgvkbot/tags?page=1&ordering=last_updated), где на всякий случай фиксируются версии каждого коммита. + +Стандартный установщик поднимает [watchtower](https://containrrr.dev/watchtower), который раз в час проверяет обновления. + +# Сервисы музыки (Устаревшие) +Ниже прокси для музыки, которые использовали ранее. Сейчас они нерелевантны, но код открыт и в боте есть поддержка кастомных бэкендов музыки. + +API - https://github.com/Kylmakalle/thatmusic-api + +Token Refresher - https://github.com/Kylmakalle/vk-audio-token/tree/refresh-api + + +# Лицензия +MIT diff --git a/docker-compose.yml b/docker-compose.yml index 9372eee..f44c39b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,7 +2,7 @@ version: '3' services: - app: + bot: image: kylmakalle/tgvkbot:latest container_name: tgvkbot logging: diff --git a/install.sh b/install.sh index a2804cf..3793de1 100755 --- a/install.sh +++ b/install.sh @@ -1,26 +1,41 @@ -sudo true +#!/usr/bin/env bash +ASKED_FOR_SUDO="" -if [ ! `which docker` ]; then - echo "🔨 Устанавливаем docker..." - # Alternatively you can use the official docker install script - wget -qO- https://get.docker.com/ | sh +if [ ! $(which docker) ]; then + echo "🔑 Пароль sudo потребуется для установки Docker" + sudo true + ASKED_FOR_SUDO="1" + + echo "🔨 Устанавливаем docker..." + curl -fsSL https://get.docker.com/ | sh + user="$(id -un 2>/dev/null || true)" + sudo groupadd docker + sudo usermod -aG docker $user +else + echo "👌 Docker уже установлен" fi -if [ ! `which docker-compose` ]; then - echo "🔨 Устанавливаем docker-compose..." - # Install docker-compose - COMPOSE_VERSION=`git ls-remote https://github.com/docker/compose | grep refs/tags | grep -oE "[0-9]+\.[0-9][0-9]+\.[0-9]+$" | sort --version-sort | tail -n 1` - sudo sh -c "curl -L https://github.com/docker/compose/releases/download/${COMPOSE_VERSION}/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose" - sudo chmod +x /usr/local/bin/docker-compose - sudo sh -c "curl -L https://raw.githubusercontent.com/docker/compose/${COMPOSE_VERSION}/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose" +if [ ! $(which docker-compose) ]; then + if [ ! $ASKED_FOR_SUDO ]; then + echo "🔑 Пароль sudo потребуется для установки docker-compose" + sudo true + ASKED_FOR_SUDO="1" + fi + echo "🔨 Устанавливаем docker-compose..." + # Install docker-compose + COMPOSE_VERSION=$(git ls-remote https://github.com/docker/compose | grep refs/tags | grep -oE "[0-9]+\.[0-9][0-9]+\.[0-9]+$" | sort --version-sort | tail -n 1) + sudo sh -c "curl -L https://github.com/docker/compose/releases/download/${COMPOSE_VERSION}/docker-compose-$(uname -s)-$(uname -m) > /usr/local/bin/docker-compose" + sudo chmod +x /usr/local/bin/docker-compose + sudo sh -c "curl -L https://raw.githubusercontent.com/docker/compose/${COMPOSE_VERSION}/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose" +else + echo "👌 Docker-compose уже установлен" fi - echo "⚙️ Настраиваем переменные окружения..." -python3 set_env.py +python3 setenv.py -if [ ! "$(docker ps -a | grep )" ]; then - echo "🔄 Поднимаем систему обновлений..." +if [ ! "$(docker ps -a | grep watchtower)" ]; then + echo "🔄 Поднимаем систему обновлений watchtower..." docker run -d \ --name watchtower \ --restart always \ @@ -31,10 +46,14 @@ if [ ! "$(docker ps -a | grep )" ]; then -e WATCHTOWER_MONITOR_ONLY='false' \ -e WATCHTOWER_LABEL_ENABLE='true' \ containrrr/watchtower:latest +else + echo "👌 Апдейтер watchtower уже запущен" fi +# Нужно убедиться, что бот встанет +set -e + echo "🚀 Запускаем бота..." docker-compose up -d echo "✅ Готово" - diff --git a/setenv.py b/setenv.py index b3ebde2..8704c54 100644 --- a/setenv.py +++ b/setenv.py @@ -12,6 +12,7 @@ VK_APP_ID=%(vk_app_id)s ALLOWED_USER_IDS=%(allowed_user_ids)s """ +ENV_FILE = 'env_file' def check_token(token): response = urlopen("https://api.telegram.org/bot{token}/{method}".format(token=token, method='getMe')) @@ -43,13 +44,14 @@ def set_env(): tg_token = input('Токен Telegram бота: ') tg_token = tg_token.strip() try: + print('⏳ Проверяем токен...') check_token(tg_token) break except HTTPError: print('❌ Токен бота неверный или нерабочий, попробуйте снова!') while True: - vk_app_id = input('VK APP ID: ') + vk_app_id = input('VK APP ID (можно оставить пустым): ') vk_app_id = vk_app_id.strip() if vk_app_id: try: @@ -57,13 +59,19 @@ def set_env(): break except HTTPError: print('❌ VK APP ID неверный, попробуйте снова!') + else: + print('ℹ️ Будет использован VK APP ID {} от Kate Mobile'.format(VK_APP_ID)) + break - with open('env_file', 'w') as env_file: - env_file.write(s + with open(ENV_FILE, 'w') as env_file: + env_file.write( ENV_FILE_TEMPLATE % {'tg_token': tg_token, 'vk_app_id': vk_app_id or VK_APP_ID, 'allowed_user_ids': ''}) - print('✅ Успешно!') + print('✅ Переменные успешно установлены в {}'.format(ENV_FILE)) if __name__ == '__main__': - set_env() + try: + set_env() + except KeyboardInterrupt: + print('\n⚠️ Настройка переменных окружуения была прервана!') diff --git a/telegram.py b/telegram.py index a25f361..4ca0248 100644 --- a/telegram.py +++ b/telegram.py @@ -698,7 +698,7 @@ async def help_command(msg: types.Message): '/chat - Список связанных чатов с диалогами ВКонтакте, привязать чат к диалогу можно добавив бота в группу\n' \ '/stop - Выход из ВКонтакте\n' \ '/help - Помощь' \ - '/id - Узнать Telegram ID' + '/id - Узнать Telegram ID' await bot.send_message(msg.chat.id, HELP_MESSAGE, parse_mode=ParseMode.HTML) @@ -714,6 +714,10 @@ async def handle_text(msg: types.Message): if msg.chat.type == 'private': m = oauth_link.search(msg.text) if m: + if ALLOWED_USER_IDS: + if str(msg.from_user.id) not in ALLOWED_USER_IDS.replace(' ', '').split(','): + await msg.reply('⛔️ Бот недоступен для Вашего аккаунта.\nУзнать Telegram ID - /id') + return await bot.send_chat_action(msg.from_user.id, ChatActions.TYPING) token = m.group(2) if not VkUser.objects.filter(token=token).exists():