Telegram-бот + API + Telegram Mini App для отслеживания цен на товары (сейчас поддерживается Wildberries).
- Добавление товара по ссылке в боте
- Хранение цен в PostgreSQL
- Фоновое обновление цен через Celery + Redis
- Уведомление в Telegram, если цена снизилась
- Мини-приложение Telegram для красивого вывода всех товаров
price_tracker_v2/
├── app/ # FastAPI (backend для Mini App)
├── database/ # SQLAlchemy модели и запросы
├── frontend/ # HTML/CSS/JS для Telegram Mini App
├── parser/
│ ├── wildberries/ # Парсер Wildberries
│ └── ozon/ # Парсер Ozon (в разработке)
├── task_queue/ # Celery app и фоновые задачи
├── teregram_bot/ # Telegram бот (aiogram)
├── requirements.txt # Список библиотек
└── README.md
- macOS/Linux/WSL
- Python 3.10+
- PostgreSQL 14+
- Redis 6+
cd /Users/ilarudyj78gmail.com/Программирование/price_tracker_v2python3 -m venv venv
source venv/bin/activate
python -m pip install --upgrade pippip install -r requirements.txtplaywright install chromiumВариант A (локально через Homebrew):
brew install postgresql@16 redis
brew services start postgresql@16
brew services start redisВариант B (Docker, если удобно):
docker run -d --name pt-postgres -e POSTGRES_PASSWORD=54321 -e POSTGRES_USER=price_tracker_user -e POSTGRES_DB=price_tracker_db -p 5432:5432 postgres:16
docker run -d --name pt-redis -p 6379:6379 redis:7Создай .env в корне проекта со значениями:
TELEGRAM_BOT_TOKEN=your_telegram_bot_token
DATABASE_URL=postgresql+asyncpg://price_tracker_user:54321@localhost:5432/price_tracker_db
REDIS_URL=redis://localhost:6379/0
# Для Mini App
USE_MINI_APP=true
MINI_APP_URL=https://your-public-urlНужно 4 терминала.
source venv/bin/activate
uvicorn app.api:app --host 0.0.0.0 --port 8000 --reloadngrok http 8000Скопируй значение из строки вида:
Forwarding https://xxxxx.ngrok-free.app -> http://localhost:8000
Это и есть MINI_APP_URL в .env.
После изменения .env перезапусти бот.
source venv/bin/activate
celery -A task_queue.celery_app worker --loglevel=infosource venv/bin/activate
python3 -m teregram_bot.main_bot- Бот на старте вызывает
init_db()и создает таблицы при необходимости - Celery worker обрабатывает задачи парсинга
- Фоновый цикл ставит задачи обновления цен по товарам
- Команда
/show_all_productsотправляет кнопку открытия Mini App - Mini App берет
initDataиз Telegram, API валидирует подпись и возвращает товары этого пользователя
/start— приветствие/info— информация о боте/adding_by_link— добавить товар по ссылке/show_one_products— показать товар по local_id или URL/show_all_products— открыть Mini App со всеми товарами/delete_product— удалить товар по local_id или URL
- В Telegram отправить
/adding_by_linkи добавить товар Wildberries - Проверить, что товар появился по
/show_one_products - Отправить
/show_all_products - Нажать кнопку Mini App и убедиться, что список загрузился
- Бот не отвечает на
/show_all_products
- Проверь, что в
.envзаполненMINI_APP_URL - Проверь, что
USE_MINI_APP=true - Перезапусти бот после изменения
.env
- Mini App не открывается
- Проверь, что ngrok запущен
- Проверь, что
MINI_APP_URLначинается сhttps://
- API отдает 401 для Mini App
- Это обычно невалидный
initData(открытие страницы вне Telegram)
- Ошибка
Object of type Bot is not JSON serializable
- В Celery-задачи передавать только примитивы, не объекты
Bot
Таблица users:
telegram_id— ID пользователя в Telegramlocal_id— порядковый номер товара у этого пользователя (1, 2, 3...)url— ссылка на товар
Таблица products:
price_now/price_start/price_max/price_min— цены (NUMERIC 10,2)currency— валюта (берётся с сайта при парсинге)img— URL картинки товара
При удалении товара
local_idостальных товаров автоматически пересчитывается.
Ozon может показать страницу «Доступ ограничен» при парсинге.
Способы снизить риск:
- Ставить редкий интервал обновления (30–120 мин)
- Использовать прокси
- Убедиться, что IP-адрес не датацентровый
- Сейчас поддерживается только Wildberries
- Адрес ngrok временный и меняется при новом запуске
imgзаполняется только при первом парсинге; если элемент не найден — будетnull