Alpinbet parser
Готовый каркас проекта для парсинга HTML-страниц Alpinbet через Playwright.
Что уже есть:
- ручная авторизация с сохранением browser session;
- повторное использование cookies/localStorage через
storageState; - polling раз в 20 секунд;
- вытаскивание данных из DOM по CSS-селекторам;
- сравнение текущего состояния с прошлым;
- отправка webhook при изменениях;
- сохранение HTML-снимка;
- скриншот при ошибке;
- простой логгер.
1. Установка
npm install
npx playwright install chromium
2. Настройка
Скопируй пример env:
cp .env.example .env
Минимум проверь:
ALPINBET_TARGET_URLSESSION_FILEITEM_SELECTOR- селекторы полей строки
WEBHOOK_URLпри необходимостиHTTP_USER_AGENTпри необходимостиFORECAST_ACTIVE_TABS(обычно1,2, где1— активные,2— неактивные)FORECAST_PER_PAGEиFORECAST_MAX_PAGES
3. Первичная авторизация
npm run auth
Что будет:
- откроется Chromium;
- ты вручную логинишься в Alpinbet;
- после входа возвращаешься в консоль и жмёшь Enter;
- сессия сохранится в
data/alpinbet-session.json.
4. Проверка сессии
npm run check-session
Скрипт попытается открыть целевую страницу и выведет:
- текущий URL;
- заголовок страницы;
- часть HTML.
Если тебя редиректит на логин, значит сессия протухла.
5. Запуск парсера
npm start
Как работает парсер
Каждый цикл:
- получает HTML через HTTP-запрос с cookies из Playwright-сессии;
- если сессия истекла, переавторизуется через Playwright и повторяет HTTP-запрос;
- парсит HTML через Cheerio;
- собирает массив объектов;
- нормализует и сортирует его;
- сравнивает с прошлым состоянием;
- если есть изменения — сохраняет 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:
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.
Самый быстрый путь:
- зайди на страницу;
- открой DevTools;
- найди контейнер одной строки/сигнала;
- подставь реальные селекторы в
.env.
Формат webhook
По умолчанию отправляется JSON:
{
"event": "alpinbet_changes_detected",
"timestamp": "2026-03-18T00:00:00.000Z",
"count": 2,
"changes": [
{
"type": "added",
"item": {}
}
]
}
Если нужен Telegram/email/max, обычно проще принимать этот webhook на своём backend и уже там делать доставку.
Структура
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.