TKBK Studio
TKBK Studio
Свои и чужие цены WB: история, алерт в Telegram при изменении на X% и ежедневная сводка
Сервис для селлера, который следит за конкурентами: вы перечисляете свои и чужие артикулы Wildberries в CSV, а он каждые N минут проверяет цены, хранит историю в SQLite и сообщает в Telegram, когда цена изменилась на заданный процент, товар пропал из продажи или вернулся.
Свои цены берутся из официального API продавца, цены конкурентов — с витрины WB (публичный, но неофициальный эндпоинт — с осторожными паузами и честным предупреждением в README). Каждое утро приходит сводка: текущие цены, изменение за сутки, диапазон за неделю и сравнение вашей цены с самым дешёвым конкурентом в группе.
На странице — таблица цен и график истории по каждому артикулу. В отличие от платных сервисов мониторинга, список товаров и пороги — в обычном CSV, а данные остаются у вас.
Для кого: Селлеры Wildberries и менеджеры по ценообразованию
Ключи и токены не вводятся на сайте — их кладут в файл .env на своём сервере.
WB_TOKENТокен API Wildberries — ЛК → Настройки → Доступ к API → категория «Цены и скидки», только чтениеTELEGRAM_BOT_TOKENТокен Telegram-бота — @BotFather → /newbotTELEGRAM_CHAT_IDID чата для алертов — Добавьте бота в чатMONITOR_PASSWORDПароль веб-интерфейса — Пусто — временный пароль в логе# Мониторинг цен Wildberries — {{SHOP_NAME}}
Сервис следит за ценами ваших товаров и товаров конкурентов на Wildberries, хранит историю в SQLite,
присылает алерт в Telegram, когда цена меняется на {{ALERT_PCT}}% и больше, и каждый день в {{SUMMARY_HOUR}}:00
отправляет сводку: текущие цены, изменение за сутки, диапазон за неделю и сравнение с самым дешёвым конкурентом.
## Что умеет
- Список товаров — в `products.csv` (свои и чужие артикулы WB, группы для сравнения, свой порог алерта).
- Свои цены — через **официальный** API продавца «Цены и скидки» (`POST /api/v2/list/goods/filter`).
- Цены конкурентов — через публичный эндпоинт витрины `card.wb.ru` (**неофициальный**, см. ниже) — медленно,
пачками по 20 артикулов, с паузами и повтором при 429.
- Проверка каждые {{CHECK_MINUTES}} мин.; алерт при изменении относительно цены последнего уведомления
(плавное снижение по 1% тоже будет замечено), а также «пропал из продажи» и «снова в продаже».
- Страница с таблицей цен и графиком истории (Chart.js), ручной запуск проверки, вход по паролю.
## Запуск за 5 минут
### С Docker
```bash
cp .env.example .env # WB_TOKEN, Telegram, MONITOR_PASSWORD
# впишите свои и чужие артикулы в products.csv
docker compose up -d --build
```
Откройте http://localhost:8000 (логин `admin`). Первая проверка начнётся через 5 секунд после запуска.
### Без Docker (Python 3.12)
```bash
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
cp .env.example .env
python -m app
```
## products.csv
```
nm_id;type;label;group;alert_pct
12345678;own;Мой свитер оверсайз;свитеры;
87654321;competitor;Свитер конкурента А;свитеры;3
```
- `nm_id` — артикул WB (число из адреса карточки `wildberries.ru/catalog/<nm_id>/detail.aspx`).
- `type` — `own` (свой) или `competitor` (чужой); можно по-русски: «свой» / «чужой».
- `group` — необязательно: товары одной группы сравниваются в сводке («ваш дороже конкурента на 7%»).
- `alert_pct` — необязательно: свой порог алерта для товара (иначе {{ALERT_PCT}}%).
- Файл перечитывается при каждой проверке — перезапуск не нужен.
## Где взять токен WB
1. ЛК продавца → **Настройки → Доступ к API** → «Создать токен», тип **Персональный**.
2. Категория **«Цены и скидки»**, галочка **«Только на чтение»**.
3. Токен → `WB_TOKEN`. Без токена свои цены тоже берутся с витрины (`OWN_PRICES_VIA=public`).
Telegram: бот от @BotFather → `TELEGRAM_BOT_TOKEN`, чат → `TELEGRAM_CHAT_ID`.
## Важно про цены конкурентов (неофициальный эндпоинт)
У Wildberries нет официального API для чужих товаров. Сервис берёт цены с того же адреса, что использует
сайт (`card.wb.ru/cards/v4/detail`). Это **не документированный и не гарантированный** способ:
- WB может поменять формат ответа или версию адреса — тогда поменяйте `WB_PUBLIC_CARD_URL` и, при
необходимости, разбор в `app/sources/public.py`;
- при частых запросах или с «плохого» IP (дата-центры, зарубежные серверы) витрина отвечает 403/429 —
сервис пропустит проверку чужих цен и покажет предупреждение на странице, свои цены продолжат обновляться;
- используйте разумный интервал (не чаще раза в 15–30 минут) и умеренное число артикулов.
Цена на витрине и цена из API продавца различаются: в API — цена со скидкой продавца, на витрине — ещё и
со скидкой WB (СПП). Чтобы сравнивать одинаково, поставьте `OWN_PRICES_VIA=public`.
## Настройки из мастера
`app/config.py` (константы `WIZARD_*`): название, порог алерта, интервал проверки, час сводки, источник своих
цен. Переопределяются в `.env`: `SHOP_NAME`, `ALERT_PCT`, `CHECK_MINUTES`, `SUMMARY_HOUR`, `OWN_PRICES_VIA`.
## Тесты
```bash
pip install pytest==9.1.1
pytest
```
Тесты не ходят в сеть: WB и Telegram подменены `httpx.MockTransport`.
## FAQ
**На странице «витрина WB (card.wb.ru): HTTP 403».** Витрина не пускает запросы с вашего сервера. Попробуйте
сервер в России, увеличьте `CHECK_MINUTES` или сократите список конкурентов.
**Почему цена «нет в наличии»?** Товар закончился или WB не отдал цену (размеров без цены нет).
**Где история?** В `data/prices.db`; график — на странице, данные — `GET /api/history/<nm_id>?days=30`.
## Ограничения API
- «Цены и скидки» WB: до 1000 артикулов в запросе, лимит — 10 запросов за 6 секунд.
- Витрина WB: лимиты не опубликованы; сервис делает 1 запрос на 20 артикулов с паузой 3–5 секунд.
Услуги, мастера, свободные окна на 14 дней, напоминания за сутки и за 2 часа, предоплата и отзывы
Оценка 0–10 после заказа: довольных — на Яндекс Карты, 2ГИС и WB, недовольных — сразу к менеджеру
Оплата звёздами или картой, одноразовые ссылки, напоминания о продлении и автоисключение по окончании