This commit is contained in:
talorr
2026-03-27 03:36:08 +03:00
parent 8a97ce6d54
commit cda36918e8
225 changed files with 35641 additions and 0 deletions

161
parser/README.md Normal file
View File

@@ -0,0 +1,161 @@
# 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.