Skip to content

Trade Bridge FR

Lafko edited this page Jun 22, 2026 · 1 revision

← Home


Trade Bridge (extension de navigateur)

Le Trade Bridge permet a une extension de navigateur d'effectuer tout le travail sur le site d'echange (live search, fetch, whisper), tandis que POEFixer ne fait que l'achat en jeu. Tout le trafic du site d'echange reste a l'interieur de votre vraie session de navigateur — sans copie de cookies, sans tracas avec cf_clearance — et c'est la base d'un futur mode « executer POEFixer sur un autre PC ».

Vous pouvez utiliser l'extension officielle gratuite ou ecrire la votre selon le protocole documente ci-dessous.

Le Trade Bridge necessite que votre licence POEFixer dispose de la fonction Trade. Si Trade est configure comme payant sur le serveur, vous avez besoin d'une cle valide ; s'il est gratuit, tout le monde peut l'utiliser. Sans droits, le pont repond entitlement_required et refuse les achats.


1. Comment ca marche

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
  • L'extension possede tout ce qui touche au site d'echange.
  • POEFixer possede tout ce qui concerne le client de jeu et expose un serveur WebSocket local (le Trade Bridge) auquel l'extension se connecte.
  • Dans ce mode, le tls-client integre de POEFixer n'est pas utilise, et les controles du site d'echange (Connections, Trade Cookies, Force teleport, In-demand, Rate limiting) passent dans l'extension et sont masques/desactives dans POEFixer.

2. Installer l'extension

L'extension est fournie a l'interieur de POEFixer. Dans votre dossier POEFixer, ouvrez 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

Une installation totalement silencieuse en un clic n'est pas possible — les navigateurs bloquent volontairement l'installation programmatique d'extensions. Vous decompressez le fichier pour votre navigateur et le chargez une fois. Le bouton Assisted install… de POEFixer (Configuration → Trade) fait la partie Chrome/Edge a votre place : il copie le chemin du dossier decompresse chrome\ dans le presse-papiers et ouvre ce guide, ce qui vous permet de sauter la decompression.

Chrome / Edge

  1. Decompressez Resources\extension\poefixer-extension-chrome.zip dans n'importe quel dossier (de sorte que manifest.json soit a sa racine). Ou cliquez sur Assisted install… dans POEFixer et utilisez le chemin copie — puis passez a l'etape 4.
  2. Ouvrez chrome://extensions (Edge : edge://extensions).
  3. Activez le Mode developpeur (en haut a droite).
  4. Cliquez sur Charger l'extension non empaquetee et selectionnez ce dossier (ou collez le chemin de l'Assisted install).
  5. L'icone de l'extension apparait dans la barre d'outils ; elle reste chargee entre les redemarrages.

