# Alpinbet parser Готовый каркас проекта для парсинга HTML-страниц Alpinbet через Playwright. Что уже есть: - ручная авторизация с сохранением browser session; - повторное использование cookies/localStorage через `storageState`; - polling раз в 20 секунд; - вытаскивание данных из DOM по CSS-селекторам; - сравнение текущего состояния с прошлым; - отправка webhook при изменениях; - сохранение HTML-снимка; - скриншот при ошибке; - простой логгер. ## 1. Установка ```bash npm install npx playwright install chromium ``` ## 2. Настройка Скопируй пример env: ```bash cp .env.example .env ``` Минимум проверь: - `ALPINBET_TARGET_URL` - `SESSION_FILE` - `ITEM_SELECTOR` - селекторы полей строки - `WEBHOOK_URL` при необходимости - `HTTP_USER_AGENT` при необходимости - `FORECAST_ACTIVE_TABS` (обычно `1,2`, где `1` — активные, `2` — неактивные) - `FORECAST_PER_PAGE` и `FORECAST_MAX_PAGES` ## 3. Первичная авторизация ```bash npm run auth ``` Что будет: 1. откроется Chromium; 2. ты вручную логинишься в Alpinbet; 3. после входа возвращаешься в консоль и жмёшь Enter; 4. сессия сохранится в `data/alpinbet-session.json`. ## 4. Проверка сессии ```bash npm run check-session ``` Скрипт попытается открыть целевую страницу и выведет: - текущий URL; - заголовок страницы; - часть HTML. Если тебя редиректит на логин, значит сессия протухла. ## 5. Запуск парсера ```bash npm start ``` ## Как работает парсер Каждый цикл: 1. получает HTML через HTTP-запрос с cookies из Playwright-сессии; 2. если сессия истекла, переавторизуется через Playwright и повторяет HTTP-запрос; 3. парсит HTML через Cheerio; 4. собирает массив объектов; 5. нормализует и сортирует его; 6. сравнивает с прошлым состоянием; 7. если есть изменения — сохраняет state и шлёт webhook. ### Получение HTML - Парсер работает через HTTP-запросы с cookies из Playwright-сессии Дополнительно: - `FORECAST_ACTIVE_TABS=1,2` — какие вкладки забирать - `FORECAST_PER_PAGE=40` — размер страницы запроса - `FORECAST_START_PAGE=1` — стартовая страница - `FORECAST_MAX_PAGES=10` — максимум страниц на вкладку за цикл Парсер автоматически подставляет в URL параметры: - `ForecastSearch[activeTab]` - `ForecastSearch[perPage]` - `page` Пример `ALPINBET_TARGET_URL`: ```text https://alpinbet.com/dispatch/diamondwither/dfadfdfaadfadf?ForecastSearch%5BisFavorite%5D=0&ForecastSearch%5Bsort%5D=date&ForecastSearch%5Buser_id%5D=7891&ForecastSearch%5Bg_id%5D=&ForecastSearch%5Bdispatch_id%5D=63652&_pjax=%23pjax-forecast-list ``` ## Важный момент Селекторы в `.env.example` — это заглушки. Их почти наверняка надо поменять под реальный DOM Alpinbet. Самый быстрый путь: 1. зайди на страницу; 2. открой DevTools; 3. найди контейнер одной строки/сигнала; 4. подставь реальные селекторы в `.env`. ## Формат webhook По умолчанию отправляется JSON: ```json { "event": "alpinbet_changes_detected", "timestamp": "2026-03-18T00:00:00.000Z", "count": 2, "changes": [ { "type": "added", "item": {} } ] } ``` Если нужен Telegram/email/max, обычно проще принимать этот webhook на своём backend и уже там делать доставку. ## Структура ```text alpinbet-parser/ data/ logs/ scripts/ save-session.js check-session.js src/ config.js index.js logger.js notifier.js parser.js session.js state.js utils.js ``` ## Что доработать под прод - health endpoint; - Dockerfile; - очередь уведомлений; - админку для переавторизации; - хранение state в Redis/PostgreSQL; - multiple bot profiles / multiple pages.