-
Notifications
You must be signed in to change notification settings - Fork 0
Trade Bridge RU
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: Конфигурация → Trade → Источник данных трейда → Браузерное расширение. Запомните Порт (по умолчанию 47362) и нажмите Запустить мост (рядом с полем Порт). Статус рядом станет зелёным («Расширение подключено»), как только расширение подключится.
Полностью «тихая» установка одной кнопкой невозможна — браузеры намеренно блокируют программную установку расширений. Кнопка Помощь с установкой… в POEFixer делает то, что может (готовит папку расширения, копирует путь в буфер, открывает эту инструкцию); последние 2–3 клика вы делаете в браузере.
- Откройте
chrome://extensions(Edge:edge://extensions). - Включите Режим разработчика (справа вверху).
- Нажмите Загрузить распакованное расширение и выберите папку расширения (путь, скопированный кнопкой «Помощь с установкой», или
extension/dist/chrome). - Иконка появится на панели. Сохраняется между перезапусками.
Релизный Firefox ставит только подписанные Mozilla расширения.
-
Для теста:
about:debugging#/runtime/this-firefox→ Загрузить временное дополнение → выберитеextension/dist/firefox/manifest.json(удаляется при перезапуске). -
Постоянно: установите подписанный
.xpi(self-distributed через AMO), открыв его в Firefox и подтвердив запрос прав.
Принудительная установка через корпоративные политики (ExtensionInstallForcelist / ExtensionSettings) может ставить расширение автоматически, но показывает «управляется вашей организацией», требует прав админа, всё равно нуждается в хостинге/подписи и может триггерить антивирус. Только если понимаете, что делаете.
Всё управление — в 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. Закрытие этой закреплённой вкладки останавливает поиск.
Протокол — обычный JSON по WebSocket. Реализовать может любой. Сервер поднимает POEFixer; ваш клиент подключается к ws://127.0.0.1:<port> (по умолчанию 47362, настраивается в Settings).
Хост выполняет покупки только если у лицензии есть entitlement Trade. Иначе вы получите
{"type":"error","code":"entitlement_required"}. (Детали аутентификации намеренно не документируются.)
Сначала шлёте hello; хост отвечает welcome.
-
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 | fetch_errorПересылайте свою активность в лог 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-
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", "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" }));
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 и в попапе, перезапустите мост.