-
Notifications
You must be signed in to change notification settings - Fork 0
Trade Bridge DE
Die Trade Bridge lässt eine Browser-Erweiterung die gesamte Arbeit mit der Trade-Seite erledigen (Live-Suche, Fetch, Whisper), während POEFixer nur den Kauf im Spiel übernimmt. So bleibt der gesamte Trade-Seiten-Verkehr in deiner echten Browser-Sitzung — kein Kopieren von Cookies, kein Ärger mit cf_clearance — und das ist die Grundlage für einen künftigen Modus „POEFixer auf einem anderen PC".
Du kannst die kostenlose offizielle Erweiterung verwenden oder nach dem unten dokumentierten Protokoll deine eigene schreiben.
Die Trade Bridge setzt voraus, dass deine POEFixer-Lizenz die Trade-Funktion besitzt. Ist Trade auf dem Server als kostenpflichtig konfiguriert, brauchst du einen gültigen Key; ist sie kostenlos, kann sie jeder nutzen. Ohne Berechtigung antwortet die Bridge mit
entitlement_requiredund verweigert Käufe.
Browser extension POEFixer
live-search WebSocket ─┐
fetch item details │ ws://127.0.0.1:PORT in-game buying:
whisper (teleport) ├─────────────────────► wait teleport → click → verify
(Force teleport, │ buy_request → auto-stash → /hideout
In-demand retry, │ ◄───────────────────── → report result
Rate limiting) ─┘ buy_result
- Die Erweiterung besitzt alles, was die Trade-Seite betrifft.
- POEFixer besitzt alles im Spielclient und stellt einen lokalen WebSocket-Server (die Trade Bridge) bereit, mit dem sich die Erweiterung verbindet.
- In diesem Modus wird der eingebaute
tls-clientvon POEFixer nicht genutzt, und die Trade-Seiten-Steuerungen (Connections, Trade Cookies, Force teleport, In-demand, Rate limiting) wandern in die Erweiterung und werden in POEFixer ausgeblendet/deaktiviert.
Die Erweiterung wird mit POEFixer ausgeliefert. Öffne in deinem POEFixer-Ordner Resources\extension\:
<POEFixer folder>\Resources\extension\
├─ poefixer-extension-chrome.zip ← Chrome / Edge
├─ poefixer-extension-firefox.zip ← Firefox
└─ chrome\ ← unpacked copy used by the "Assisted install" button
Eine vollständig stille Ein-Klick-Installation ist nicht möglich — Browser blockieren die programmatische Installation von Erweiterungen absichtlich. Du entpackst das Archiv für deinen Browser und lädst es einmalig. Der Button Assisted install… in POEFixer (Configuration → Trade) übernimmt den Chrome/Edge-Teil für dich: Er kopiert den Pfad des entpackten
chrome\-Ordners in die Zwischenablage und öffnet diese Anleitung, sodass du das Entpacken überspringen kannst.
-
Entpacke
Resources\extension\poefixer-extension-chrome.zipin einen beliebigen Ordner (sodassmanifest.jsonganz oben darin liegt). Oder klicke in POEFixer auf Assisted install… und verwende den kopierten Pfad — dann weiter zu Schritt 4. - Öffne
chrome://extensions(Edge:edge://extensions). - Aktiviere den Entwicklermodus (oben rechts).
- Klicke auf Entpackte Erweiterung laden und wähle diesen Ordner (oder füge den Assisted-install-Pfad ein).
- Das Erweiterungssymbol erscheint in der Symbolleiste; es bleibt über Neustarts hinweg geladen.
Nach einem POEFixer-Update wird die mitgelieferte Erweiterung aktualisiert — öffne
chrome://extensionsund klicke auf der Erweiterungskarte auf Neu laden, um die neue Version zu übernehmen (oder erneut entpacken und Entpackte Erweiterung laden).
Das Release-Firefox installiert nur von Mozilla signierte Erweiterungen, verwende daher das temporäre Laden:
-
Entpacke
Resources\extension\poefixer-extension-firefox.zipin einen beliebigen Ordner. - Öffne
about:debugging#/runtime/this-firefox. - Klicke auf Temporäres Add-on laden… und wähle die
manifest.jsonaus dem entpackten Ordner. - Es bleibt geladen, bis du Firefox neu startest (nach einem Neustart wiederholen).
-
Dauerhaft: Installiere eine von Mozilla/AMO signierte
.xpi, indem du sie in Firefox öffnest und die Berechtigungsabfrage bestätigst.
- In POEFixer: Configuration → Trade → Trade data source → Browser extension, merke dir den Port (Standard
47362) und klicke auf Start bridge. - Stelle im Erweiterungs-Popup denselben Port ein — es sollte Host: connected anzeigen, und der Status in POEFixer wird grün und zeigt Name und echte Version der Erweiterung, z. B. „Extension connected (PoeFixerExt/1.1.2)" (die Version stammt aus dem Manifest der Erweiterung — eine veraltete Erweiterung wird hier markiert).
- Melde dich in diesem Browser auf der Trade-Seite an, füge dann deine Trade Links hinzu und drücke Play (siehe §3).
Alles wird über POEFixer gesteuert — im Erweiterungs-Popup wird nur der Verbindungs-Port eingestellt.
- In POEFixer: Configuration → Trade → Data source = Browser extension, stelle den Port ein, klicke auf Start bridge.
- Bestätige im Erweiterungs-Popup Host: connected und denselben Port.
- Melde dich im selben Browser auf der Trade-Seite an.
- Füge in POEFixers Trade Links (Tab Connections) deine trade2-Such-URLs hinzu und drücke Play — die Suche wird an die Erweiterung übergeben und läuft dort; Stop entfernt sie.
- Stelle das Verhalten in POEFixer ein (Configuration → Trade): Force teleport, Item is in demand → teleport anyway, Rate limiting — POEFixer pusht diese an die Erweiterung, die sie nur befolgt.
- Passt ein Listing, sendet die Erweiterung einen Whisper und POEFixer kauft im Spiel. Die gesamte Aktivität der Erweiterung erscheint in POEFixers Logs (Kategorie Trade).
Zuverlässiger Live-Feed (automatisch): Für jede aktive Suche öffnet die Erweiterung einen angepinnten Hintergrund-Tab der Trade-Seite und verbindet das Live-WebSocket innerhalb dieser Seite (korrekter Origin + deine Sitzungs-Cookies — genau wie es die Seite selbst tut). Bleib einfach auf der Trade-Seite angemeldet; du öffnest die Live-Suche nicht manuell. Der Trade Link zeigt Connecting…, bis das Live-WS steht, dann Live. Das Schließen dieses angepinnten Tabs stoppt die Suche.
Manual Buy (eine Suche jetzt in großer Menge kaufen): Statt auf Live-Listings zu warten, drücke das Warenkorb-Symbol an einem beliebigen Trade Link, um sofort in großer Menge zu kaufen. Die Erweiterung holt die günstigsten passenden Listings für diese Suche (bis zur von dir eingestellten Anzahl der Items, unter Beachtung der Währungsfilter dieses Links), gruppiert sie nach Verkäufer und whispert + kauft jedes über POEFixer — wobei dieselben Ausgabenlimits und derselbe Auto-Stash angewendet werden, mit einer einzigen Rückkehr ins Hideout am Ende. Manual Buy und Live-Suche (Play) schließen sich gegenseitig aus: Stoppe deine Live-Suchen, bevor du einen Manual Buy startest, und umgekehrt. Der Warenkorb-Button ist nur aktiv, solange die Erweiterung verbunden ist.
Das Protokoll ist einfaches JSON über ein WebSocket. Jeder kann es implementieren. POEFixer hostet den Server; dein Client verbindet sich mit ws://127.0.0.1:<port> (Standard 47362, in den Settings konfigurierbar).
Der Host führt Käufe nur aus, wenn deine Lizenz das Trade-Entitlement besitzt. Andernfalls erhältst du
{"type":"error","code":"entitlement_required"}. (Authentifizierungsdetails sind absichtlich nicht dokumentiert.)
Sende zuerst hello; der Host antwortet mit welcome.
-
versionist die Manifest-Version der Erweiterung (Semver-String, z. B."1.1.0"). Ist deine Erweiterung älter als die von POEFixer erwartete Version, erkennt es die Diskrepanz, unterdrückt Live-Suchen und deaktiviert Käufe, bis du die neueste Erweiterung neu installierst. POEFixer zeigt eine Warnung in Settings → Trade. Ein bei veralteter Erweiterung versuchter Kauf erhält{"type":"error","code":"outdated_extension"}. -
allowed:false→ keine Berechtigung (als „Key kaufen" behandeln); der Host weist Käufe mitentitlement_requiredab. -
tokenwird nur benötigt, wenn der Benutzer in POEFixer ein Pairing-Token aktiviert hat (standardmäßig aus).
Nach welcome (und immer wenn der Benutzer in POEFixer etwas ändert) pusht der Host eine config-Nachricht. Das Programm ist die einzige Steuerinstanz, daher muss deine Erweiterung genau diese Suchen überwachen und dieses Verhalten befolgen:
// host → client
{ "type":"config",
"behavior":{ "forceTeleport":false, "inDemandRetry":true, "rateLimit":true },
"searches":[ { "realm":"poe2", "league":"Standard", "searchId":"…", "note":"…" } ] }Der Host pusht periodisch status:
{ "type":"status", "ready":true, "inGame":true, "attached":true, "busy":false }Du DARFST nur whispern/teleportieren, wenn der letzte status.ready === true war. ready = entitled && attached && in-game && !busy. Whispern, während nicht ready, teleportiert den Charakter, ohne dass ein Käufer die Sache steuert.
Nachdem dein Whisper erfolgreich war (der Charakter teleportiert), sende buy_request:
// client → host
{ "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":"..."
} ] } }Der Host bestätigt ihn, sendet optional Fortschritt und dann ein einziges Ergebnis:
{ "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.searchIdist die Suche, aus der das Listing stammt; der Host bindet damit den Kauf an den richtigen Trade Link (greift bei Weglassen auf die erste aktive Suche zurück). Sende es für korrektes Verhalten bei mehreren Suchen. -
stashX/stashYsind die Koordinaten des Items im Shop des Verkäufers;w/hseine Größe — sie steuern den Klick im Spiel. - Der Preis kann flach gesendet werden (
currency/amount, wie oben) oder verschachtelt ("price":{"currency","amount"}) — der Host akzeptiert beides. -
hideoutTokenwird nur zum Logging mitgeführt (du hast es bereits für den Whisper verwendet). - Du musst jedes
buy_resultbestätigen: sende{"type":"ack","ackSeq":<buy_result.seq>}.
Ergebnisse der Whisper-Stufe (damit POEFixers Logs vollständig bleiben):
{ "type":"trade_event", "seq":8, "stage":"whisper", "outcome":"in_demand", "itemId":"...", "detail":"" }
// outcome ∈ in_demand | whisper_failed | teleport_failed | fetch_errorEin
trade_eventkann auch das vollständigeitem-Objekt mitführen (dieselben Felder wie einbuy_request-Item).teleport_failed= das Listing des Verkäufers war auch nach einem erzwungenen erneuten Whisper noch in demand; mit seinemitemgesendet, trägt POEFixer es in den Trade Logs als Teleport Fail ein.fetch_error/whisper_failed/in_demandsind informativ und gehen in die allgemeinen Logs (Kategorie Trade).
Leite deine Aktivität an POEFixers Log weiter (empfohlen — alle Logs der Erweiterung sollten im Programm erscheinen):
{ "type":"log", "level":"info", "message":"…" } // shown in POEFixer Logs (category Trade)Melde den Live-WS-Zustand jeder Suche, damit POEFixers Trade Link Connecting…/Live anzeigt:
{ "type":"search_status", "searchId":"…", "state":"connected" } // state ∈ connected | closed | errorWenn der Benutzer an einem Trade Link auf Manual Buy (das Warenkorb-Symbol) klickt, sendet der Host manual_buy; deine Erweiterung führt einen einmaligen Massenkauf dieser Suche durch und meldet Lebenszyklus/Fortschritt mit manual_buy_status. Die Käufe pro Verkäufer nutzen den gewöhnlichen buy_request-Ablauf (§4.3) mit isLastGroup:false; der Host löst das abschließende /hideout aus, sobald er state:"done" empfängt.
// host → client: start a one-shot bulk buy of one saved search
{ "type":"manual_buy", "id":"mb-…", "seq":12,
"search":{ "realm":"poe2", "league":"Standard", "searchId":"…", "note":"…" },
"itemCount":10, // 0 = all results
"filters":{ "chaos":{ "min":0, "max":0 } } } // currency → {min,max}; 0 = unbounded
// host → client: cancel an in-progress bulk buy
{ "type":"manual_buy_cancel", "id":"mb-…", "seq":13 }
// client → host: lifecycle + progress (ack-tracked like 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":"" }- Löse die Suche auf, hole die günstigsten passenden Listings, wende
filtersan, begrenze aufitemCount(0 = alle), gruppiere nach Verkäufer und kaufe jede Gruppe überbuy_request(isLastGroup:false). - Sende
manual_buy_statusstartedzu Beginn,progresswährend Gruppen abgeschlossen werden, und genau ein abschließendesdone/cancelled/error.
-
buy_requestundtrade_eventführen ein hochzählendesseq; der Host bestätigt sie. Behalte unbestätigte Frames und sende sie beim Reconnect erneut (nachseqsortiert). -
buy_request.idist der Idempotenz-Schlüssel — eine erneut gesendete id liefert das aufgezeichnetebuy_resultzurück (odererror: duplicate, solange es noch in Bearbeitung ist). Verwende eine stabile, eindeutige id pro Kauf. -
buy_resultträgt einseq, das du bestätigst.
{ "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("Trade entitlement required");
if (m.type === "config") { behavior = m.behavior; searches = m.searches; } // program controls you
if (m.type === "status") ready = m.ready;
if (m.type === "buy_result") ws.send(JSON.stringify({ type:"ack", ackSeq:m.seq }));
};
// monitor `searches`, obey `behavior`; after YOUR whisper succeeds and 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 läuft nicht, die Bridge wurde nicht gestartet oder der Port ist falsch. Starte die Bridge in Settings → Trade; gleiche den Port im Popup ab.
-
entitlement_required— deiner Lizenz fehlt die Trade-Funktion (auf dem Server kostenpflichtig). -
not_in_game— POEFixer ist nicht attached/im Spiel; warte aufstatus.ready. - Live-Suche löst nie aus — stelle sicher, dass du im selben Browser auf der Trade-Seite angemeldet bist. Die Erweiterung öffnet pro Suche automatisch ihren eigenen angepinnten Hintergrund-Tab und betreibt das Live-WebSocket innerhalb dieser Seite; der Trade Link zeigt Connecting…, dann Live. Bleibt er bei Connecting…, öffne den angepinnten Tab, um zu prüfen, ob du angemeldet bist.
- Port belegt — ändere den Port in Settings → Trade und im Popup, starte dann die Bridge neu.