Skip to content

Trade Bridge RU

Lafko edited this page Jun 21, 2026 · 9 revisions

← Home


Trade Bridge (браузерное расширение)

Trade Bridge позволяет браузерному расширению выполнять всю работу с трейд-сайтом (live-поиск, fetch, whisper), а POEFixer занимается только покупкой в игре. Вся работа с трейд-сайтом идёт внутри вашей реальной браузерной сессии — без копирования cookies и возни с cf_clearance — и это фундамент для будущего режима «POEFixer на другом ПК».

Можно использовать бесплатное официальное расширение или написать своё по документированному протоколу ниже.

Trade Bridge требует, чтобы у вашей лицензии POEFixer была функция Trade. Если на сервере Trade сделана платной — нужен валидный ключ; если бесплатной — может пользоваться любой. Без прав мост отвечает entitlement_required и отклоняет покупки.


1. Как это работает

Браузерное расширение                     POEFixer
  live-search WebSocket  ─┐
  fetch деталей предмета   │  ws://127.0.0.1:PORT   покупка в игре:
  whisper (телепорт)       ├─────────────────────►  ждёт телепорт → клик → проверка
  (Force teleport,         │   buy_request           → авто-стэш → /hideout
   In-demand retry,        │ ◄─────────────────────  → отправляет результат
   Rate limiting)         ─┘   buy_result
  • Расширение владеет всем, что касается трейд-сайта.
  • POEFixer владеет всем в игровом клиенте и поднимает локальный WebSocket-сервер (Trade Bridge), к которому подключается расширение.
  • В этом режиме встроенный tls-client POEFixer не используется, а трейд-сайтовые элементы (Connections, Trade Cookies, Force teleport, In-demand, Rate limiting) переезжают в расширение и скрываются/отключаются в POEFixer.

2. Установка расширения

Расширение поставляется внутри POEFixer. В папке POEFixer откройте Resources\extension\:

<папка POEFixer>\Resources\extension\
  ├─ poefixer-extension-chrome.zip     ← Chrome / Edge
  ├─ poefixer-extension-firefox.zip    ← Firefox
  └─ chrome\                            ← распакованная копия для кнопки «Помощь с установкой»

Полностью «тихая» установка одной кнопкой невозможна — браузеры намеренно блокируют программную установку расширений. Вы распаковываете архив для своего браузера и загружаете его один раз. Кнопка Помощь с установкой… (Конфигурация → Trade) делает часть для Chrome/Edge: копирует путь к распакованной папке chrome\ в буфер и открывает эту инструкцию — тогда распаковку можно пропустить.

Chrome / Edge

  1. Распакуйте Resources\extension\poefixer-extension-chrome.zip в любую папку (чтобы manifest.json был в её корне). Или нажмите Помощь с установкой… в POEFixer и используйте скопированный путь — затем перейдите к шагу 4.
  2. Откройте chrome://extensions (Edge: edge://extensions).
  3. Включите Режим разработчика (справа вверху).
  4. Нажмите Загрузить распакованное расширение и выберите эту папку (или вставьте путь от «Помощь с установкой»).
  5. Иконка появится на панели; сохраняется между перезапусками.

После обновления POEFixer встроенное расширение обновляется — откройте chrome://extensions и нажмите Обновить на карточке расширения (или заново распакуйте и загрузите).

Firefox

Релизный Firefox ставит только подписанные Mozilla расширения, поэтому используйте временную загрузку:

  1. Распакуйте Resources\extension\poefixer-extension-firefox.zip в любую папку.
  2. Откройте about:debugging#/runtime/this-firefox.
  3. Нажмите Загрузить временное дополнение… и выберите manifest.json из распакованной папки.
  4. Останется загруженным до перезапуска Firefox (повторите после перезапуска).
  • Постоянно: установите подписанный Mozilla/AMO .xpi, открыв его в Firefox и подтвердив запрос прав.

Затем подключитесь

  1. В POEFixer: Конфигурация → Trade → Источник данных трейда → Браузерное расширение, запомните Порт (по умолчанию 47362) и нажмите Запустить мост.
  2. В попапе расширения укажите тот же Порт — должно показать Host: connected, а статус в POEFixer станет зелёным («Расширение подключено»).
  3. Войдите на трейд-сайт в этом браузере, добавьте Trade Links и нажмите Play (см. §3).

3. Использование

