This commit is contained in:
kislovdm
2026-08-06 20:48:39 +03:00
parent 8b57294998
commit eb3fc77618
+24 -16
View File
@@ -1,9 +1,9 @@
# TourMonitor — мониторинг туров Level.Travel # TourMonitor — мониторинг туров Level.Travel
Ежедневно проверяет цены на туры (9 ночей, 2 взрослых + ребёнок 5 лет) из Москвы в отели Ежедневно проверяет цены на туры из Москвы (2 взрослых + ребёнок 5 лет; количество ночей —
**Sunrise Tucana Resort** и **Posh Club By Sunrise Tucana Resort** (Макади Бей, Египет) своё для каждого отеля) в отели **Sunrise Tucana Resort** и **Posh Club By Sunrise Tucana Resort**
на окно с +60 дней от сегодня на 90 дней вперёд и отправляет в Telegram отчёт с топом (Макади Бей, Египет) и **Riu Sri Lanka** (Шри-Ланка) на окно с +30 дней от сегодня на
дешёвых дат и дельтой цен. 150 дней вперёд и отправляет в Telegram отчёт с топом дешёвых дат и дельтой цен.
Работает напрямую с публичным веб-API level.travel (подпись запросов и расшифровка Работает напрямую с публичным веб-API level.travel (подпись запросов и расшифровка
ответов воспроизведены с JS-бандла сайта), без партнёрского токена. ответов воспроизведены с JS-бандла сайта), без партнёрского токена.
@@ -16,20 +16,24 @@
## Отчёт в Telegram ## Отчёт в Telegram
``` ```
📊 Мониторинг туров · 9 ночей, 2+1 чел, ребёнок 5 лет 📊 <b>Мониторинг туров</b> · 9 ночей, 2+1 чел, ребёнок 5 лет
Заезды: 06.08–03.11 Заезды: 05.09–01.02
🏝 Sunrise Tucana Resort 🏝 <b>Sunrise Tucana Resort</b>
📅 20.08 — 418 000 ₽ 🔻 −12% (было 475 447 ₽) 🗓 <a href="http://192.168.1.6:8084/prices/9099454">календарь цен</a>
🍽 AI · Полулюкс · Level.Travel 📅 <b>Октябрь</b>
🔗 забронировать 📅 05.10 — <b>475 447 ₽</b> 🔻 −12% (было 540 000 ₽)
📅 02.09 — 501 000 ₽ ✨ новая минималка 🍽 AI · <a href="https://level.travel/package_details/…">Полулюкс</a> · Level.Travel
📅 06.10 — <b>501 000 ₽</b> ✨ новая минималка
📅 <b>Ноябрь</b>
📅 02.11 — <b>520 000 ₽</b> 🔺 +3% (было 505 000 ₽)
... ...
``` ```
Секция показывается только если по отелю есть предложения. Каждый отель приходит Секция показывается только если по отелю есть предложения. Каждый отель приходит
**отдельным сообщением**; если сообщение длиннее лимита Telegram (4096 символов), оно **отдельным сообщением**; если сообщение длиннее лимита Telegram (4096 символов), оно
автоматически разбивается на несколько. автоматически разбивается на несколько. В отчёте — до `PricesPerMonth` дешёвых дат
на каждый месяц, тип номера — ссылка на бронирование, рядом дельта к прошлому скану.
## Как запустить ## Как запустить
@@ -41,8 +45,9 @@ dotnet run --project src/TourMonitor -- Monitor__RunOnStart=true \
--Telegram__BotToken=<токен> --Telegram__ChatId=<id> --Telegram__BotToken=<токен> --Telegram__ChatId=<id>
``` ```
- Дашборд Hangfire (журнал задач, кнопка «Run now»): http://localhost:5000/hangfire - Дашборд Hangfire (журнал задач, кнопка «Run now»): http://localhost:5199/hangfire
- Календарь цен: http://localhost:5000/prices (список отелей → сетка дат с минимальной ценой) - Календарь цен: http://localhost:5199/prices (список отелей → сетка дат с ценой из
последнего скана, диапазоном минимальной цены по датам сканирования и дельтой)
- Ежедневный скан по умолчанию в 09:15 по Москве (`Schedule:Cron`, `Schedule:TimeZoneId`) - Ежедневный скан по умолчанию в 09:15 по Москве (`Schedule:Cron`, `Schedule:TimeZoneId`)
- База SQLite: `Data/tour_monitor.db` (история цен + ежедневные минимумы) - База SQLite: `Data/tour_monitor.db` (история цен + ежедневные минимумы)
@@ -59,7 +64,7 @@ dotnet run --project src/TourMonitor -- Monitor__RunOnStart=true \
| `Monitor:DateRangeDays` | 150 | | `Monitor:DateRangeDays` | 150 |
| `Monitor:StartOffsetDays` | 30 (окно начинается с +30 дней от сегодня) | | `Monitor:StartOffsetDays` | 30 (окно начинается с +30 дней от сегодня) |
| `Monitor:PricesPerMonth` | 3 (сколько дешёвых дат показывать в отчёте для каждого месяца) | | `Monitor:PricesPerMonth` | 3 (сколько дешёвых дат показывать в отчёте для каждого месяца) |
| `Monitor:CalendarUrlBase` | пусто (ссылка на календарь цен в отчёте; `http://192.168.1.6:8084` на хосте) | | `Monitor:CalendarUrlBase` | `http://192.168.1.6:8084` (ссылка на календарь цен в отчёте) |
| `Monitor:RunOnStart` | false | | `Monitor:RunOnStart` | false |
| `Monitor:MaxParallelDates` | 5 (даты сканируются параллельно) | | `Monitor:MaxParallelDates` | 5 (даты сканируются параллельно) |
| `Camoufox:Version` | `v152.0.4-beta.28` | | `Camoufox:Version` | `v152.0.4-beta.28` |
@@ -71,6 +76,9 @@ dotnet run --project src/TourMonitor -- Monitor__RunOnStart=true \
Ключи API и расшифровки (`LevelTravel:ApiKey`, `LevelTravel:SecretBoxKeys`) — из открытого Ключи API и расшифровки (`LevelTravel:ApiKey`, `LevelTravel:SecretBoxKeys`) — из открытого
JS-бандла сайта; менять не нужно. JS-бандла сайта; менять не нужно.
У каждого отеля (`Monitor:Hotels`) свои направление и ночи: `ToCity`, `ToCountry`, `Nights`
(например, Riu Sri Lanka — `"ToCity": "Sri Lanka", "ToCountry": "LK", "Nights": 9`).
## Docker ## Docker
```bash ```bash
@@ -101,6 +109,6 @@ LT_LIVE_TESTS=1 dotnet test # + живые проверки против a
- `src/TourMonitor/Camoufox/` — установка Camoufox (скачивание из релизов), сессия - `src/TourMonitor/Camoufox/` — установка Camoufox (скачивание из релизов), сессия
браузера и fetch-транспорт через Playwright браузера и fetch-транспорт через Playwright
- `src/TourMonitor/Storage/PriceStore.cs` — SQLite: история цен, ежедневные минимумы - `src/TourMonitor/Storage/PriceStore.cs` — SQLite: история цен, ежедневные минимумы
- `src/TourMonitor/Jobs/DailyScanJob.cs` — сам скан: 90 дат × отели из конфига, параллельно - `src/TourMonitor/Jobs/DailyScanJob.cs` — сам скан: 150 дат × отели из конфига, параллельно
- `src/TourMonitor/Notifications/` — Telegram и сборка отчёта - `src/TourMonitor/Notifications/` — Telegram и сборка отчёта
- `tests/TourMonitor.Tests/` — юнит- и интеграционные тесты - `tests/TourMonitor.Tests/` — юнит- и интеграционные тесты