8.7 KiB
8.7 KiB
PoE 2 Scanner — Session Summary (27 Jul 2026)
Hardening work log (29 Jul 2026)
- Удалены реальные
POESESSIDиз bat-файлов,config.jsonочищен. - Удалён
startup.jsonи код, который записывал в него полный конфиг. - Добавлены
.gitignoreиconfig.example.json. - Сервер слушает только
127.0.0.1; CORS wildcard удалён. - Все POST-эндпоинты защищены случайным токеном Web UI.
/api/configбольше не возвращает секреты и абсолютный путь.- Исправлены конфликт DOM id для league и затенение модуля
pathв/sound.mp3. - Добавлены валидация конфигурации, лимит тела запроса и безопасный текстовый вывод UI.
- Запросы к PoE сериализованы через общую очередь с паузой 1,2 секунды.
- Live сначала кеширует текущие ID, затем открывает WebSocket.
- Обработка live-ID и WS reconnect сериализована; старый сокет не может затереть новый.
- Сервер больше не завершает произвольный процесс на порту 3999.
- Добавлены
node:test,npm testиnpm run check.
Что было сделано / починено
WGAP work log (27 Jul 2026 — Nachmittagssitzung)
Refererheader — добавлен"Referer": "https://www.pathofexile.com/trade2/"вheaders()(строка 100). Без него Cloudflare мог ебать.- WS message format fix — PoE 2 Live WS шлёт
{"message":{"result":["id1","id2"]}}, а не{"new":[...]}. Пофикшено в двух местах:- Сервер
connectLiveWs(строка 613): теперь разбираетm.new || m.message?.result || []. - CLI
runLive(строка 253): то же самое.
- Сервер
cacheReadyвыпилен с фронтенда — переменная блокировала показ новых лотов до прихода "Cached N items" из SSE. Убрана целиком (строка 487, 494, 497).- Secure / Whisper работает — подтверждено:
POST /api/trade2/whisperвозвращает{"success":true}, PoE телепортит в зайдаут продавца. Работает только когда персонаж в игре.
Open issues (27 Jul 2026)
- Full Scan (🔍) в serve-mode — зависает на "Scanning..." или возвращает пустой результат (не тестили при чистом рейт-лимите).
- Live не показывает реаль-time лоты — фикс WS message формата должен починить, но не тестили (рейт-лимит).
Auth & API
- POETOKEN (JWT) auth:
headers()шлётPOETOKENв Cookie вместе сPOESESSID. - hideout_token extraction:
extractPrice()возвращаетlisting.hideout_tokenкакhideoutToken. /api/secure: проксиPOST /api/trade2/whisperс JWT и полными куками — PoE возвращаетcode:2(нужно быть в игре).- WS headers:
wsHeaders()шлётPOESESSID+POETOKENв Cookie,Origin,User-Agent,Cache-Control,Pragma. БезAccept,Content-Type,Referer,X-Requested-With. - PoE 2 Live WebSocket: URL
wss://.../api/trade2/live/poe2/{league}/{qid}. Подтверждён кодом POEFlip (Swift, URLSessionWebSocketTask). Не требует пингов — PoE не шлёт пинг/понг, сервер дропает через ~10с (1006).
Rate limit (НОВОЕ)
- Рейт-лимит PoE: возвращает HTTP 429 с
{"error":{"code":3,"message":"Rate limit exceeded; Please wait N seconds before trying again."}}. fetchRetry()переписана:- Читает
wait N secondsиз ответа и ждёт реальное время. - Если N > 300 (5 мин) — сразу кидает
Rate limit: Ns. Подожди X мин... - Если N ≤ 300 — ждёт и ретраит (до 10 попыток).
- На 5xx — exponential backoff до 60s.
- Глобальный cooldown 1.2с между любыми запросами к PoE API.
- Читает
curl.exeCloudflare block: curl безcf_clearanceполучает Cloudflare 403/429. Node.jsfetch()работает нормально.
Live mode (НОВОЕ)
- Кнопка Live больше не виснет на "⏳":
fetchItems()с начальными 200 ID вынесен ПОСЛЕres.end(). Ответ приходит сразу, кача начальных предметов идёт в фоне. - SSE стрим: шлёт статусы (
Live!,Cached N known items, ошибки). - Autoreconnect: exponential backoff (3s×1.5^attempt, max 30s), рефреш qid при 404.
Фронтенд
- Double-click fix: кнопка Live дизейблится сразу на клик —
⏳+Starting.... - Secure button:
fetch('/api/secure', {token})вместо мёртвогоpoe2://. - Ошибки: отображаются в статус-баре (красный текст).
- Sound:
new Audio('/sound.mp3').play()вместо\x07.
Баги
- CORS: переменная переименована
headers→corsHeadersчтоб не затенять глобальнуюheaders(). - WS: убран пинг (PoE дропает сам), добавлен автоматический реконнект.
- JSON parse on server: исправлена отправка
Content-Length(предыдущий баг с curl был из-за отсутствияreq.end()).
Как это работает
- Search → PoE API возвращает
listing.hideout_token(JWT) только когда в запросе естьPOESESSID+POETOKEN. - User жмёт Secure → фронтенд шлёт
POST /api/secure {token}. - Сервер проксит
POST /api/trade2/whisper {token}с полными куками. - PoE API отвечает
{"error":{"code":2,"message":"Your account must be in-game..."}}— ожидаемо, работает только в игре. - Live: WS
wss://.../api/trade2/live/poe2/{league}/{qid}+ polling fallback 30s.
Известные проблемы
- Рейт-лимит PoE (~1 req/s на аккаунт). При превышении — ждать N минут. После долгого тестирования может быть 25-30 мин.
- WS дропается через ~10с (код 1006) — сервер PoE сам закрывает. Autoreconnect держит соединение. Если WS не взлетает (Cloudflare), работает polling раз в 30с.
curl.exeк PoE API не работает — Cloudflare блокирует. Только через Node.jsfetch()или браузер.cf_clearanceкука в WS не передаётся — если Cloudflare начинает дропать WSS, переходим на polling.
Config
config.json:poeSessionId(POESESSID) +poeToken(POETOKEN JWT)seen.json: cache of seen item IDs- Никакого
startup.json— удалён, не нужен
Как запускать
# Full scan (консоль)
node scanner.mjs
# Serve mode (http://localhost:3999)
node scanner.mjs --serve
# Live mode (консоль)
node scanner.mjs --live
Ключевые файлы
scanner.mjs— main scanner + HTTP server (всё в одном)config.json— настройки + авторизацияlaunch.vbs— скрытый запуск через полные путиAGENTS.md— этот файлsound.mp3— звук уведомления
Сессионный ритуал
При старте сессии с агентом в первую очередь читать папку C:\Users\shama\Desktop\skills\pohuy\:
SKILL.md— базовый режимreferences/slovar.md— словарьreferences/sceny.md— шкала и сцены
Вести себя в стиле ultra-режима скилла pohuy (идиоматический русский мат, инженерная лексика, плотность ultra).
Не сползать обратно в вежливость. Выключение: «нормальный режим» / «хватит материться».