Skip to content

Trade Bridge DE

Lafko edited this page Jun 22, 2026 · 1 revision

← Home


Trade Bridge (Browser-Erweiterung)

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_required und verweigert Käufe.


1. So funktioniert es

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-client von 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.

2. Erweiterung installieren

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.

Chrome / Edge

  1. Entpacke Resources\extension\poefixer-extension-chrome.zip in einen beliebigen Ordner (sodass manifest.json ganz oben darin liegt). Oder klicke in POEFixer auf Assisted install… und verwende den kopierten Pfad — dann weiter zu Schritt 4.
  2. Öffne chrome://extensions (Edge: edge://extensions).
  3. Aktiviere den Entwicklermodus (oben rechts).
  4. Klicke auf Entpackte Erweiterung laden und wähle diesen Ordner (oder füge den Assisted-install-Pfad ein).
  5. Das Erweiterungssymbol erscheint in der Symbolleiste; es bleibt über Neustarts hinweg geladen.

Nach einem POEFixer-Update wird die mitgelieferte Erweiterung aktualisiert — öffne chrome://extensions und klicke auf der Erweiterungskarte auf Neu laden, um die neue Version zu übernehmen (oder erneut entpacken und Entpackte Erweiterung laden).

Firefox

Das Release-Firefox installiert nur von Mozilla signierte Erweiterungen, verwende daher das temporäre Laden:

  1. Entpacke Resources\extension\poefixer-extension-firefox.zip in einen beliebigen Ordner.
  2. Öffne about:debugging#/runtime/this-firefox.
  3. Klicke auf Temporäres Add-on laden… und wähle die manifest.json aus dem entpackten Ordner.
  4. 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.

Dann verbinden

  1. In POEFixer: Configuration → Trade → Trade data source → Browser extension, merke dir den Port (Standard 47362) und klicke auf Start bridge.
  2. 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).
  3. Melde dich in diesem Browser auf der Trade-Seite an, füge dann deine Trade Links hinzu und drücke Play (siehe §3).

3. Verwendung

Alles wird über POEFixer gesteuert — im Erweiterungs-Popup wird nur der Verbindungs-Port eingestellt.

  1. In POEFixer: Configuration → Trade → Data source = Browser extension, stelle den Port ein, klicke auf Start bridge.
  2. Bestätige im Erweiterungs-Popup Host: connected und denselben Port.
  3. Melde dich im selben Browser auf der Trade-Seite an.
  4. 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.
  5. 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.
  6. 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.


4. Eigene Erweiterung bauen — Trade Bridge API (PTBP)

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.)

4.1 Handshake

Sende zuerst hello; der Host antwortet mit welcome.

// client → host
{ "type":"hello", "proto":1, "client":"MyExtension/1.0", "version":"1.1.0", "token":"<optional>" }
// host → client
{ "type":"welcome", "proto":1, "host":"POEFixer", "allowed":true, "paid":false, "ready":false }
  • version ist 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 mit entitlement_required ab.
  • token wird 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":"" } ] }

4.2 Bereitschaft — whisper only when ready

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.

4.3 Kaufablauf

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.searchId ist 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/stashY sind die Koordinaten des Items im Shop des Verkäufers; w/h seine 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.
  • hideoutToken wird nur zum Logging mitgeführt (du hast es bereits für den Whisper verwendet).
  • Du musst jedes buy_result bestätigen: sende {"type":"ack","ackSeq":<buy_result.seq>}.

4.4 Whisper-Stufen-Events + Logs (ext → host)

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_error

Ein trade_event kann auch das vollständige item-Objekt mitführen (dieselben Felder wie ein buy_request-Item). teleport_failed = das Listing des Verkäufers war auch nach einem erzwungenen erneuten Whisper noch in demand; mit seinem item gesendet, trägt POEFixer es in den Trade Logs als Teleport Fail ein. fetch_error / whisper_failed / in_demand sind 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 | error

4.5 Manual buy (host-driven bulk buy)

Wenn 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 filters an, begrenze auf itemCount (0 = alle), gruppiere nach Verkäufer und kaufe jede Gruppe über buy_request (isLastGroup:false).
  • Sende manual_buy_status started zu Beginn, progress während Gruppen abgeschlossen werden, und genau ein abschließendes done / cancelled / error.

4.6 Zuverlässigkeit

  • buy_request und trade_event führen ein hochzählendes seq; der Host bestätigt sie. Behalte unbestätigte Frames und sende sie beim Reconnect erneut (nach seq sortiert).
  • buy_request.id ist der Idempotenz-Schlüssel — eine erneut gesendete id liefert das aufgezeichnete buy_result zurück (oder error: duplicate, solange es noch in Bearbeitung ist). Verwende eine stabile, eindeutige id pro Kauf.
  • buy_result trägt ein seq, das du bestätigst.

4.7 Fehler

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

4.8 Minimaler Client (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("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 } }));
}

5. Fehlerbehebung

  • 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 auf status.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.

← Home

Clone this wiki locally