Skip to content

Trade Bridge UA

Lafko edited this page Jun 22, 2026 · 1 revision

← 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 стане зеленим і покаже назву та реальну версію розширення, наприклад «Розширення підключено (PoeFixerExt/1.1.2)» (версія береться з маніфесту розширення — застаріле розширення буде позначено тут).
  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. Закриття цієї закріпленої вкладки зупиняє пошук.

Ручна купівля (купити пошук гуртом, зараз): замість очікування live-лістингів натисніть іконку Кошик на будь-якому Trade Link для негайної гуртової купівлі. Розширення отримує найдешевші відповідні лістинги для цього пошуку (до заданої кількості предметів, з урахуванням фільтрів валюти цього посилання), групує їх за продавцями і для кожного виконує whisper + купівлю через POEFixer — застосовуючи ті самі ліміти витрат і авто-стеш, з єдиним поверненням у сховок наприкінці. Ручна купівля і live-пошук (Play) взаємовиключають одне одного: зупиніть 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", "version":"1.1.0", "token":"<необов'язково>" }
// хост → клієнт
{ "type":"welcome", "proto":1, "host":"POEFixer", "allowed":true, "paid":false, "ready":false }
  • version — версія розширення з маніфесту (semver-рядок, наприклад "1.1.0"). Якщо ваше розширення старіше за очікувану версію, POEFixer виявляє невідповідність, придушує live-пошуки і вимикає купівлі до перевстановлення актуального розширення. POEFixer показує попередження в Settings → Trade. Спроба купівлі при застарілому розширенні повертає {"type":"error","code":"outdated_extension"}.
  • 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 Ручна купівля (host-driven bulk buy)

Коли користувач натискає Ручна купівля (іконка кошика) на Trade Link, хост відправляє manual_buy; розширення виконує одноразову гуртову купівлю за цим пошуком і повідомляє про життєвий цикл/прогрес через manual_buy_status. Купівлі в кожного продавця використовують звичайний потік buy_request (§4.3) з isLastGroup:false; хост відправляє фінальний /hideout після отримання state:"done".

// хост → клієнт: почати одноразову гуртову купівлю за одним збереженим пошуком
{ "type":"manual_buy", "id":"mb-…", "seq":12,
  "search":{ "realm":"poe2", "league":"Standard", "searchId":"", "note":"" },
  "itemCount":10,                               // 0 = все результати
  "filters":{ "chaos":{ "min":0, "max":0 } } }  // валюта → {min,max}; 0 = без обмежень
// хост → клієнт: скасувати поточну гуртову купівлю
{ "type":"manual_buy_cancel", "id":"mb-…", "seq":13 }
// клієнт → хост: життєвий цикл + прогрес (підтверджується як trade_event)
{ "type":"manual_buy_status", "id":"mb-…", "seq":4,
  "state":"started|progress|done|cancelled|error",
  "processed":3, "bought":2, "failed":1, "total":10, "detail":"" }
  • Отримайте результати пошуку, виберіть найдешевші лістинги, застосуйте filters, обмежте itemCount (0 = все), згрупуйте за продавцями і купіть кожну групу через buy_request (isLastGroup:false).
  • Відправте manual_buy_status started на початку, progress по завершенні кожної групи і рівно один фінальний done / cancelled / error.

4.6 Надійність

  • buy_request і trade_event несуть зростаючий seq; хост їх підтверджує. Зберігайте непідтверджені кадри і пересилайте їх при реконекті (за порядком seq).
  • buy_request.idключ ідемпотентності: повторний id поверне записаний buy_result (або error: duplicate, поки в процесі). Використовуйте стабільний унікальний id на купівлю.
  • buy_result несе seq, який підтверджуєте ви.

4.7 Помилки

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

4.8 Мінімальний клієнт (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", version:"1.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