Files
antigol-service/parser/README.md
talorr cda36918e8 init
2026-03-27 03:36:08 +03:00

162 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.