Files
Support-BOT/README.md
2024-05-01 21:10:09 +03:00

221 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Бот техподдерки пользователя
Пользователи пишут свои вопросы боту компании, бот пересылает эти сообщения в чат поддержки, сотрудники поддержки отвечают на эти сообщения через reply. Основной плюс - анонимизация сотрудников поддержки.
Бот работает в режиме webhook, но может работать и в режиме polling
Для обхода запрета на пересылку сообщения у пользователя, бот копирует содержимое и уже затем отправляет его в чат поддержки.
По умолчанию бот отправляет сообщения в один чат поддержки с id, указанным в переменных окружения .env
## Бот умеет
- Пересылать сообщения, документы, аудио и видео от пользователя в группу к администраторам и обратно
- Выдавать информацию о пользователе из телеграма
- Выдавать месячный отчет и за указанный интервал даты по количеству обращений и общему числу сообщений и ответов
- Банить и разбанивать пользователей
## Типы контента, которые может пересылать бот
- Текстовые сообщения
- Фотографии
- Группы фотографий (пересылаются по одной)
- Видео
- Аудиозаписи
- Файлы
## Разворачивание образа на личном или vps сервере
### Настройка Nignx
Предполагается, что есть готовый настроенный vps сервер с установленным nginx.
1.Перейти в каталог nginx sites-available
```
cd /etc/nginx/sites-available/
```
2.Создать файл с именем вашего домена
```
nano domain.example.com
```
3.Внутри написать
```
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
```
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
```
5.Проверить что нет ошибок в конфигурации nginx
```
sudo nginx -t
```
6. Перезапустить службу nginx
```sh
sudo systemctl restart nginx
```
7. Установить certbot - ```sudo apt install -y certbot python3-certbot-nginx```
8. Установить https соединение, выпустив ssl сертификат с помощью certbot для вашего домена
```sh
sudo certbot --nginx
```
9 Добавить автоматическое обновление сертификата ```sudo certbot renew --dry-run ```
Можно на всякий случай еще раз перезапустить nginx
### Запуск бота
1. Создать бота через botfather (см. ниже), добавить бота в группу с сотрудниками поддержки, дать боту права администратора, узнать id группы (см. ниже)
2. Cкопировать этот гит на сервер любым удобным способом
3. Создать .env файл в корне со следующим содержанием:
```sh
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. Только для теста, не для продакшена!
4. Запустить сборку docker-образа и его запуск из файла docker-compose.
```sh
sudo docker-compose up -d --build
```
Ключ -d для того чтобы контейнер запустился в фоне.
5. Зайти в контейнер c базой данных, создать базу данных, выдать права на нее пользователю (в данном случае 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
```
6. Применить миграции
```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 получаем при создании бота через отца ботов (https://t.me/BotFather)
4. Свой личный id или id группы узнать можно через этого бота.
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](docker-compose-postgres-localhost.yaml).
```sh
docker-compose -f docker-compose-postgres-localhost up -d
```
6. Применить миграцию.
```sh
alembic upgrade head
```
7. Если алембик ругается что база данных не существует, создать ее вручную и выйти из psql. Затем попытаться сделать миграцию повторно.
```sh
docker exec -it postgres psql -U postgres
#далее sql
create database support_bot_db;
grant all privileges on database support_bot_db to postgres;
```
5. Запустить main.py ```python main.py```. По умолчанию бот должен подключиться базе данных postgres с именем пользователя postgres и паролем postgres
PS: Для запуска необходим python 3.9 или выше
## Команды бота
В **чате поддержки** доступны следующие команды:
```/info``` - Команда вводится через reply на вопрос пользователя и выдает информацию о нем (Имя,
фамилия, id, никнейм, а также количество сообщений от пользователя и ответов пользователю. Последие 2 - берутся из созданной базы данных.
```/report``` - отчет по количеству клиентов за месяц, сообщений от них и количество ответов администраторов.
```/report 01.01.2020 15.02.2021``` - отчет за выбранный период. Две любые даты через пробел, по шаблону.
```/ban``` - Команда вводится через reply на вопрос пользователя. Банит пользователя. Сообщения от него будут игнорироваться ботом
```/unban``` - Команда вводится через reply на вопрос пользователя. Разбанивает пользователя.
```/banlist``` - Список забаненных пользователей. Выводит список пользователей в формате id - имя_фамилия
```/registeradmin``` - Регистрирует нового администратора в **чате поддержки**. Также, адинистратор регистриуется автоматически, если ответит на сообщение клиента через reply. Это сделано на случай если забыли зарегистрировать администратора, а он уже отвечает на сообщения.
```/deleteadmin``` - Удаляет права администратора у пользователя в **чате поддержки**. После удаления прав администратора нужно вручную удалить пользователя из группы телеграм.
## Автозапуск бота
1.Создание службы:Создайте файл службы для вашего бота. Например, my_bot.service
```
sudo nano /etc/systemd/system/my_bot.service
```
2.Редактирование службы:Внесите следующие настройки в файл службы:
```
[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 для применения новой службы:
```
sudo systemctl daemon-reload
```
4.Управление службой:Теперь вы можете управлять вашим ботом как службой. Например, чтобы запустить его и настроить автозапуск при загрузке системы, выполните следующие команды:
```
sudo systemctl start my_bot
sudo systemctl enable my_bot
```
Чтобы проверить статус вашей службы, выполните:
```
sudo systemctl status my_bot
```