146 lines
7.1 KiB
Markdown
146 lines
7.1 KiB
Markdown
## PepperBot — Telegram‑бот для отслеживания скидок с Pepper.ru
|
||
|
||
PepperBot периодически опрашивает Pepper.ru, ищет новые скидки и отправляет их в Telegram:
|
||
- в **общий чат**, указанный в `TELEGRAM_CHAT_ID`;
|
||
- в **личные подписки пользователей** по ключевым словам.
|
||
|
||
Бот умеет управлять подписками прямо из Telegram через меню и кнопки.
|
||
|
||
### Возможности
|
||
|
||
- **Отправка новых скидок в Telegram**
|
||
- Формирование читаемого сообщения по скидке (цена, старая цена, процент скидки, магазин, ссылка).
|
||
- Отправка в общий канал/группу (`TELEGRAM_CHAT_ID`).
|
||
- **Персональные подписки по ключевым словам**
|
||
- Для каждой скидки ищутся совпадения по названию и магазину.
|
||
- Если совпало с ключевым словом подписки — скидка уходит в соответствующий чат.
|
||
- **Управление подписками через меню в Telegram**
|
||
- Команда `/menu` открывает меню с кнопками:
|
||
- `Добавить подписку`
|
||
- `Удалить подписку`
|
||
- `Список подписок`
|
||
- Добавление подписок по кейвордам.
|
||
- Удаление через inline‑кнопки.
|
||
- Просмотр всех активных подписок.
|
||
- **Health‑endpoint**
|
||
- `GET /health` — используется для проверки работоспособности (например, оркестратором).
|
||
|
||
### Архитектура (вкратце)
|
||
|
||
- `PepperBot` — единственный проект (консольное ASP.NET Core приложение).
|
||
- **Слои:**
|
||
- `Application` — интерфейсы и доменные сервисы (`DealService`, `ISubscriptionRepository`, `ITelegramNotifier` и т.п.).
|
||
- `Domain` — простые модели (`Deal`, `Subscription` и др.).
|
||
- `Infrastructure`
|
||
- `Data` — хранение в SQLite (`SqliteDealRepository`, `SqliteSubscriptionRepository`, файл БД `data/pepper_bot.db`).
|
||
- `Pepper` — клиент Pepper (`IPepperClient` / `PepperClient`).
|
||
- `Telegram` — вся работа с Telegram через библиотеку `Telegram.Bot` (`TelegramNotifier`).
|
||
- `Presentation`
|
||
- `BotWorker` — фоновой воркер, который:
|
||
- инициализирует репозитории;
|
||
- запускает работу `TelegramNotifier` (приём сообщений);
|
||
- каждые 30 секунд опрашивает Pepper и рассылает новые скидки.
|
||
|
||
### Зависимости
|
||
|
||
- .NET `10.0` (Target Framework: `net10.0`).
|
||
- ASP.NET Core (через `Microsoft.AspNetCore.App`).
|
||
- `Microsoft.Data.Sqlite` — для локальной БД.
|
||
- `Telegram.Bot` — работа с Telegram Bot API.
|
||
|
||
### Переменные окружения
|
||
|
||
- **`TELEGRAM_BOT_TOKEN`** — токен Telegram‑бота.
|
||
- **`TELEGRAM_CHAT_ID`** — ID чата/канала/группы для общей рассылки (можно оставить пустым, если общий канал не нужен).
|
||
- **`ASPNETCORE_URLS`** — адрес, на котором слушается HTTP (по умолчанию в `docker-compose.yml` `http://0.0.0.0:8080`).
|
||
|
||
### Запуск локально (без Docker)
|
||
|
||
1. Установите .NET SDK 10.0.
|
||
2. В корне репозитория задайте переменные окружения (пример для PowerShell):
|
||
|
||
```powershell
|
||
$env:TELEGRAM_BOT_TOKEN = "ваш_токен_бота"
|
||
$env:TELEGRAM_CHAT_ID = "ид_чата_для_общей_рассылки" # можно не задавать
|
||
```
|
||
|
||
3. Запустите приложение:
|
||
|
||
```powershell
|
||
cd PepperBot
|
||
dotnet run
|
||
```
|
||
|
||
Приложение поднимет HTTP‑сервер (endpoint `/health`) и запустит фонового воркера с Telegram‑ботом.
|
||
|
||
### Запуск через Docker
|
||
|
||
В корне репозитория уже есть `Dockerfile` и `docker-compose.yml`.
|
||
|
||
#### Быстрый старт
|
||
|
||
1. Задайте переменные окружения в системе или в `.env` рядом с `docker-compose.yml`:
|
||
|
||
```env
|
||
TELEGRAM_BOT_TOKEN=ваш_токен_бота
|
||
TELEGRAM_CHAT_ID=ид_чата_для_общей_рассылки
|
||
```
|
||
|
||
2. Запустите контейнер:
|
||
|
||
```bash
|
||
docker compose up -d --build
|
||
```
|
||
|
||
Что делает `docker-compose.yml`:
|
||
- собирает образ по `Dockerfile`;
|
||
- пробрасывает переменные окружения внутрь контейнера;
|
||
- монтирует `./data` на `/app/data` (там хранится SQLite‑база);
|
||
- прокидывает порт `9001` на `8080` контейнера (health‑endpoint будет доступен по `http://localhost:9001/health`).
|
||
|
||
### Как пользоваться ботом в Telegram
|
||
|
||
1. Создайте бота через `@BotFather` и пропишите его токен в `TELEGRAM_BOT_TOKEN`.
|
||
2. Запустите приложение (локально или в Docker).
|
||
3. Откройте диалог с ботом в Telegram.
|
||
|
||
#### Меню управления подписками
|
||
|
||
- Отправьте `/menu` — появится клавиатура:
|
||
- **Добавить подписку**
|
||
- Бот попросит отправить одно или несколько ключевых слов.
|
||
- Пример: `PLA ABS`, или `PLA, ABS, PETG`.
|
||
- Каждое слово станет отдельной подпиской.
|
||
- **Список подписок**
|
||
- Бот выведет все активные подписки в формате `[Id] keyword`.
|
||
- **Удалить подписку**
|
||
- Бот покажет inline‑кнопки по существующим подпискам.
|
||
- Нажмите на кнопку с нужным ключом — подписка будет деактивирована.
|
||
|
||
#### Как приходят уведомления
|
||
|
||
- Раз в 30 секунд бот опрашивает Pepper.ru.
|
||
- Для каждой новой скидки:
|
||
- отправляет сообщение в общий чат (`TELEGRAM_CHAT_ID`), если задан;
|
||
- подбирает все подписки, у которых ключ входит в `Title` или `StoreName` скидки (без учёта регистра);
|
||
- отправляет сообщение в соответствующие личные/групповые чаты.
|
||
|
||
### Полезное для разработки
|
||
|
||
- Сборка:
|
||
|
||
```bash
|
||
cd PepperBot
|
||
dotnet build
|
||
```
|
||
|
||
- Запуск:
|
||
|
||
```bash
|
||
cd PepperBot
|
||
dotnet run
|
||
```
|
||
|
||
- БД `data/pepper_bot.db` создаётся автоматически при первом запуске.
|
||
|