Бот техподдержки пользователя
https://git.fipi.pro/Plata_Upravleniya_RF/Support-BOT
Пользователи пишут свои вопросы боту компании, бот пересылает эти сообщения в чат поддержки, сотрудники поддержки отвечают на эти сообщения через reply. Основной плюс - анонимизация сотрудников поддержки.
Бот работает в режиме webhook, но может работать и в режиме polling.
Для обхода запрета на пересылку сообщений у пользователя, бот копирует содержимое и уже затем отправляет его в чат поддержки.
По умолчанию бот отправляет сообщения в один чат поддержки с id, указанным в переменных окружения .env.
Бот умеет
- Пересылать сообщения, документы, аудио и видео от пользователя в группу к администраторам и обратно
- Выдавать информацию о пользователе из Telegram
- Выдавать месячный отчет и отчет за указанный интервал дат по количеству обращений и общему числу сообщений и ответов
- Банить и разбанивать пользователей
Типы контента, которые может пересылать бот
- Текстовые сообщения
- Фотографии
- Группы фотографий (пересылаются по одной)
- Видео
- Аудиозаписи
- Файлы
Разворачивание образа на личном или vps сервере
Настройка Nignx
Предполагается, что у вас есть готовый настроенный VPS сервер с установленным nginx.
- Перейти в каталог nginx
sites-available:
cd /etc/nginx/sites-available/
- Создайте файл с именем вашего домена:
nano domain.example.com
- Внутри файла напишите:
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 файле.
- Создайте символическую ссылку в каталоге
sites-enabled
sudo ln -s /etc/nginx/sites-available/domain.example.com /etc/nginx/sites-enabled/
- Проверьте конфигурацию nginx на ошибки:
sudo nginx -t
- Перезапустить службу nginx:
sudo systemctl restart nginx
- Установить certbot:
sudo apt install -y certbot python3-certbot-nginx
- Установите HTTPS соединение, выпустив SSL сертификат с помощью certbot для вашего домена:
sudo certbot --nginx
- Добавить автоматическое обновление сертификата:
sudo certbot renew --dry-run
Можно на всякий случай еще раз перезапустить nginx.
Запуск бота
- Создайте бота через BotFather (см. ниже), добавьте бота в группу с сотрудниками поддержки, дайте боту права администратора, узнайте id группы (см. ниже).
- Скопируйте этот репозиторий на сервер любым удобным способом.
- Создайте .env файл в корне со следующим содержанием:
TELEGRAM_TOKEN=<телеграм_токен_вашего_бота>
GROUP_ID=<id_группы_или_супергруппы_в_телеграме>
WEBHOOK_DOMAIN=domain.example.com
WEBHOOK_PATH=/telegram/
APP_HOST=0.0.0.0
APP_PORT=7772
DATABASE_URL=postgresql+asyncpg://<postgres_user>:<postgres_password>@<postgres_container_name>:5432/support_bot_db
DB_HOST=<имя_контейнера_с_БД>
DB_PORT=5432
POSTGRES_USER=<postgres_user>
POSTGRES_PASSWORD=<postgres_password>
START_MESSAGE=<Приветственное сообщение бота, когда клиент нажимает кнопку start>
В качестве теста логин пользователя БД, пароль и название БД можно указать postgres. Только для теста, не для продакшена!
- Запустить сборку docker-образа и его запуск из файла
docker-compose:
sudo docker-compose up -d --build
Ключ -d для того чтобы контейнер запустился в фоне.
- Зайдите в контейнер с базой данных, создайте базу данных, выдайте права на нее пользователю (в данном случае postgres):
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
- Применить миграции:
docker exec -it support-bot alembic upgrade head
Где что брать
WEBHOOK_DOMAIN- домен с подключенным ssl сертификатомWEBHOOK_PATH- URL путь после домена. В данном случаеWEBHOOK_DOMAIN+WEBHOOK_PATHбудетdomain.example.com/telegram/.- Token получаем при создании бота через BotFather BotFather.
- Свой личный id или id группы можно узнать через бота myidbot. Узнать свой id - написать боту в личку, узнать id группы - добавить бота в чат группы (например группы поддержки), затем ввести команду
/getgroupid. APP_HOST- IP, на котором будет работать приложение (по умолчанию на хосте127.0.0.1,localhostили можно указать0.0.0.0).APP_PORT- порт, который приложение будет использовать. Порт должен быть уникальным и не дублировать порты других приложений, работающих на сервере или в Docker.
Запуск в режиме polling (на локальном компьютере)
- Скопируйте репозиторий на локальный компьютер.
- Создайте файл
.env(см. выше). - В файле
.envудалить (закомментировать)WEBHOOK_DOMAIN. Пропишите свои переменные окружения. Так же пропишите переменные окружения в файлеdocker-compose-postgres-localhost.yaml - Установить виртуальное окружение, активировать его,
установить зависимости из
requirements.txt:
python -m venv venv
pip install -r requirements.txt
- В докере запустить контейнер с базой данных из файла
docker-compose-postgres-localhost.yaml:
docker-compose -f docker-compose-postgres-localhost up -d
- Применить миграцию.
alembic upgrade head
- Если alembic ругается, что базы данных не существует, создайте ее вручную и выйдите из psql. Затем попробуйте выполнить миграцию повторно:
docker exec -it postgres psql -U postgres
# далее в psql
create database support_bot_db;
grant all privileges on database support_bot_db to postgres;
- Запустить
main.py:
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.
Автозапуск бота
- Создание службы:
Создайте файл службы для вашего бота, например
my_bot.service:
sudo nano /etc/systemd/system/my_bot.service
- Редактирование службы: Внесите следующие настройки в файл службы:
[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 бота.
- Перезагрузка systemd: После того как вы сохранили изменения, перезагрузите systemd для применения новой службы:
sudo systemctl daemon-reload
- Управление службой: Теперь вы можете управлять вашим ботом как службой. Например, чтобы запустить его и настроить автозапуск при загрузке системы, выполните следующие команды:
sudo systemctl start my_bot
sudo systemctl enable my_bot
Чтобы проверить статус вашей службы, выполните:
sudo systemctl status my_bot