-
Notifications
You must be signed in to change notification settings - Fork 0
Trade Bridge UA
Trade Bridge дозволяє браузерному розширенню виконувати всю роботу з трейд-сайтом (live-пошук, fetch, whisper), а POEFixer займається лише купівлею в грі. Уся робота з трейд-сайтом іде всередині вашої справжньої браузерної сесії — без копіювання cookies і возні з cf_clearance — і це фундамент для майбутнього режиму «POEFixer на іншому ПК».
Можна використати безкоштовне офіційне розширення або написати своє за документованим протоколом нижче.
Trade Bridge вимагає, щоб у вашої ліцензії POEFixer була функція Trade. Якщо на сервері Trade зроблена платною — потрібен валідний ключ; якщо безкоштовною — користуватися може будь-хто. Без прав міст відповідає
entitlement_requiredі відхиляє купівлі.
Браузерне розширення 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-clientPOEFixer не використовується, а трейд-сайтові елементи (Connections, Trade Cookies, Force teleport, In-demand, Rate limiting) переїжджають у розширення і ховаються/вимикаються в POEFixer.
Розширення постачається всередині POEFixer. У теці POEFixer відкрийте Resources\extension\:
<тека POEFixer>\Resources\extension\
├─ poefixer-extension-chrome.zip ← Chrome / Edge
├─ poefixer-extension-firefox.zip ← Firefox
└─ chrome\ ← розпакована копія для кнопки «Допомога зі встановленням»
Повністю «тиха» установка однією кнопкою неможлива — браузери навмисно блокують програмне встановлення розширень. Ви розпаковуєте архів для свого браузера і завантажуєте його один раз. Кнопка Допомога зі встановленням… (Конфігурація → Trade) робить частину для Chrome/Edge: копіює шлях до розпакованої теки
chrome\у буфер і відкриває цю інструкцію — тоді розпакування можна пропустити.
-
Розпакуйте
Resources\extension\poefixer-extension-chrome.zipу будь-яку теку (щобmanifest.jsonбув у її корені). Або натисніть Допомога зі встановленням… у POEFixer і використайте скопійований шлях — потім перейдіть до кроку 4. - Відкрийте
chrome://extensions(Edge:edge://extensions). - Увімкніть Режим розробника (праворуч угорі).
- Натисніть Завантажити розпаковане розширення і виберіть цю теку (або вставте шлях від «Допомога зі встановленням»).
- Іконка з'явиться на панелі; зберігається між перезапусками.
Після оновлення POEFixer вбудоване розширення оновлюється — відкрийте
chrome://extensionsі натисніть Оновити на картці розширення (або заново розпакуйте й завантажте).
Релізний Firefox ставить лише підписані Mozilla розширення, тому використовуйте тимчасове завантаження:
-
Розпакуйте
Resources\extension\poefixer-extension-firefox.zipу будь-яку теку. - Відкрийте
about:debugging#/runtime/this-firefox. - Натисніть Завантажити тимчасове доповнення… і виберіть
manifest.jsonіз розпакованої теки. - Залишиться завантаженим до перезапуску Firefox (повторіть після перезапуску).
-
Постійно: встановіть підписаний Mozilla/AMO
.xpi, відкривши його у Firefox і підтвердивши запит прав.
- У POEFixer: Конфігурація → Trade → Джерело даних трейду → Браузерне розширення, запам'ятайте Порт (за замовчуванням
47362) і натисніть Запустити міст. - У попапі розширення вкажіть той самий Порт — має показати Host: connected, а статус у POEFixer стане зеленим і покаже назву та реальну версію розширення, наприклад «Розширення підключено (PoeFixerExt/1.1.2)» (версія береться з маніфесту розширення — застаріле розширення буде позначено тут).
- Увійдіть на трейд-сайт у цьому браузері, додайте Trade Links і натисніть Play (див. §3).
Усе керування — у POEFixer; у попапі розширення вказується лише Port.
- У POEFixer: Configuration → Trade → Джерело даних = Браузерне розширення, вкажіть Port, натисніть Запустити міст.
- У попапі розширення перевірте Host: connected і той самий Port.
- Залогіньтеся на трейд-сайті в тому самому браузері.
- У Trade Links (вкладка Connections) POEFixer додайте URL-и пошуку trade2 і натисніть Play — пошук передається в розширення і запускається там; Stop прибирає його.
- Поведінка задається в POEFixer (Configuration → Trade): Force teleport, Item is in demand → teleport anyway, Rate limiting — POEFixer пушить їх у розширення, воно лише підкоряється.
- При збігу розширення надсилає whisper, а POEFixer купує в грі. Уся активність розширення потрапляє в Логи POEFixer (категорія Trade).
Надійний live-фід (автоматично): для кожного активного пошуку розширення відкриває закріплену фонову вкладку сторінки трейду і піднімає live-WebSocket усередині цієї сторінки (правильний Origin + куки сесії — як робить сам сайт). Просто залишайтеся залогінені на трейд-сайті; Live Search вручну вмикати не потрібно. Trade Link показує Connecting…, поки WS не піднявся, потім Live. Закриття цієї закріпленої вкладки зупиняє пошук.
Ручна купівля (купити пошук гуртом, зараз): замість очікування live-лістингів натисніть іконку Кошик на будь-якому Trade Link для негайної гуртової купівлі. Розширення отримує найдешевші відповідні лістинги для цього пошуку (до заданої кількості предметів, з урахуванням фільтрів валюти цього посилання), групує їх за продавцями і для кожного виконує whisper + купівлю через POEFixer — застосовуючи ті самі ліміти витрат і авто-стеш, з єдиним поверненням у сховок наприкінці. Ручна купівля і live-пошук (Play) взаємовиключають одне одного: зупиніть live-пошуки перед початком ручної купівлі і навпаки. Кнопка кошика активна лише поки розширення підключене.
Протокол — звичайний JSON по WebSocket. Реалізувати може будь-хто. Сервер піднімає POEFixer; ваш клієнт підключається до ws://127.0.0.1:<port> (за замовчуванням 47362, налаштовується в Settings).
Хост виконує купівлі лише якщо в ліцензії є entitlement Trade. Інакше ви отримаєте
{"type":"error","code":"entitlement_required"}. (Деталі автентифікації навмисно не документуються.)
Спочатку шлете hello; хост відповідає welcome.
-
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":"…" } ] }Хост періодично шле status:
{ "type":"status", "ready":true, "inGame":true, "attached":true, "busy":false }Ви ЗОБОВ'ЯЗАНІ надсилати whisper/телепорт лише коли останній status.ready === true. ready = є_права && прикріплений && у_грі && !зайнятий. Whisper при не-ready телепортує персонажа без покупця, що веде угоду.
Після успішного 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>}.
Результати стадії 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; зitemPOEFixer записує його в 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Коли користувач натискає Ручна купівля (іконка кошика) на 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_statusstartedна початку,progressпо завершенні кожної групи і рівно один фінальнийdone/cancelled/error.
-
buy_requestіtrade_eventнесуть зростаючийseq; хост їх підтверджує. Зберігайте непідтверджені кадри і пересилайте їх при реконекті (за порядкомseq). -
buy_request.id— ключ ідемпотентності: повторний id поверне записанийbuy_result(абоerror: duplicate, поки в процесі). Використовуйте стабільний унікальний id на купівлю. -
buy_resultнесеseq, який підтверджуєте ви.
{ "type":"error", "code":"entitlement_required|not_in_game|busy|duplicate|bad_request|unauthorized|proto_unsupported|outdated_extension", "id":"r-42", "detail":"..." }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 } }));
}- Host: disconnected — POEFixer не запущений, міст не стартований або порт не той. Запустіть міст у Settings → Trade; звірте порт у попапі.
-
entitlement_required— у ліцензії немає функції Trade (платна на сервері). -
not_in_game— POEFixer не прикріплений/не в грі; дочекайтесяstatus.ready. - Live-пошук не спрацьовує — переконайтеся, що ви залогінені на трейд-сайті в тому самому браузері. Розширення саме відкриває закріплену фонову вкладку на кожен пошук і піднімає live-WebSocket усередині неї; Trade Link показує Connecting…, потім Live. Якщо застряг на Connecting… — відкрийте закріплену вкладку і перевірте, що ви залогінені.
- Порт зайнятий — змініть порт у Settings → Trade і в попапі, перезапустіть міст.