knuspermagier.de
Hallo. Ich bins! Philipp!

Amazon-Bestelldetails-Extraktor

Da ich gerne wissen wollte, was ich eigentlich so bei Amazon bestelle und das verlinkt mit den Transaktionen in Firefly speichern wollte, brauchte ich einen Weg um die Daten herauszubekommen. Leider hat Amazon dafür natürlich keine API, also suchte ich etwas halb-automatisches und bat, mal wieder, Claude um Hilfe. Mein Prozess ist nun folgendermaßen:

file://xp0ijexse3dtgrze
  1. Mittlerweile hat Amazon zum Glück die Order-ID mit in der Kreditkartenabbuchung drin. Daraus erzeugt mir Firefly automatisch den Link zu den Bestelldetails: https://www.amazon.de/gp/css/summary/edit.html?orderID=$orderId
  2. Ich drücke mein von Claude erzeugtes Bookmarklet1, dass mir ein JSON in die Zwischenablage speichert, in dem alle Daten drin sind
  3. Ich packe das JSON ins Notizfeld der Transaktion und Firefly erstellt daraus automatisch die entsprechenden Produkte und verlinkt sie damit.
  4. Das dauert pro Transaktion so drei Sekunden und funktioniert schon ein paar Wochen. Sollte Amazon das Markup ändern, ist es sicher auch schnell gefixt.
file://ii8lbxdcczce05me

1: Das Bookmarklet:

javascript:(function(){const cards=document.querySelectorAll('[data-component="orderCard"]');const items=[];cards.forEach(card=>{const shipments=card.querySelectorAll('[data-component="shipments"] > .a-box-group > .a-box');shipments.forEach(shipment=>{const statusEl=shipment.querySelector('.od-status-message span.a-text-bold');const isReturned=statusEl&&statusEl.textContent.includes('Rücksendung');const products=shipment.querySelectorAll('[data-component="purchasedItems"] .a-fixed-left-grid');products.forEach(product=>{const titleEl=product.querySelector('[data-component="itemTitle"] a');const imgEl=product.querySelector('[data-component="itemImage"] img');const priceEl=product.querySelector('[data-component="unitPrice"] .a-offscreen');if(titleEl){items.push({product_name:titleEl.textContent.trim(),product_link:'https://www.amazon.de'+titleEl.getAttribute('href').split('?%27)[0],price:priceEl?priceEl.textContent.trim():%27%27,has_been_returned:isReturned,image_url:imgEl?imgEl.getAttribute(%27src%27):%27%27});}});});});const json=JSON.stringify({items},null,2);navigator.clipboard.writeText(json).then(()=>alert(%27Copied %27+items.length+%27 items to clipboard!%27)).catch(e=>alert(%27Failed to copy: %27+e));})();

(Irgendwann finde ich wieder heraus, wie der Blog einen Clodeblock ordentlich formatiert darstellt)