Apres une mise a jour de POEFixer, l'extension integree est rafraichie — ouvrez chrome://extensions et cliquez sur Recharger sur la carte de l'extension pour recuperer la nouvelle version (ou re-decompressez et chargez l'extension non empaquetee).

Firefox

Le Firefox de release n'installe que les extensions signees par Mozilla ; utilisez donc le chargement temporaire :

  1. Decompressez Resources\extension\poefixer-extension-firefox.zip dans n'importe quel dossier.
  2. Ouvrez about:debugging#/runtime/this-firefox.
  3. Cliquez sur Charger un module complementaire temporaire… et choisissez le manifest.json du dossier decompresse.
  4. Il reste charge jusqu'au redemarrage de Firefox (a repeter apres un redemarrage).
  • Persistant : installez un .xpi signe par Mozilla/AMO en l'ouvrant dans Firefox et en confirmant la demande d'autorisation.

Puis connectez-vous

  1. Dans POEFixer : Configuration → Trade → Trade data source → Browser extension, notez le Port (par defaut 47362) et cliquez sur Start bridge.
  2. Dans le popup de l'extension, indiquez le meme Port — il devrait afficher Host: connected, et le statut dans POEFixer passe au vert et affiche le nom et la vraie version de l'extension, par exemple « Extension connected (PoeFixerExt/1.1.2) » (la version provient du manifeste de l'extension — une extension obsolete est signalee ici).
  3. Connectez-vous au site d'echange dans ce navigateur, puis ajoutez vos Trade Links et appuyez sur Play (voir §3).

3. L'utiliser

Tout est controle depuis POEFixer — le popup de l'extension ne definit que le Port de connexion.

  1. Dans POEFixer : Configuration → Trade → Data source = Browser extension, definissez le Port, cliquez sur Start bridge.
  2. Dans le popup de l'extension, confirmez Host: connected et le meme Port.
  3. Connectez-vous au site d'echange dans le meme navigateur.
  4. Dans les Trade Links de POEFixer (onglet Connections), ajoutez vos URL de recherche trade2 et appuyez sur Play — la recherche est poussee vers l'extension et s'execute la-bas ; Stop la supprime.
  5. Definissez le comportement dans POEFixer (Configuration → Trade) : Force teleport, Item is in demand → teleport anyway, Rate limiting — POEFixer les pousse vers l'extension, qui se contente d'obeir.
  6. Lorsqu'une mise en vente correspond, l'extension envoie un whisper et POEFixer achete en jeu. Toute l'activite de l'extension apparait dans les Logs de POEFixer (categorie Trade).

Flux live fiable (automatique) : pour chaque recherche active, l'extension ouvre un onglet d'arriere-plan epingle vers la page d'echange et connecte le live WebSocket a l'interieur de cette page (Origin correct + vos cookies de session — exactement comme le fait le site). Restez simplement connecte au site d'echange ; vous n'ouvrez pas Live Search manuellement. Le Trade Link affiche Connecting… jusqu'a ce que le live WS soit etabli, puis Live. Fermer cet onglet epingle arrete la recherche.

Manual Buy (acheter une recherche en masse, maintenant) : au lieu d'attendre les mises en vente live, appuyez sur l'icone Panier sur n'importe quel Trade Link pour acheter en masse immediatement. L'extension recupere les mises en vente correspondantes les moins cheres pour cette recherche (jusqu'au nombre d'objets que vous definissez, en respectant les filtres de monnaie de ce lien), les regroupe par vendeur, et envoie un whisper + achete chacune via POEFixer — en appliquant les memes limites de depense et auto-stash, avec un unique retour au refuge a la fin. Manual Buy et live search (Play) sont mutuellement exclusifs : arretez vos recherches live avant de demarrer un Manual Buy, et vice-versa. Le bouton panier n'est active que lorsque l'extension est connectee.


4. Construire sa propre extension — Trade Bridge API (PTBP)

Le protocole est du JSON simple sur un WebSocket. N'importe qui peut l'implementer. POEFixer heberge le serveur ; votre client se connecte a ws://127.0.0.1:<port> (par defaut 47362, configurable dans Settings).

L'hote n'honore les achats que si votre licence dispose de l'entitlement Trade. Sinon, vous recevez {"type":"error","code":"entitlement_required"}. (Les details d'authentification ne sont volontairement pas documentes.)

4.1 Handshake

Envoyez hello en premier ; l'hote repond 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 est la version manifeste de l'extension (chaine semver, par exemple "1.1.0"). Si votre extension est plus ancienne que la version attendue par POEFixer, il detecte l'incompatibilite, supprime les recherches live et desactive l'achat jusqu'a ce que vous reinstalliez la derniere extension. POEFixer affiche un avertissement dans Settings → Trade. Un achat tente avec une extension obsolete recoit {"type":"error","code":"outdated_extension"}.
  • allowed:false → pas de droits (a traiter comme « acheter une cle ») ; l'hote rejettera les achats avec entitlement_required.
  • token n'est necessaire que si l'utilisateur a active un token d'appairage dans POEFixer (desactive par defaut).

Apres welcome (et chaque fois que l'utilisateur change quelque chose dans POEFixer), l'hote pousse un message config. Le programme est l'unique surface de controle, donc votre extension doit surveiller exactement ces recherches et obeir a ce comportement :

// host → client
{ "type":"config",
  "behavior":{ "forceTeleport":false, "inDemandRetry":true, "rateLimit":true },
  "searches":[ { "realm":"poe2", "league":"Standard", "searchId":"", "note":"" } ] }

4.2 Disponibilite — whisper only when ready

L'hote pousse status periodiquement :

{ "type":"status", "ready":true, "inGame":true, "attached":true, "busy":false }

Vous NE DEVEZ envoyer un whisper/teleport que lorsque le dernier status.ready === true. ready = entitled && attached && in-game && !busy. Envoyer un whisper alors que ce n'est pas pret teleporte le personnage sans aucun acheteur pour piloter l'echange.

4.3 Flux d'achat

Apres que votre whisper a reussi (le personnage se teleporte), envoyez 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":"..."
    } ] } }

L'hote l'acquitte, emet eventuellement une progression, puis un unique resultat :

{ "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 est la recherche d'ou provient la mise en vente ; l'hote l'utilise pour lier l'achat au bon Trade Link (revient a la premiere recherche active si omis). Envoyez-le pour un comportement multi-recherches correct.
  • stashX/stashY sont les coordonnees de l'objet dans la boutique du vendeur ; w/h sa taille — ils pilotent le clic en jeu.
  • Le prix peut etre envoye a plat (currency/amount, comme ci-dessus) ou imbrique ("price":{"currency","amount"}) — l'hote accepte les deux.
  • hideoutToken n'est transporte que pour la journalisation (vous l'avez deja utilise pour le whisper).
  • Vous devez acquitter chaque buy_result : envoyez {"type":"ack","ackSeq":<buy_result.seq>}.

4.4 Evenements de l'etape whisper + logs (ext → host)

Resultats de l'etape whisper (gardez les logs de POEFixer complets) :

{ "type":"trade_event", "seq":8, "stage":"whisper", "outcome":"in_demand", "itemId":"...", "detail":"" }
// outcome ∈ in_demand | whisper_failed | teleport_failed | fetch_error

Un trade_event peut aussi transporter l'objet item complet (memes champs qu'un item de buy_request). teleport_failed = la mise en vente du vendeur etait toujours in demand meme apres un re-whisper force ; envoye avec son item, POEFixer l'enregistre dans les Trade Logs comme un Teleport Fail. fetch_error / whisper_failed / in_demand sont informatifs et vont dans les Logs generaux (categorie Trade).

Transmettez votre activite au log de POEFixer (recommande — tous les logs de l'extension devraient apparaitre dans le programme) :

{ "type":"log", "level":"info", "message":"" }   // shown in POEFixer Logs (category Trade)

Signalez l'etat du live-WS de chaque recherche pour que le Trade Link de POEFixer affiche Connecting…/Live :

{ "type":"search_status", "searchId":"", "state":"connected" }   // state ∈ connected | closed | error

4.5 Manual buy (host-driven bulk buy)

Lorsque l'utilisateur clique sur Manual Buy (l'icone panier) sur un Trade Link, l'hote envoie manual_buy ; votre extension effectue un achat en masse ponctuel de cette recherche et signale le cycle de vie/la progression avec manual_buy_status. Les achats par vendeur utilisent le flux buy_request ordinaire (§4.3) avec isLastGroup:false ; l'hote declenche le /hideout final une fois qu'il recoit state:"done".

// 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":"" }
  • Resolvez la recherche, recuperez les mises en vente correspondantes les moins cheres, appliquez filters, plafonnez a itemCount (0 = toutes), regroupez par vendeur, et achetez chaque groupe via buy_request (isLastGroup:false).
  • Envoyez manual_buy_status started au debut, progress au fur et a mesure que les groupes se terminent, et exactement un terminal done / cancelled / error.

4.6 Fiabilite

  • buy_request et trade_event portent un seq croissant ; l'hote les acquitte. Conservez les trames non acquittees et renvoyez-les a la reconnexion (triees par seq).
  • buy_request.id est la cle d'idempotence — un id renvoye retourne le buy_result enregistre (ou error: duplicate tant qu'il est encore en cours). Utilisez un id stable et unique par achat.
  • buy_result porte un seq que vous acquittez.

4.7 Erreurs

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

4.8 Client minimal (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. Depannage

  • Host: disconnected — POEFixer n'est pas lance, le pont n'est pas demarre, ou le port est incorrect. Demarrez le pont dans Settings → Trade ; faites correspondre le port dans le popup.
  • entitlement_required — votre licence ne dispose pas de la fonction Trade (payante sur le serveur).
  • not_in_game — POEFixer n'est pas attache/en jeu ; attendez status.ready.
  • Live search never fires — assurez-vous d'etre connecte au site d'echange dans le meme navigateur. L'extension ouvre automatiquement son propre onglet d'arriere-plan epingle par recherche et execute le live WebSocket a l'interieur de cette page ; le Trade Link affiche Connecting… puis Live. S'il reste sur Connecting…, ouvrez l'onglet epingle pour verifier que vous etes connecte.
  • Port in use — changez le port dans Settings → Trade et dans le popup, puis redemarrez le pont.

← Home

Clone this wiki locally