Вернуться в blog
12 июн. 2024 г.
6 min read

# Хватит терять заявки пользователей

Пора сделать бота для принятия заявок от пользователей всем IT отделом.

# Бот техподдержки пользователя

https://git.fipi.pro/Plata_Upravleniya_RF/Support-BOT

Пользователи пишут свои вопросы боту компании, бот пересылает эти сообщения в чат поддержки, сотрудники поддержки отвечают на эти сообщения через reply. Основной плюс - анонимизация сотрудников поддержки.

Бот работает в режиме webhook, но может работать и в режиме polling.

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

По умолчанию бот отправляет сообщения в один чат поддержки с id, указанным в переменных окружения .env.

## Бот умеет

- Пересылать сообщения, документы, аудио и видео от пользователя в группу к администраторам и обратно
- Выдавать информацию о пользователе из Telegram
- Выдавать месячный отчет и отчет за указанный интервал дат по количеству обращений и общему числу сообщений и ответов
- Банить и разбанивать пользователей

## Типы контента, которые может пересылать бот

- Текстовые сообщения
- Фотографии
- Группы фотографий (пересылаются по одной)
- Видео
- Аудиозаписи
- Файлы

## Разворачивание образа на личном или 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/domain.example.com /etc/nginx/sites-enabled/

5. Проверьте конфигурацию nginx на ошибки:

    sudo nginx -t

6. Перезапустить службу nginx:

    sudo systemctl restart nginx

7. Установить certbot:

    sudo apt install -y certbot python3-certbot-nginx

8. Установите HTTPS соединение, выпустив SSL сертификат с помощью certbot для вашего домена:

    sudo certbot --nginx

9. Добавить автоматическое обновление сертификата:

    sudo certbot renew --dry-run

Можно на всякий случай еще раз перезапустить nginx.

### Запуск бота

1. Создайте бота через BotFather (см. ниже), добавьте бота в группу с сотрудниками поддержки, дайте боту права администратора, узнайте id группы (см. ниже).
2. Скопируйте этот репозиторий на сервер любым удобным способом.
3. Создайте .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. Только для теста, не для продакшена!

4. Запустить сборку docker-образа и его запуск из файла `docker-compose`:

    sudo docker-compose up -d --build

Ключ `-d` для того чтобы контейнер запустился в фоне.

5. Зайдите в контейнер с базой данных, создайте базу данных, выдайте права на нее пользователю (в данном случае 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 получаем при создании бота через BotFather BotFather.
4. Свой личный id или id группы можно узнать через бота 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`:

    python -m venv venv
    pip install -r requirements.txt

5. В докере запустить контейнер с базой данных из файла `docker-compose-postgres-localhost.yaml`:

    docker-compose -f docker-compose-postgres-localhost up -d

6. Применить миграцию.

    alembic upgrade head

7. Если 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;

8. Запустить `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.

## Автозапуск бота

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

Prev
Установливаем последний Microsoft Office с официального сайта.
Next
Групповые политики GPO для Zabbix Agent с использованием магии API