Всё управление — в POEFixer; в попапе расширения указывается только Port.

  1. В POEFixer: Configuration → Trade → Источник данных = Браузерное расширение, укажите Port, нажмите Запустить мост.
  2. В попапе расширения проверьте Host: connected и тот же Port.
  3. Залогиньтесь на трейд-сайте в том же браузере.
  4. В Trade Links (вкладка Connections) POEFixer добавьте URL-ы поиска trade2 и нажмите Play — поиск передаётся в расширение и запускается там; Stop убирает его.
  5. Поведение задаётся в POEFixer (Configuration → Trade): Force teleport, Item is in demand → teleport anyway, Rate limiting — POEFixer пушит их в расширение, оно лишь подчиняется.
  6. При совпадении расширение шлёт whisper, а POEFixer покупает в игре. Вся активность расширения попадает в Логи POEFixer (категория Trade).

Надёжный live-фид (автоматически): для каждого активного поиска расширение открывает закреплённую фоновую вкладку страницы трейда и поднимает live-WebSocket внутри этой страницы (правильный Origin + куки сессии — как делает сам сайт). Просто оставайтесь залогинены на трейд-сайте; Live Search вручную включать не нужно. Trade Link показывает Connecting…, пока WS не поднялся, затем Live. Закрытие этой закреплённой вкладки останавливает поиск.


4. Своё расширение — Trade Bridge API (PTBP)

Протокол — обычный JSON по WebSocket. Реализовать может любой. Сервер поднимает POEFixer; ваш клиент подключается к ws://127.0.0.1:<port> (по умолчанию 47362, настраивается в Settings).

Хост выполняет покупки только если у лицензии есть entitlement Trade. Иначе вы получите {"type":"error","code":"entitlement_required"}. (Детали аутентификации намеренно не документируются.)

4.1 Рукопожатие

Сначала шлёте hello; хост отвечает welcome.

// клиент → хост
{ "type":"hello", "proto":1, "client":"MyExtension/1.0", "token":"<необязательно>" }
// хост → клиент
{ "type":"welcome", "proto":1, "host":"POEFixer", "allowed":true, "paid":false, "ready":false }
  • allowed:false → нет прав (трактуйте как «нужен ключ»); хост отклонит покупки с entitlement_required.
  • token нужен только если пользователь включил токен-пэйринг в POEFixer (по умолчанию выключен).

После welcome (и при любом изменении в POEFixer) хост шлёт config. Программа — единая точка управления, поэтому расширение мониторит ровно эти поиски и подчиняется этому behavior:

// хост → клиент
{ "type":"config",
  "behavior":{ "forceTeleport":false, "inDemandRetry":true, "rateLimit":true },
  "searches":[ { "realm":"poe2", "league":"Standard", "searchId":"", "note":"" } ] }

4.2 Готовность — whisper только когда ready

Хост периодически шлёт status:

{ "type":"status", "ready":true, "inGame":true, "attached":true, "busy":false }

Вы ОБЯЗАНЫ отправлять whisper/телепорт только когда последний status.ready === true. ready = есть_права && прикреплён && в_игре && !занят. Whisper при не-ready телепортирует персонажа без покупателя, ведущего сделку.

4.3 Поток покупки

После успешного whisper (персонаж телепортируется) шлёте buy_request:

// клиент → хост
{ "type":"buy_request", "id":"r-42", "seq":7,
  "group":{
    "searchId":"", "groupId":"g-9", "isLastGroup":true,
    "items":[ {
      "itemId":"...", "stashX":3, "stashY":1, "w":1, "h":1,
      "currency":"chaos", "amount":50,
      "seller":"AccountName", "stashName":"~price 50 chaos",
      "name":"...", "typeLine":"...", "baseType":"...", "rarity":"Rare",
      "iconUrl":"https://...", "ilvl":82, "corrupted":false, "identified":true,
      "explicitMods":[ "..." ], "implicitMods":[ "..." ],
      "league":"Standard", "realm":"poe2",
      "hideoutToken":"...", "indexedTime":"..."
    } ] } }

Хост подтверждает, при желании шлёт прогресс, затем единый результат:

