Skip to content

Repository files navigation

FunPay Price Monitor

ci Python 3.12 MIT

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
Loading

При первом успешном сканировании текущий минимум сохраняется как базовый снимок без уведомления. Следующий минимум сравнивается с предыдущим успешным состоянием. Рост цены сохраняется молча, снижение ниже порога не отправляется, а появление предложения после пустого результата создает уведомление. Сетевая ошибка не меняет базовую цену

Если указана целевая цена, бот также сообщит при первом переходе текущего минимума с цены выше цели на цену не выше цели. Все цены в интерфейсе и уведомлениях показываются в рублях

Одинаковая цена у другого продавца не считается снижением

Быстрый запуск

Нужен 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/ - подписка Claude
  • https://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 - статистика для администратора

Деплой через systemd

Скрипт создает атомарный релиз в /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 doctor

Long 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

About

Telegram бот для мониторинга минимальных цен на FunPay

Topics

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages