Skip to content

Latest commit

 

History

History

bot

UniversityScheduleBot

Бот для Telegram показывающий расписание занятий. Вы можете протестировать его работу, перейдя по ссылке: @UniversityScheduleBot

Docker Cloud Build Status

Docker Hub: paladin705/telegram_schedule_bot

Зависимости

Бот использует Telegram Bot API и Webhook'и для обработки входящих сообщений. Адрес Webhook'а: http://<WEBHOOK_HOST>:<WEBHOOK_PORT>. Можно установить Webhook, открыв браузер и перейдя по адресу: http://<WEBHOOK_HOST>:<WEBHOOK_PORT>/reset_webhook. Для работы бота, необходимо создать SSL сертификаты для Webhook'а.

Бот реализованный в docker контейнере не имеет прямого доступа к сети и использует сокет /bot/socket/bot.sock для обработки запросов. Чтобы передать поступающие запросы боту, можно использовать nginx reverse proxy для передачи их на сокет бота. Также в настройках nginx reverse proxy необходимо указать пути к SSL сертификатам. Без них, бот работать не будет.

Бот использует СУБД PostgreSQL для хранения данных.

Для включения дополнительных функций необходимо установить следующие модули:

  • Модуль для автоматической отправки расписания: autoposting
  • Модуль для работы с базой данных бота (добавление/изменение/удаление групп и файлов расписания): api_server

Создание SSL сертифкатов с помощью OpenSSL для nginx reverse proxy

На Linux, создать сертифкаты с помощью OpenSSL можно следующим образом:

openssl genrsa -out webhook_pkey.pem 2048
openssl req -new -x509 -days 3650 -key webhook_pkey.pem -out webhook_cert.pem

При вводе пункта Common Name, нужно написать IP адрес сервера, на котором будет запущен бот. После завершения создания сертификата, появятся два файла: webhook_pkey.pem и webhook_cert.pem.

Далее представлен пример конфигурации nginx reverse proxy:

server {
    listen 8443 ssl;
    
    ssl_certificate /usr/src/tg_bot_ssl_certificate/webhook_cert.pem;
    ssl_certificate_key /usr/src/tg_bot_ssl_certificate/webhook_pkey.pem;
    
    location / {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        proxy_pass http://unix:/usr/src/tg_bot_socket/bot.sock;
    }
}

В примере были использованы следующие настройки и пути к файлам:

  • Порт сервера - 8443
  • Путь до webhook_cert.pem - /usr/src/tg_bot_ssl_certificate/webhook_cert.pem
  • Путь до webhook_pkey.pem - /usr/src/tg_bot_ssl_certificate/webhook_pkey.pem
  • Путь до сокета бота - http://unix:/usr/src/tg_bot_socket/bot.sock

Docker

Для запуска docker контейнера загружаемого с Docker Hub можно использовать следующую команду:

docker run \
    -v ./tg_bot/socket:/bot/socket \
    -v ./tg_bot/log:/bot/log \
    -e DB_NAME=<Введите значение параметра> \
    -e DB_USER=Введите значение параметра<> \
    -e DB_PASSWORD=<Введите значение параметра> \
    -e DB_HOST=<Введите значение параметра> \
    -e TELEGRAM_API_TOKEN=<Введите значение параметра> \
    -e STATISTIC_TOKEN=<Введите значение параметра> \
    -e WEEK_TYPE=<Введите значение параметра> \
    -e TZ=<Введите значение параметра> \
    paladin705/telegram_schedule_bot:latest

Файлы

  • /bot/socket - В данной директории находится сокет бота: bot.sock. Он используется для обработки запросов к боту
  • /bot/log - Директория где располагаются логи бота

Переменные среды

  • DB_NAME - Название базы данных (БД) PostgreSQL
  • DB_USER - Имя пользователя БД
  • DB_PASSWORD - Пароль пользователя БД
  • DB_HOST - Адрес БД
  • TELEGRAM_API_TOKEN - Токен Telegram Bot API
  • STATISTIC_TOKEN - Токен для отправки статистики на chatbase.com. Необязательный параметр (На данный момент не используется - Chatbase прекращает работу 27 сентября 2021 года)
  • WEEK_TYPE - Тип первой недели семестра 0 - числитель, 1 - знаменатель
  • TZ - Часовой пояс. По умолчанию Europe/Moscow

Команды бота

Бот принимает текстовые команды, а также команды отправленные с помощью кнопок клавиатуры для ботов.

Поддерживаемые команды

Команда Описание команды
/start Выводит стартовое сообщение и предложение зарегистрироваться
/help Выводит информацию о боте и список доступных команд
/registration Выбор ВУЗа, факультета и группы для вывода расписания
/send_report <сообщение> Можно отправить информацию об ошибке или что то ещё
/auto_posting_on <время> Включение и выбор времени для автоматической отправки расписания в диалог, время должно иметь формат ЧЧ:ММ
/auto_posting_off Выключение автоматической отправки расписания
<сообщение> Будет обработанно в зависимости от введённого текста

Расписание занятий

Команды доступны как при обычном текстовом вводе, так и с помощью кнопок.

Список команд:

  • Вся неделя - Выводит расписание занятий в общем виде (для числителя и знаменателя) на всю неделю
  • сегодня, завтра - Выводит расписание на указанный день с учётом типа недели (числитель/знаменатель)
  • понедельник, вторник, среда, четверг, пятница, суббота, воскресенье - Выводит расписание на указанный день в общем виде (для числителя и знаменателя)

Расписание экзаменов

Для показа расписания экзаменов служит команда экзамены. Также на клавиатуре за месяц перед каждой сессией появляется кнопка для показа расписания экзаменов.

Автоматическая отправка расписания

Для включения этой опции, должен быть установлен скрипт autoposting.

Команда /auto_posting_on <ЧЧ:ММ> предназначена для включения автоматической рассылки расписания в назначенное время. Команда имеет обязательный парметр, время отправки <ЧЧ:ММ>. После отправки команды, пользователю будет выведена клавиатура с кнопками <сегодня/завтра> с помощью которых можно выбрать на какой день будет идти отправка расписания: расписание на сегодня, или расписание завтрашних занятий.

Команда /auto_posting_off позволяет отключить автоматическую рассылку расписания.

Регистрация

Пользователь может зарегистрироваться с помощью клавиатуры бота, на каждом шаге регистрации выбирая университет, а затем курс и группу. Для начала регистрации необходимо ввести команду /registration, также пользователю будет предложено зарегистрироваться при первом запуске бота.