{ "type":"ack", "ackSeq":7 }
{ "type":"buy_progress", "id":"r-42", "phase":"teleporting" }
{ "type":"buy_result", "id":"r-42", "seq":11,
  "items":[ { "itemId":"...", "ok":true, "reason":"verified" } ],
  "summary":{ "bought":1, "failed":0 } }
  • group.searchId — поиск, из которого пришёл листинг; хост привязывает покупку к нужному Trade Link (если не указан — берёт первый активный поиск). Указывайте для корректной работы с несколькими поисками.
  • stashX/stashY — координаты предмета в магазине продавца; w/h — размер. Они управляют кликом в игре.
  • Цену можно слать плоско (currency/amount, как выше) или вложенно ("price":{"currency","amount"}) — хост принимает оба варианта.
  • hideoutToken передаётся только для логов (whisper вы уже сделали им).
  • Каждый buy_result нужно подтвердить: {"type":"ack","ackSeq":<buy_result.seq>}.

4.4 События стадии whisper + логи (ext → host)

Исходы стадии whisper (для полноты логов POEFixer):

{ "type":"trade_event", "seq":8, "stage":"whisper", "outcome":"in_demand", "itemId":"...", "detail":"" }
// outcome ∈ in_demand | whisper_failed | teleport_failed | fetch_error

trade_event может также нести полный объект item (те же поля, что и у элемента buy_request). teleport_failed = листинг продавца остался in demand даже после форсированного повторного whisper; с item POEFixer записывает его в Trade Logs как Teleport Fail. fetch_error / whisper_failed / in_demand — информационные, идут в общий лог (категория Trade).

Пересылайте свою активность в лог POEFixer (рекомендуется — все логи расширения должны быть в программе):

{ "type":"log", "level":"info", "message":"" }   // показывается в Логах POEFixer (категория Trade)

Сообщайте состояние live-WS каждого поиска, чтобы Trade Link в POEFixer показывал Connecting…/Live:

{ "type":"search_status", "searchId":"", "state":"connected" }   // state ∈ connected | closed | error

4.5 Надёжность

  • buy_request и trade_event несут растущий seq; хост их подтверждает. Храните неподтверждённые кадры и пересылайте их при реконнекте (по порядку seq).
  • buy_request.idключ идемпотентности: повторный id вернёт записанный buy_result (или error: duplicate, пока в процессе). Используйте стабильный уникальный id на покупку.
  • buy_result несёт seq, который подтверждаете вы.

4.6 Ошибки

{ "type":"error", "code":"entitlement_required|not_in_game|busy|duplicate|bad_request|unauthorized|proto_unsupported", "id":"r-42", "detail":"..." }

4.7 Минимальный клиент (JavaScript)

const ws = new WebSocket("ws://127.0.0.1:47362");
let ready = false, seq = 0, behavior = {}, searches = [];
const log = (message) => ws.send(JSON.stringify({ type:"log", level:"info", message }));
ws.onopen = () => ws.send(JSON.stringify({ type:"hello", proto:1, client:"MyExt/1.0" }));
ws.onmessage = (e) => {
  const m = JSON.parse(e.data);
  if (m.type === "welcome" && !m.allowed) console.warn("Нужен entitlement Trade");
  if (m.type === "config") { behavior = m.behavior; searches = m.searches; } // программа управляет вами
  if (m.type === "status")  ready = m.ready;
  if (m.type === "buy_result") ws.send(JSON.stringify({ type:"ack", ackSeq:m.seq }));
};
// мониторьте `searches`, подчиняйтесь `behavior`; после успешного ВАШЕГО whisper и ready === true:
function buy(items) {
  ws.send(JSON.stringify({ type:"buy_request", id:"r-"+Date.now(), seq:++seq,
    group:{ groupId:"g", isLastGroup:true, items } }));
}

5. Устранение неполадок

  • Host: disconnected — POEFixer не запущен, мост не стартован или порт не тот. Запустите мост в Settings → Trade; сверьте порт в попапе.
  • entitlement_required — у лицензии нет функции Trade (платная на сервере).
  • not_in_game — POEFixer не прикреплён/не в игре; дождитесь status.ready.
  • Live-поиск не срабатывает — убедитесь, что вы залогинены на трейд-сайте в том же браузере. Расширение само открывает закреплённую фоновую вкладку на каждый поиск и поднимает live-WebSocket внутри неё; Trade Link показывает Connecting…, затем Live. Если застрял на Connecting… — откройте закреплённую вкладку и проверьте, что вы залогинены.
  • Порт занят — смените порт в Settings → Trade и в попапе, перезапустите мост.

← Home

Clone this wiki locally