Сервис круглосуточно отслеживает ассортимент закрытого вебшопа поставщика (florashopping.nl): по расписанию собирает каталог, сохраняет историю цен и остатков в PostgreSQL и присылает в Telegram сигналы о выгодных изменениях. Управление — прямо в Telegram-боте, без правки кода и конфигов.
Сервис работает строго в режиме чтения: кнопки покупки и корзина не затрагиваются ни при каких условиях.
| Сигнал | Когда приходит |
|---|---|
| 🆕 Новая позиция | товар впервые появился в каталоге |
| 🔥 Критическое падение цены | цена упала в N раз (по умолчанию 2×, настраивается) |
| 🏆 Исторический минимум побит | цена ниже минимума за всю историю наблюдений |
| 🔄 Снова в наличии | количество стало больше нуля после нуля |
| 🎯 Цена ниже желаемой | для позиций из вашего списка отслеживания |
В каждом сообщении: название и сорт, цена (для обвала — старая, новая и % скидки), параметры растения, наличие, хештег и прямая ссылка на карточку. Повторные сигналы отсекаются: один и тот же сигнал не приходит чаще, чем раз в 24 часа (окно настраивается), «новинка» — только один раз. При аномально большом количестве однотипных сигналов за цикл бот присылает первые 30 подробно и одну сводку по остальным.
Раз в час с 9:00 до 21:00 и раз в 2 часа с 22:00 до 8:00 по Москве. Один цикл занимает 8–10 минут: парсер ходит по сайту с паузами, чтобы не создавать нагрузку.
/admin— панель управления (доступна только администраторам из.env):- Минус-слова — добавить/удалить/посмотреть; товары с этими словами не попадают в минимумы и не порождают сигналы. Стартовый список (50 слов) загружается автоматически при первом запуске.
- Триггеры цен — порог обвала (пресеты или своё значение), чувствительность минимума, окно дедупликации.
- Типы уведомлений — тумблеры 🟢/🔴 для новинок, обвала и минимума.
- Список отслеживания — добавить позицию по ID, задать желаемую цену, удалить из списка.
/scan— внеплановый запуск цикла с прогресс-баром (для проверки).
Требуются Docker и Docker Compose v2 (на Linux-сервере: apt install docker.io docker-compose-v2 или официальный скрипт docker.com).
cp .env.example .env # заполнить доступы и токены, см. таблицу ниже
docker compose up -d --build
docker compose logs -f app| Переменная | Что это |
|---|---|
SHOP_BASE_URL |
адрес вебшопа |
SHOP_USERID, SHOP_PASSWORD |
логин и пароль от вебшопа |
SHOP_VOORCOD |
код раздела каталога (22 — комнатные растения) |
REQUEST_DELAY_SECONDS |
пауза между запросами к сайту (по умолчанию 0.7) |
TELEGRAM_BOT_TOKEN |
токен бота от @BotFather |
TELEGRAM_CHAT_ID |
куда слать сигналы (id чата/группы/канала) |
ADMIN_USER_IDS |
id администраторов через запятую |
Быстрая самодиагностика (конфиг + база + схема):
docker compose run --rm app python -m webshop.app --checkПервый цикл — «базовый»: каталог целиком записывается в базу, сигналы «новинка» за него не рассылаются.
- Контейнеры перезапускаются сами (
restart: unless-stopped), данные живут в docker-томеpgdataи переживают перезапуски и обновления. - При падении сайта, ошибке авторизации или изменении вёрстки сервис не останавливается: ошибка пишется в лог и приходит администраторам в Telegram.
- Обновление версии: заменить файлы,
docker compose up -d --build. - Логи:
docker compose logs -f app.
Python 3.12, requests + BeautifulSoup, python-telegram-bot v21, PostgreSQL 16.
| Модуль | Ответственность |
|---|---|
site_client |
вход на сайт, чтение каталога и карточек, авто-перелогин |
catalog_parser |
разбор HTML в структуры данных |
storage |
вся работа с PostgreSQL |
scanner |
цикл сбора: каталог → детали → база |
triggers |
правила сигналов «если → то» |
notifier |
формирование сообщений, отправка, дедупликация |
admin_bot |
меню /admin и /scan |
scheduler |
расписание по Москве |
Таблицы БД: products (характеристики позиций), product_stocks (почасовые
срезы цен и остатков), product_price_floors (исторические минимумы),
negative_words, tracked_products, settings, sent_notifications.
Схема создаётся автоматически при старте.
Тесты (75 шт., включая разбор реальных страниц сайта):
docker compose up -d db
python3 -m venv .venv && .venv/bin/pip install -e ".[dev]"
.venv/bin/pytest