dd3edd70884b1a3f865af67596d2b5d255222818
DLD Monitor
Внутренний инструмент для агентства недвижимости в Дубае: мониторит цены объявлений конкурентов на PropertyFinder.ae и Bayut.com по DLD Permit Number, шлёт уведомления в Telegram при:
- 📈📉 изменении цены конкурента,
- ❌ удалении объявления (404 / withdrawn),
- 🆕 появлении нового объявления с тем же permit (новый брокер выставил ту же квартиру).
Архитектура
┌──────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ Web UI │ │ Scheduler │ │ Telegram Bot │
│ (FastAPI) │ │ (APScheduler) │ │ (polling) │
│ add project │ │ every N hours │ │ /start /check │
└──────┬───────┘ └────────┬─────────┘ └────────┬────────┘
│ │ │
└──────────────┬──────┴───────────────────────┘
▼
┌────────────────┐
│ monitor │
│ service │ ← скрапит PF и Bayut, пишет в SQLite
└────────────────┘
│
▼ уведомления в TG конкретному employee
Локальный запуск (Windows)
1. Создать виртуальное окружение и поставить зависимости
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txt
2. Получить токен Telegram-бота
Уже есть? Отлично. Если нет:
- Откройте Telegram, найдите @BotFather.
- Отправьте
/newbot, придумайте имя. - Скопируйте токен вида
123456:ABC-DEF….
3. Создать .env
Copy-Item .env.example .env
notepad .env
В .env вставьте:
TG_BOT_TOKEN=ваш_токен_от_botfather
SCRAPE_INTERVAL_HOURS=4
ADMIN_CHAT_ID= # опционально — куда слать системные ошибки
4. Запустить три процесса (в трёх разных окнах PowerShell)
Окно 1 — веб-интерфейс:
.\.venv\Scripts\Activate.ps1
python run_web.py
Откройте http://127.0.0.1:8000
Окно 2 — Telegram-бот:
.\.venv\Scripts\Activate.ps1
python -m app.bot
Окно 3 — фоновый сканер:
.\.venv\Scripts\Activate.ps1
python -m app.scheduler
Первое использование
- Откройте бота в Telegram и отправьте
/start— он зарегистрирует вашchat_id. - В веб-UI перейдите в Сотрудники — убедитесь, что вы там есть с ✓ TG.
- Нажмите + Новый проект, заполните:
- Название (например: «Marina Pinnacle 1502, 2BR»)
- DLD Permit Number (Trakheesi)
- Тип сделки (продажа/аренда)
- Владелец = вы
- На странице проекта нажмите Проверить сейчас — система найдёт все объявления конкурентов с этим permit на PF и Bayut.
- Дальше фоновый сканер сам будет проверять каждые
SCRAPE_INTERVAL_HOURSчасов и слать уведомления в Telegram.
Команды бота
/start— подключить себя как сотрудника (запоминает chat_id)/list— список ваших проектов/check— запустить проверку всех ваших проектов сейчас/whoami— показать свой chat_id
Структура
app/
├── config.py настройки из .env
├── db.py SQLAlchemy engine + session
├── models.py Employee, Project, CompetitorListing, PriceHistory
├── web.py FastAPI роуты и UI
├── bot.py Telegram-бот
├── scheduler.py APScheduler фоновый сканер
├── scrapers/
│ ├── base.py httpx + парсинг __NEXT_DATA__
│ ├── propertyfinder.py
│ └── bayut.py
├── services/
│ ├── monitor.py детект изменений, основная бизнес-логика
│ └── notifier.py отправка в TG
└── templates/ Jinja2 (Bootstrap 5)
data/
└── monitor.db SQLite (создаётся автоматически)
Перенос на сервер
Когда придёт время — нужно:
- Поставить Python 3.11+ на сервер (Linux).
- Скопировать репозиторий,
pip install -r requirements.txt. - Создать
.env. - Поставить три процесса под
systemd:dld-monitor-web.service→python run_web.pydld-monitor-bot.service→python -m app.botdld-monitor-scheduler.service→python -m app.scheduler
- Поставить nginx + TLS перед веб-портом (8000).
Возможные проблемы скрапинга
PF/Bayut могут начать блокировать запросы при частых обращениях. Признаки:
- В логах сканера видны
Blocked by site (403/429). - Поиск возвращает 0 объявлений, хотя они должны быть.
Что делать:
- Уменьшите
SCRAPE_INTERVAL_HOURS(реже = меньше риска). - Если не помогает — добавьте Playwright (headless-браузер). Заготовка:
pip install playwright && playwright install chromium, затем заменитьfetch_htmlна запуск через Playwright. - Опционально — прокси.
Description
Languages
Go
51.5%
Python
47.2%
Dockerfile
0.7%
Shell
0.6%