Files
2026-03-10 16:34:36 +03:00

146 lines
7.1 KiB
Markdown
Raw Permalink 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.
## 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` создаётся автоматически при первом запуске.