Мониторинг свободных квартир на сайте москварталы.рф с уведомлениями в Telegram.
- 🔍 Автоматический парсинг квартир с заданными фильтрами
- 📱 Уведомления в Telegram при появлении свободных квартир
- 🔄 Проверка каждые 1-3 минуты (настраивается)
- 💚 Heartbeat-уведомления каждые 6 часов (00:00, 06:00, 12:00, 18:00)
- 🛡️ Защита от блокировки (рандомные задержки, ротация User-Agent)
- 📊 Хранение истории в SQLite
- 🐳 Готов к деплою в Docker/Coolify
- Бот открывает страницу с вашими фильтрами на сайте москварталы.рф
- Нажимает "Показать N квартир" чтобы загрузить список
- Считает кнопки на карточках квартир:
"забронировано"— квартира занята (нельзя кликнуть)"забронировать"— квартира ДОСТУПНА (можно кликнуть и забронировать)
- Если появилась хоть одна кнопка "забронировать" → отправляет вам уведомление в Telegram 🎉
| Событие | Когда отправляется |
|---|---|
| 🚀 Запуск | При старте бота |
| 🎉 Свободная квартира | Когда появляется кнопка "забронировать" |
| 💚 Heartbeat | Каждые 6 часов (00:00, 06:00, 12:00, 18:00) |
| При сбое парсинга |
- Напишите @BotFather в Telegram
- Отправьте
/newbotи следуйте инструкциям - Сохраните полученный токен
- Напишите вашему боту любое сообщение
- Откройте:
https://api.telegram.org/bot<YOUR_TOKEN>/getUpdates - Найдите
"chat":{"id":— это ваш Chat ID
# Клонируйте репозиторий
cd moskvartaly-monitor
# Скопируйте конфигурацию
cp .env.example .env
# Отредактируйте .env
# TELEGRAM_BOT_TOKEN=your_token
# TELEGRAM_CHAT_ID=your_chat_id# Установка зависимостей
npm install
# Установка браузера Playwright
npx playwright install chromium
# Тест скрейпера (без Telegram)
npm run test:scraper
# Запуск в режиме разработки
npm run dev
# Сборка и запуск
npm run build
npm start# Сборка
npm run build
docker-compose build
# Запуск
docker-compose up -d
# Логи
docker-compose logs -f| Переменная | Описание | По умолчанию |
|---|---|---|
TELEGRAM_BOT_TOKEN |
Токен Telegram бота | — |
TELEGRAM_CHAT_ID |
ID чата для уведомлений | — |
CHECK_INTERVAL_MINUTES |
Интервал проверки (минуты) | 2 |
RANDOM_DELAY_MIN_SECONDS |
Мин. случайная задержка | 0 |
RANDOM_DELAY_MAX_SECONDS |
Макс. случайная задержка | 60 |
USE_PROXY |
Использовать прокси | false |
PROXY_URL |
URL прокси сервера | — |
HEADLESS |
Режим без GUI | true |
LOG_LEVEL |
Уровень логирования | info |
Редактируйте файл src/config/search-profiles.ts:
export const searchProfiles: SearchProfile[] = [
{
id: 'my-search',
name: 'Мой поиск',
url: 'https://москварталы.рф/kvartiry/?...',
enabled: true,
notifyOnNew: true,
notifyOnAvailable: true,
notifyOnPriceChange: false,
},
];- Создайте новый сервис "Docker Compose"
- Укажите репозиторий
- Добавьте переменные окружения:
TELEGRAM_BOT_TOKENTELEGRAM_CHAT_ID
- Деплой!
src/
├── index.ts # Точка входа
├── logger.ts # Логирование
├── config/ # Конфигурация
├── scraper/ # Парсинг сайта
├── database/ # SQLite хранилище
├── notifier/ # Telegram уведомления
├── scheduler/ # Планировщик задач
└── types/ # TypeScript типы
# Запустите бот и смотрите логи в реальном времени
npm run devВы увидите:
INFO: Navigating to https://... # Открывает страницу
INFO: Found "Показать квартир" button # Нашёл кнопку
INFO: Показать 39 квартир # Текст кнопки (39 квартир!)
INFO: Found booking buttons via getByText # Ищет кнопки бронирования
INFO: availableCount: 0, bookedCount: 39 # Результат: 0 свободных, 39 занятых
INFO: All apartments still booked # Все ещё забронированы
# Запустите тест на странице где ЕСТЬ доступные квартиры
npx ts-node src/test-scraper.ts --test-availableДолжно показать:
availableCount: 1012 # Много доступных!
bookedCount: 0
🎉 FOUND AVAILABLE APARTMENTS!
Бот сохраняет скриншоты в папку data/:
debug-1-loaded.png— страница после загрузкиdebug-2-after-show.png— после клика "Показать квартир"debug-3-final.png— финальный вид списка квартир
Откройте их и убедитесь что видите таблицу с квартирами.
# Проверить что Telegram работает
npx ts-node src/test-telegram.tsВы получите сообщение "🚀 Мониторинг квартир запущен" в Telegram.
После запуска бота вы будете получать сообщения "💚 Бот работает нормально" в:
- 00:00
- 06:00
- 12:00
- 18:00
Если сообщение не пришло — значит бот упал.
- Количество квартир динамическое — сейчас 39, завтра может быть 40 или 35
- Бот ищет именно кнопку "забронировать" — если кто-то отменит бронь, кнопка изменится с "забронировано" на "забронировать"
- Проверка каждые 1-3 минуты — с рандомной задержкой чтобы не блокировали
- Логи показывают всё — если что-то не так, смотрите логи
MIT