Support-BOT

This commit is contained in:
2024-05-01 20:38:22 +03:00
parent b6bf7ed982
commit e70690abe1
2 changed files with 236 additions and 0 deletions

128
README.md
View File

@@ -55,3 +55,131 @@ server {
}
```
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``` - Удаляет права администратора у пользователя в **чате поддержки**. После удаления прав администратора нужно вручную удалить пользователя из группы телеграм.

108
alembic.ini Normal file
View File

@@ -0,0 +1,108 @@
# A generic, single database configuration.
[alembic]
# path to migration scripts
script_location = alembic
# template used to generate migration file names; The default value is %%(rev)s_%%(slug)s
# Uncomment the line below if you want the files to be prepended with date and time
# file_template = %%(year)d_%%(month).2d_%%(day).2d_%%(hour).2d%%(minute).2d-%%(rev)s_%%(slug)s
# sys.path path, will be prepended to sys.path if present.
# defaults to the current working directory.
prepend_sys_path = .
# timezone to use when rendering the date within the migration file
# as well as the filename.
# If specified, requires the python-dateutil library that can be
# installed by adding `alembic[tz]` to the pip requirements
# string value is passed to dateutil.tz.gettz()
# leave blank for localtime
# timezone =
# max length of characters to apply to the
# "slug" field
# truncate_slug_length = 40
# set to 'true' to run the environment during
# the 'revision' command, regardless of autogenerate
# revision_environment = false
# set to 'true' to allow .pyc and .pyo files without
# a source .py file to be detected as revisions in the
# versions/ directory
# sourceless = false
# version location specification; This defaults
# to alembic/versions. When using multiple version
# directories, initial revisions must be specified with --version-path.
# The path separator used here should be the separator specified by "version_path_separator" below.
# version_locations = %(here)s/bar:%(here)s/bat:alembic/versions
# version path separator; As mentioned above, this is the character used to split
# version_locations. The default within new alembic.ini files is "os", which uses os.pathsep.
# If this key is omitted entirely, it falls back to the legacy behavior of splitting on spaces and/or commas.
# Valid values for version_path_separator are:
#
# version_path_separator = :
# version_path_separator = ;
# version_path_separator = space
version_path_separator = os # Use os.pathsep. Default configuration used for new projects.
# set to 'true' to search source files recursively
# in each "version_locations" directory
# new in Alembic version 1.10
# recursive_version_locations = false
# the output encoding used when revision files
# are written from script.py.mako
# output_encoding = utf-8
sqlalchemy.url = driver://user:pass@localhost/dbname
[post_write_hooks]
# post_write_hooks defines scripts or Python functions that are run
# on newly generated revision scripts. See the documentation for further
# detail and examples
# format using "black" - use the console_scripts runner, against the "black" entrypoint
# hooks = black
# black.type = console_scripts
# black.entrypoint = black
# black.options = -l 79 REVISION_SCRIPT_FILENAME
# Logging configuration
[loggers]
keys = root,sqlalchemy,alembic
[handlers]
keys = console
[formatters]
keys = generic
[logger_root]
level = WARN
handlers = console
qualname =
[logger_sqlalchemy]
level = WARN
handlers =
qualname = sqlalchemy.engine
[logger_alembic]
level = INFO
handlers =
qualname = alembic
[handler_console]
class = StreamHandler
args = (sys.stderr,)
level = NOTSET
formatter = generic
[formatter_generic]
format = %(levelname)-5.5s [%(name)s] %(message)s
datefmt = %H:%M:%S