# Бот техподдержки пользователя Пользователи пишут свои вопросы боту компании, бот пересылает эти сообщения в чат поддержки, сотрудники поддержки отвечают на эти сообщения через reply. Основной плюс - анонимизация сотрудников поддержки. Бот работает в режиме webhook, но может работать и в режиме polling. Для обхода запрета на пересылку сообщений у пользователя, бот копирует содержимое и уже затем отправляет его в чат поддержки. По умолчанию бот отправляет сообщения в один чат поддержки с id, указанным в переменных окружения .env. ## Бот умеет - Пересылать сообщения, документы, аудио и видео от пользователя в группу к администраторам и обратно - Выдавать информацию о пользователе из Telegram - Выдавать месячный отчет и отчет за указанный интервал дат по количеству обращений и общему числу сообщений и ответов - Банить и разбанивать пользователей ## Типы контента, которые может пересылать бот - Текстовые сообщения - Фотографии - Группы фотографий (пересылаются по одной) - Видео - Аудиозаписи - Файлы ## Разворачивание образа на личном или vps сервере ### Настройка Nignx Предполагается, что у вас есть готовый настроенный VPS сервер с установленным nginx. 1. Перейти в каталог nginx `sites-available`: ``` sh cd /etc/nginx/sites-available/ ``` 2. Создайте файл с именем вашего домена: ``` sh nano domain.example.com ``` 3. Внутри файла напишите: ``` sh server { listen 80; server_name domain.example.com; location /telegram/ { 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://127.0.0.1:7772; } } ``` `server_name` - ваш домен с подключенным SSL сертификатом (например, Let's Encrypt). Вместо `/telegram/` можно написать любой путь, на который должны приниматься данные. Этот же путь нужно указать в `.env` файле. 4. Создайте символическую ссылку в каталоге `sites-enabled` ```sh sudo ln -s /etc/nginx/sites-available/domain.example.com /etc/nginx/sites-enabled/ ``` 5. Проверьте конфигурацию nginx на ошибки: ```sh sudo nginx -t ``` 6. Перезапустить службу nginx: ```sh sudo systemctl restart nginx ``` 7. Установить certbot: ``` sh sudo apt install -y certbot python3-certbot-nginx ``` 8. Установите HTTPS соединение, выпустив SSL сертификат с помощью certbot для вашего домена: ```sh sudo certbot --nginx ``` 9. Добавить автоматическое обновление сертификата: ```sh sudo certbot renew --dry-run ``` Можно на всякий случай еще раз перезапустить nginx. ### Запуск бота 1. Создайте бота через BotFather (см. ниже), добавьте бота в группу с сотрудниками поддержки, дайте боту права администратора, узнайте id группы (см. ниже). 2. Скопируйте этот репозиторий на сервер любым удобным способом. 3. Создайте .env файл в корне со следующим содержанием: ```sh TELEGRAM_TOKEN=<телеграм_токен_вашего_бота> GROUP_ID= WEBHOOK_DOMAIN=domain.example.com WEBHOOK_PATH=/telegram/ APP_HOST=0.0.0.0 APP_PORT=7772 DATABASE_URL=postgresql+asyncpg://:@:5432/support_bot_db DB_HOST=<имя_контейнера_с_БД> DB_PORT=5432 POSTGRES_USER= POSTGRES_PASSWORD= START_MESSAGE=<Приветственное сообщение бота, когда клиент нажимает кнопку start> ``` В качестве теста логин пользователя БД, пароль и название БД можно указать postgres. Только для теста, не для продакшена! 4. Запустить сборку docker-образа и его запуск из файла `docker-compose`: ```sh sudo docker-compose up -d --build ``` Ключ `-d` для того чтобы контейнер запустился в фоне. 5. Зайдите в контейнер с базой данных, создайте базу данных, выдайте права на нее пользователю (в данном случае postgres): ```sh docker exec -it support-bot-db psql -U postgres \l #убеждаемся, что базы данных нет create database support_bot_db; grant all privileges on database support_bot_db to postgres; \q #выходим из psql ``` 6. Применить миграции: ```sh docker exec -it support-bot alembic upgrade head ``` ### Где что брать 1. `WEBHOOK_DOMAIN` - домен с подключенным ssl сертификатом 2. `WEBHOOK_PATH` - URL путь после домена. В данном случае `WEBHOOK_DOMAIN` + `WEBHOOK_PATH` будет `domain.example.com/telegram/`. 3. Token получаем при создании бота через BotFather [BotFather](https://t.me/BotFather). 4. Свой личный id или id группы можно узнать через бота [myidbot](https://t.me/myidbot). Узнать свой id - написать боту в личку, узнать id группы - добавить бота в чат группы (например группы поддержки), затем ввести команду `/getgroupid`. 5. `APP_HOST` - IP, на котором будет работать приложение (по умолчанию на хосте `127.0.0.1`, `localhost` или можно указать `0.0.0.0`). 6. `APP_PORT` - порт, который приложение будет использовать. Порт должен быть уникальным и не дублировать порты других приложений, работающих на сервере или в Docker. ## Запуск в режиме polling (на локальном компьютере) 1. Скопируйте репозиторий на локальный компьютер. 2. Создайте файл `.env` (см. выше). 3. В файле `.env` удалить (закомментировать) `WEBHOOK_DOMAIN`. Пропишите свои переменные окружения. Так же пропишите переменные окружения в файле `docker-compose-postgres-localhost.yaml` 4. Установить виртуальное окружение, активировать его, установить зависимости из `requirements.txt`: ```sh python -m venv venv pip install -r requirements.txt ``` 5. В докере запустить контейнер с базой данных из файла `docker-compose-postgres-localhost.yaml`: ```sh docker-compose -f docker-compose-postgres-localhost up -d ``` 6. Применить миграцию. ```sh alembic upgrade head ``` 7. Если alembic ругается, что базы данных не существует, создайте ее вручную и выйдите из psql. Затем попробуйте выполнить миграцию повторно: ```sh docker exec -it postgres psql -U postgres # далее в psql create database support_bot_db; grant all privileges on database support_bot_db to postgres; ``` 8. Запустить `main.py`: ```sh python main.py ``` Для запуска необходим python 3.9 или выше. ## Команды бота В **чате поддержки** доступны следующие команды: `/info` - Команда вводится через reply на вопрос пользователя и выдает информацию о нем (имя, фамилия, id, никнейм, а также количество сообщений от пользователя и ответов пользователю. Последние два берутся из созданной базы данных). `/report` - Отчет по количеству клиентов за месяц, сообщений от них и количество ответов администраторов. `/report 01.01.2020 15.06.2024` - Отчет за выбранный период. Две любые даты через пробел, по шаблону. `/ban` - Команда вводится через reply на вопрос пользователя. Банит пользователя. Сообщения от него будут игнорироваться ботом. `/unban` - Команда вводится через reply на вопрос пользователя. Разбанивает пользователя. `/banlist` - Список забаненных пользователей. Выводит список пользователей в формате `id - имя_фамилия`. `/registeradmin` - Регистрирует нового администратора в чате поддержки. Также администратор регистрируется автоматически, если ответит на сообщение клиента через reply. Это сделано на случай, если забыли зарегистрировать администратора, а он уже отвечает на сообщения. `/deleteadmin` - Удаляет права администратора у пользователя в чате поддержки. После удаления прав администратора нужно вручную удалить пользователя из группы Telegram. ## Автозапуск бота 1. Создание службы: Создайте файл службы для вашего бота, например `my_bot.service`: ```sh sudo nano /etc/systemd/system/my_bot.service ``` 2. Редактирование службы: Внесите следующие настройки в файл службы: ```sh [Unit] Description=My Python Telegram Bot After=network.target [Service] User=your_username Group=your_groupname WorkingDirectory=/path/to/your/bot ExecStart=/path/to/your/python /path/to/your/bot/main.py Restart=always [Install] WantedBy=multi-user.target ``` Замените `your_username`, `your_groupname`, `/path/to/your/bot`, и `/path/to/your/python` на соответствующие значения для вашей среды. Убедитесь, что `ExecStart` указывает на правильный путь к вашему скрипту Python бота. 3. Перезагрузка systemd: После того как вы сохранили изменения, перезагрузите systemd для применения новой службы: ```sh sudo systemctl daemon-reload ``` 4. Управление службой: Теперь вы можете управлять вашим ботом как службой. Например, чтобы запустить его и настроить автозапуск при загрузке системы, выполните следующие команды: ```sh sudo systemctl start my_bot sudo systemctl enable my_bot ``` Чтобы проверить статус вашей службы, выполните: ```sh sudo systemctl status my_bot ```