Telegram бот отслеживает минимальную цену подходящих предложений в каталогах FunPay и сообщает о заметном снижении. Пользователь отправляет ссылку, выбирает фильтры прямо в Telegram и получает уведомления без постоянного просмотра сайта
Поддерживаются каталоги https://funpay.com/lots/<id>/ и https://funpay.com/chips/<id>/
- автоматическое извлечение фильтров из текущей страницы FunPay
- зависимые поля, radio, select, диапазоны, флаги и поиск по описанию
- начальные значения из query параметров ссылки
- точная работа с ценами через
Decimal - отдельная цена за единицу и наличие для разделов
/chips/ - сортировка совпадений по возрастанию цены
- настраиваемый порог снижения, по умолчанию 1 процент
- целевая минимальная цена для уведомления в рублях
- единая загрузка каталога для нескольких пользователей за один цикл
- просмотр пяти самых дешевых предложений, история, пауза и редактирование
- SQLite в режиме WAL и хранение истории за 90 дней
- защита ссылок от внешних адресов, редиректов и неизвестных путей
- ограничение частоты запросов к FunPay и действий пользователя
flowchart LR
U["пользователь"] --> T["Telegram бот"]
T --> D["редактор фильтров"]
D --> S["SQLite"]
P["минутный планировщик"] --> F["FunPay"]
F --> P
S --> P
P --> M["сравнение минимума"]
M --> T
При первом успешном сканировании текущий минимум сохраняется как базовый снимок без уведомления. Следующий минимум сравнивается с предыдущим успешным состоянием. Рост цены сохраняется молча, снижение ниже порога не отправляется, а появление предложения после пустого результата создает уведомление. Сетевая ошибка не меняет базовую цену
Если указана целевая цена, бот также сообщит при первом переходе текущего минимума с цены выше цели на цену не выше цели. Все цены в интерфейсе и уведомлениях показываются в рублях
Одинаковая цена у другого продавца не считается снижением
Нужен Python 3.12 и токен Telegram бота
python3.12 -m venv .venv
source .venv/bin/activate
pip install -e .
cp .env.example .env
funpay-monitor doctor
funpay-monitor serveВ .env нужно указать как минимум:
TELEGRAM_BOT_TOKEN=123456:token
ADMIN_TELEGRAM_IDS=123456789
DATABASE_PATH=./data/funpay-monitor.dbПолный список параметров находится в .env.example
Примеры:
https://funpay.com/lots/3173/- подписка Claudehttps://funpay.com/chips/209/- игровая валюта с ценой за единицуhttps://funpay.com/lots/3173/?type=Max- начальное значение поля из query параметра
Настройки из localStorage браузера не входят в URL. Поэтому выбор Max и 20x Max, который сделан только на странице браузера, нужно повторить в редакторе Telegram. Бот покажет зависимое поле после выбора Max
Для обычных каталогов сохраняется полная цена предложения. Для валютных каталогов сохраняется показанная цена за единицу и отдельное доступное количество
Уведомление содержит:
- старую и новую цену
- процент снижения
- продавца, рейтинг, отзывы и описание
- выбранные фильтры
- ссылку на предложение
- кнопки проверки, редактирования и паузы
После трех последовательных ошибок каталог временно приостанавливается, а администратор получает сообщение
/start- главное меню/add- добавить каталог/watches- список отслеживаний/help- справка/delete_me- полностью удалить данные пользователя/admin- статистика для администратора
Скрипт создает атомарный релиз в /opt/funpay-monitor/releases, обновляет ссылку /opt/funpay-monitor/current, устанавливает окружение и unit файл
./scripts/deploy.sh claude-vpsНа сервере нужно создать /etc/funpay-monitor.env с правами 600:
TELEGRAM_BOT_TOKEN=123456:token
ADMIN_TELEGRAM_IDS=123456789
DATABASE_PATH=/var/lib/funpay-monitor/funpay-monitor.db
SCAN_INTERVAL_SECONDS=60После настройки:
sudo systemctl enable --now funpay-monitor
sudo systemctl status funpay-monitor
sudo journalctl -u funpay-monitor -n 100 --no-pager
/opt/funpay-monitor/current/.venv/bin/funpay-monitor doctorLong polling не требует nginx, домена или открытого входящего порта
- принимается только точный домен
funpay.comпо HTTPS - разрешены только пути
/lots/<id>/и/chips/<id>/ - внешний редирект отклоняется до второго запроса
- токены и база данных не входят в репозиторий
- сервис не выполняет покупку и не входит в аккаунт FunPay
- работа зависит от HTML разметки FunPay, поэтому изменения сайта могут потребовать обновления парсера
- браузерный обход защиты в версии 1.0.1 не используется
- перед запуском публичного бота нужно ознакомиться с правилами FunPay и Telegram
pip install -e '.[dev]'
ruff format --check .
ruff check .
mypy src
pytest -q
python scripts/check_text_style.pyПравила участия описаны в CONTRIBUTING.md, политика безопасности в SECURITY.md
MIT