MasterGroosha / telegram-feedback-bot

Пример бота обратной связи без использования БД: https://t.me/Groosha_bot
MIT License
159 stars 36 forks source link
aiogram aiogram3 telegram telegram-bot

Feedback Bot

Предыстория

Когда-то давно в Telegram все пересланные сообщения содержали информацию об авторе, в частности, ID. Благодаря этому можно было легко делать ботов для обратной связи, когда юзер пишет боту, а автор бота через него отвечает. К сожалению, в марте 2019 года всё изменилось и пересланные сообщения от некоторых людей потеряли информацию об отправителях.

Для решения этой проблемы разработчики ботов стали сохранять ID авторов сообщений на стороне бота, а затем провязывать эти айдишники, но я лично считаю такой подход избыточным, т.к. такие данные, по сути, должны храниться вечно (мало ли, на какое сообщение вы решите ответить). В результате появился этот бот. Из плюсов: элементарно контейнеризируется, поскольку хранит всё в оперативной памяти (например, списки блокировок). Из минусов: поддерживает только те сообщения от пользователей, где можно добавлять подпись или редактировать текст, не поддерживает возможность сделать "ответ" (reply) на сообщение (в теории, решаемо) и не позволяет корректно реагировать на редактирование сообщений. Лично меня устраивает такой расклад.

Принцип работы

Сообщения от пользователей копируются методом copyMessage в чат к админу (или админам) с добавлением ID пользователя в виде хэштега, например, #id1234567, к тексту или подписи к медиафайлу. Когда администратор отвечает на сообщение, этот хэштег извлекается, парсится и используется в качестве получателя.

Как переписку видит пользователь:

Как переписку видит пользователь

В свою очередь, администратор видит так (и может пользоваться расширенным набором команд):

Как переписку видит администратор

Установка

Системные требования:

  1. Python 3.9 и выше (не нужно при запуске с Docker);
  2. Linux (должно работать на Windows, но могут быть сложности с установкой);
  3. Systemd (для запуска через systemd);
  4. Docker (для запуска с Docker). Старые версии Docker требуют отдельно docker-compose.

Просто потестировать (не рекомендуется)

  1. Клонируйте репозиторий;
  2. Перейдите (cd) в склонированный каталог и создайте виртуальное окружение Python (Virtual environment, venv);
  3. Активируйте venv и установите все зависимости из requirements.txt;
  4. Скопируйте env_example под именем .env (с точкой в начале), откройте его и заполните переменные;
  5. Внутри активированного venv: python -m bot.

Systemd

  1. Выполните шаги 1-4 из раздела "просто потестировать" выше;
  2. Скопируйте feedback-bot.example.service в feedback-bot.service, откройте и отредактируйте переменные WorkingDirectory и ExecStart;
  3. Скопируйте (или создайте симлинк) файла службы в каталог /etc/systemd/system/;
  4. Активируйте сервис и запустите его: sudo systemctl enable feedback-bot --now;
  5. Проверьте, что сервис запустился: systemctcl status feedback-bot (можно без root-прав).

Docker + Docker Compose

  1. Возьмите файл docker-compose.example.yml из репозитория и переименуйте как docker-compose.yml;
  2. Возьмите файл env_example там же, переименуйте как .env (с точкой в начале), откройте и заполните переменные;
  3. Запустите бота: docker compose up -d (или docker-compose up -d на старых версиях Docker);
  4. Проверьте, что контейнер поднялся: docker compose ps

Локализация

Если вы хотите изменить тексты в боте, ознакомьтесь с информацией в Wiki. В настоящий момент поддерживается только изменение текстов сообщений, но не описаний в меню команд

Папку bot/locales в случае с развертыванием бота в Docker можно переопределить, подсунув её снаружи как volume.