Назад к проектам

QuizPlease Parser - Мониторинг расписания

Запущен: 2025 Production Обновлено: Сентябрь 2026

Автоматический мониторинг расписания игр на quizplease.ru через REST API с отправкой уведомлений в Telegram. Работает 24/7 как systemd-сервис, деплой через GitHub Actions.

Python 3.12 Requests REST API Telegram Bot API GitHub Actions Systemd Ubuntu Server JSON CI/CD

Возможности системы

Технологический стек и архитектура

Структура проекта

quizplease-parser/ ├── .github/workflows/ # CI/CD пайплайны GitHub Actions │ ├── deploy.yml # Автоматический деплой на сервер │ └── fix-git.yml # Утилита для восстановления Git ├── src/ # Исходный код проекта │ ├── extract_classic_games.py # Основной парсер через REST API │ ├── telegram_notifier.py # Telegram-клиент для уведомлений │ ├── get_chat_id.py # Утилита получения Chat ID │ └── config.example.py # Пример конфигурационного файла ├── data/ # Хранение данных (в .gitignore) ├── logs/ # Логи (в .gitignore) ├── requirements.txt # Зависимости Python └── README.md # Документация проекта

CI/CD Pipeline

  • Trigger: Push в main ветку на GitHub
  • Подключение: SSH к production серверу по ключу
  • Обновление: git fetch && git reset --hard origin/main
  • Зависимости: Установка через pip в venv
  • Проверка: Наличие config.py
  • Перезапуск: systemd-сервиса с новым кодом

Ключевые компоненты

  • extract_classic_games.py — Парсер через api.quizplease.ru + логика сравнения
  • telegram_notifier.py — HTTP-клиент к Bot API (без тяжёлых SDK)
  • get_chat_id.py — Утилита получения Chat ID
  • config.py — Конфигурация (в .gitignore)
  • requirements.txt — requests>=2.31.0

Решенные задачи и технические решения

Задача 1: Отказ от HTML-скрейпинга в пользу API

Проблема: Изначально парсинг шёл через BeautifulSoup и HTML сайта. Вёрстка менялась, ломались CSS-селекторы, парсер падал.

Решение: переход на REST API

  • API вместо HTML: Работа с api.quizplease.ru/api/games/schedule/32 — стабильнее и быстрее
  • Меньше зависимостей: Убрали BeautifulSoup, lxml. Telegram Bot API используем напрямую через requests вместо python-telegram-bot
  • Структурированные данные: JSON-ответ вместо парсинга HTML
  • Устойчивость: API не ломается при редизайне сайта

Задача 2: Обеспечение бесперебойной работы 24/7

Проблема: Система должна работать надёжно и автоматически восстанавливаться после сбоев сети, сервера или API.

Решение:

  • Systemd-сервис: Production-конфигурация с автоперезапуском
  • Комплексное логирование: Логи в файлы и systemd journal
  • Обработка ошибок: Грейсфул деградация при недоступности API
  • Таймауты и retry: Настройка таймаутов и повторов HTTP-запросов

Задача 3: Автоматизация деплоя и обновлений

Проблема: Ручное обновление кода на сервере было трудоёмким и подверженным ошибкам.

Решение: CI/CD пайплайн на GitHub Actions

  • Автоматический триггер: Деплой при пуше в main ветку
  • Безопасное подключение: Отдельный SSH-ключ для деплоя + GitHub Secrets
  • Полный цикл: Обновление кода → зависимости → перезапуск сервиса
  • Идемпотентность: git reset --hard гарантирует чистое состояние

Задача 4: Интеллектуальные уведомления без спама

Проблема: Избегать спама, но своевременно информировать о важных изменениях.

Решение:

  • Только изменения: Уведомления — только при новых играх или смене статуса
  • Полная информация: Сообщения с эмодзи и Markdown
  • Несколько получателей: Поддержка массива chat_ids
  • Идемпотентность: Повторный запуск без изменений ничего не отправляет

Задача 5: Дедупликация игр по хешу

Проблема: QuizPlease иногда меняет UUID игры без изменения содержимого — парсер считал такую игру новой и слал уведомление повторно.

Решение:

  • Хеш от содержимого: Считаем MD5 от дата + время + название
  • Двойная проверка: Сравниваем и по ID, и по хешу
  • Если ID новый, но хеш совпадает — считаем дубликатом, не уведомляем
  • Результат: Нет ложных срабатываний при смене UUID

Задача 6: Безопасность и конфигурация

Проблема: Безопасное хранение чувствительных данных (токены, chat_ids) и простая настройка.

Решение:

  • Шаблон конфигурации: config.example.py для безопасного клонирования
  • Отдельный файл: config.py не отслеживается в Git
  • Встроенная утилита: get_chat_id.py для получения Chat ID
  • Отдельный SSH-ключ: Для CI/CD используется выделенный ключ, не основной

Пример работы в Telegram

Система отправляет подробные уведомления при обнаружении новых игр или изменении статуса существующих:

Telegram уведомление о новой игре

Уведомление о новой игре с полной информацией

Сводка по всем играм

Сводка по всем доступным играм

Уведомление о свободных местах

Уведомление о записи в резерв

Быстрый старт и использование

Установка

# Клонируйте репозиторий git clone https://github.com/mikhailbbk/quizplease-parser.git cd quizplease-parser # Установите зависимости python -m venv venv source venv/bin/activate # Linux/macOS # venv\Scripts\activate # Windows pip install -r requirements.txt # Настройте конфигурацию cp src/config.example.py src/config.py # Отредактируйте src/config.py, добавив токен бота и chat_ids

Запуск

# Локальный запуск python src/extract_classic_games.py # Как systemd-сервис sudo cp deploy/quizplease.service /etc/systemd/system/ sudo systemctl daemon-reload sudo systemctl enable quizplease sudo systemctl start quizplease # Проверить статус systemctl status quizplease

Управление сервисом

# Статус сервиса systemctl status quizplease # Логи в реальном времени journalctl -u quizplease -f # Перезапуск systemctl restart quizplease # Остановка systemctl stop quizplease # Файловые логи tail -f logs/extract_games.log

Ссылки на проект

Технические детали проекта

Язык программирования: Python 3.12

Основная библиотека: requests (единственная внешняя зависимость)

Источник данных: REST API api.quizplease.ru

Хранение данных: JSON (classic_games.json, games_history.json)

Инфраструктура: Ubuntu Server, Systemd, GitHub Actions CI/CD

Статус: Production, работает с 2025 года

Частота проверки: Каждые 30 минут

Уведомления: Telegram Bot API через HTTP (без python-telegram-bot)