PJF16

Amazon Umsatz

Jan 16th, 2018
307
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #In Chrome Popups für Amazon zulassen --> chrome://settings/content/popups?search=pop-ups
  2. # Eintrag [*.]amazon.de hinzufügen
  3.  
  4. #Auf Amazon.de einloggen
  5. # Strg + Shift + J drücken
  6. # Untenstehenden Code einfügen:
  7.  
  8. (function() {
  9.  
  10.     function getClassElement( node, name )
  11.     {
  12.         if (node == null)
  13.             return null;
  14.  
  15.         if( node.className == name ) return node;
  16.         for( var i = 0; i < node.childNodes.length; i++ )
  17.         {
  18.             var element = getClassElement( node.childNodes[ i ], name );
  19.             if( element ) return element;
  20.         }
  21.         return null;
  22.     }
  23.  
  24.     function getClassElements( node, name )
  25.     {
  26.         if (node == null)
  27.             return null;
  28.  
  29.         if( node.className == name ) return [ node ];
  30.         var elements = [];
  31.         for( var i = 0; i < node.childNodes.length; i++ )
  32.         {
  33.             elements = elements.concat( getClassElements( node.childNodes[ i ], name ) );
  34.         }
  35.         return elements;
  36.     }
  37.  
  38.     function getTagElement( node, name )
  39.     {
  40.         if( node.nodeName == name ) return node;
  41.         for( var i = 0; i < node.childNodes.length; i++ )
  42.         {
  43.             var child = getTagElement( node.childNodes[ i ], name );
  44.             if( child ) return child;
  45.         }
  46.         return null;
  47.     }
  48.  
  49.     function findOrders( doc, year, page )
  50.     {
  51.         var orderLevels = doc.getElementsByClassName( "order-info" );
  52.         var orderBars = doc.getElementsByClassName( "a-box-group a-spacing-base" );
  53.  
  54.         orders[ year ].pages[ page ].done = true;
  55.  
  56.         if( orderLevels.length != orderBars.length )
  57.         {
  58.             console.log( "Syntax Error " + year + "/" + page );
  59.             return;
  60.         }
  61.  
  62.         for( var i = 0; i < orderLevels.length; i++ )
  63.         {
  64.             var order = { "price" : "0,00", "date" : "?", "link" : "", "names" : [], "prices" : [], "products" : 0 , "recip" : ""};
  65.  
  66.             var priceElement = getClassElement( orderLevels[ i ], "a-column a-span2" );
  67.             if( priceElement )
  68.             {
  69.                 // sometimes there is no price listed next to the item anymore, so we have to check that and insert 0,00 if it's missing
  70.                 var price_tag = priceElement.getElementsByClassName('a-color-secondary value');
  71.                 if (price_tag.length > 0) {
  72.                     order.price = priceElement.getElementsByClassName('a-color-secondary value')[0].innerHTML.replace(/EUR/,"").replace(/Summe/,"").replace(/.*coins/i,"0,00").trim();
  73.                 }
  74.                 else {
  75.                     order.price = "0,00";
  76.                 }
  77.             }
  78.             else
  79.             {
  80.                 console.log( "No price found " + year + "/" + page );
  81.             }
  82.  
  83.             var recipElement = getClassElement( orderLevels[ i ], "a-column a-span6 recipient a-span-last" );
  84.             if( recipElement )
  85.             {
  86.                 var recip_tag = recipElement.getElementsByClassName('trigger-text');
  87.                 if (recip_tag.length > 0) {
  88.                     order.recip = recipElement.getElementsByClassName('trigger-text')[0].innerHTML.trim();
  89.                 }
  90.                 else {
  91.                     order.recip = "?";
  92.                 }
  93.             }
  94.             else
  95.             {
  96.                 console.log( "No recipient found " + year + "/" + page );
  97.             }
  98.  
  99.             var dateElement = getClassElement( orderLevels[ i ], "a-color-secondary value" );
  100.             if( dateElement )
  101.             {
  102.                 order.date = dateElement.innerHTML.trim();
  103.             }
  104.             else
  105.             {
  106.                 console.log( "No date found " + year + "/" + page );
  107.             }
  108.  
  109.             var linkElement = orderLevels[ i ].getElementsByTagName('a')[1];
  110.             if( linkElement )
  111.             {
  112.                 order.link = linkElement.href;
  113.             }
  114.             else
  115.             {
  116.                 console.log( "No link found " + year + "/" + page );
  117.             }
  118.  
  119.             var nameElements = getClassElements( orderBars[ i ], "a-fixed-left-grid-col a-col-right" );
  120.             if( nameElements.length > 0 )
  121.             {
  122.                 var names = [];
  123.                 var prices = [];
  124.  
  125.                 for( var j = 0; j < nameElements.length; j++ )
  126.                 {
  127.                     // sometimes there is no link to the item, then we have to fetch the name of the item from the div tag
  128.                     var a_tags = nameElements[ j ].getElementsByTagName('A');
  129.                     if (a_tags.length > 0) {
  130.                         names.push( nameElements[ j ].getElementsByTagName('A')[0].innerHTML.trim() );
  131.                     }
  132.                     else {
  133.                         names.push( nameElements[ j ].getElementsByTagName('DIV')[0].innerHTML.trim() );
  134.                     }
  135.  
  136.                     var a_price = getClassElement(nameElements[j],'a-size-small a-color-price');
  137.                     if (a_price) {
  138.                         prices.push(a_price.textContent.trim());
  139.                     }
  140.                 }
  141.                 order.names = names;
  142.                 order.prices = prices;
  143.                 order.products = names.length;
  144.             }
  145.             else
  146.             {
  147.                 console.log( "No names found " + year + "/" + page );
  148.             }
  149.  
  150.             orders[ year ].pages[ page ].entries.push( order );
  151.         }
  152.     }
  153.  
  154.     function findShipments(doc, year, page) {
  155.         var orderElements = doc.getElementsByClassName('a-box-group a-spacing-base');
  156.         for (var i = 0; i < orderElements.length; i++) {
  157.  
  158.             var orderNumber = "";
  159.             var orderPrice = "";
  160.             var orderDate = "";
  161.  
  162.             var orderInfo = orderElements[i].getElementsByClassName('order-info');
  163.             if (orderInfo.length == 1) {
  164.  
  165.                 var colRight = orderInfo[0].getElementsByClassName('a-col-right');
  166.                 if (colRight.length == 1 ) {
  167.                     var orderNrElements = colRight[0].getElementsByClassName('a-color-secondary value');
  168.                     if (orderNrElements.length > 0) {
  169.                         orderNumber = orderNrElements[0].textContent.trim();
  170.                     }
  171.                     else {
  172.                         console.log('No order number found ' + year + '/' + page);
  173.                     }
  174.                 }
  175.                 else {
  176.                     console.log('No order number found ' + year + '/' + page);
  177.                 }
  178.  
  179.                 var priceElement = getClassElement(orderElements[i], 'a-column a-span2');
  180.                 if (priceElement) {
  181.                     var price_tag = priceElement.getElementsByClassName('a-color-secondary value');
  182.                     if (price_tag.length > 0) {
  183.                         orderPrice = priceElement.getElementsByClassName('a-color-secondary value')[0].innerHTML.replace(/EUR/, '').replace(/Summe/, '').replace(/.*coins/i, '0,00').trim();
  184.                     } else {
  185.                         orderPrice = '0,00';
  186.                     }
  187.                 } else {
  188.                     console.log('No price found ' + year + '/' + page);
  189.                 }
  190.  
  191.                 var dateElement = getClassElement(orderElements[i], 'a-color-secondary value');
  192.                 if (dateElement) {
  193.                     orderDate = dateElement.innerHTML.trim();
  194.                 } else {
  195.                     console.log('No date found ' + year + '/' + page);
  196.                 }
  197.             }
  198.  
  199.             // walking through shipments of the order
  200.             var shipmentElements = orderElements[i].getElementsByClassName('a-box shipment');
  201.             for (var s = 0; s < shipmentElements.length; s++) {
  202.                 var shipment = {
  203.                     'orderNumber' : orderNumber,
  204.                     'orderPrice' : orderPrice,
  205.                     'orderDate' : orderDate,
  206.                     'date' : '?',
  207.                     'names': [],
  208.                     'prices': [],
  209.                     'price': 0,
  210.                     'products': 0
  211.                 };
  212.  
  213.                 // finding shipment date:
  214.                 var topRowElement = getClassElement(shipmentElements[s], 'a-row shipment-top-row')
  215.                 var dateElement = getClassElement(topRowElement,'a-size-medium a-color-base a-text-bold');
  216.                 if (dateElement) {
  217.                     shipment.date = dateElement.innerHTML.trim();
  218.                 } else {
  219.                     console.log('No shipment date found ' + year + '/' + page);
  220.                 }
  221.  
  222.                 // finding Items of the shipment
  223.                 var nameElements = getClassElements(shipmentElements[s], 'a-fixed-left-grid-col a-col-right');
  224.                 if (nameElements.length > 0) {
  225.                     var names = [];
  226.                     var prices = [];
  227.                     var totalCent = 0;
  228.                     var totalCount = 0;
  229.                     var priceNotFound = false;
  230.  
  231.                     for (var j = 0; j < nameElements.length; j++) {
  232.                         var a_tags = nameElements[j].getElementsByTagName('A');
  233.                         if (a_tags.length > 0) {
  234.                             names.push(nameElements[j].getElementsByTagName('A')[0].innerHTML.trim());
  235.                         } else {
  236.                             names.push(nameElements[j].getElementsByTagName('DIV')[0].innerHTML.trim());
  237.                         }
  238.  
  239.                         var qty = getClassElement(nameElements[j].parentElement, 'item-view-qty');
  240.                         if (qty) {
  241.                             qty = parseInt ( qty.textContent.trim());
  242.                             if (isNaN(qty)) {
  243.                                 qty = 1;
  244.                             }
  245.                         }
  246.                         else {
  247.                             qty = 1;
  248.                         }
  249.  
  250.                         var a_price = getClassElement(nameElements[j],'a-size-small a-color-price');
  251.                         if (a_price) {
  252.                             var priceStr = a_price.textContent.trim();
  253.                             prices.push(priceStr);
  254.                             var price = priceStr.replace(/EUR/,"").replace(/Summe/,"").replace(/.*coins/i,"0,00").trim().replace(/\./,"").split( "," );
  255.                             var centPrice = parseInt( price[ 0 ] ) * 100 + parseInt( price[ 1 ] );
  256.                             if (isNaN(centPrice))
  257.                                 priceNotFound = true;
  258.                             else
  259.                                 totalCent += centPrice * qty;
  260.                         }
  261.  
  262.                         totalCount += qty;
  263.                     }
  264.                     shipment.names = names;
  265.                     shipment.prices = prices;
  266.                     shipment.products = totalCount;
  267.  
  268.                     if (shipmentElements.length == 1) {
  269.                         shipment.price = orderPrice;
  270.                     }
  271.                     else {
  272.                         shipment.price = getEuroString(totalCent / 100);
  273.                         if (priceNotFound)
  274.                             shipment.price = '*' + shipment.price ;
  275.                     }
  276.                 } else {
  277.                     console.log('No item names in shpiment found ' + year + '/' + page);
  278.                 }
  279.                 shipments.push(shipment);
  280.             }
  281.         }
  282.     }
  283.  
  284.     function printState()
  285.     {
  286.         var s = "";
  287.         for( var i = 0; i < orders.length; i++ )
  288.         {
  289.             s += orders[ i ].year + ":";
  290.             if( orders[ i ].pages.length == 0 )
  291.             {
  292.                 s += " waiting...";
  293.             }
  294.             for( var j = 0; j < orders[ i ].pages.length; j++ )
  295.             {
  296.                 s += " " + ( orders[ i ].pages[ j ].done ? "X" : "." );
  297.             }
  298.             s += "\n";
  299.         }
  300.  
  301.         document.body.innerHTML = "<pre>" + s + "</pre>";
  302.     }
  303.  
  304.     function getEuroString( x )
  305.     {
  306.         var eurocent = ( x.toFixed( 2 ) + "" ).split( "." );
  307.         var euro = eurocent[ 0 ];
  308.         var euroTsd = "";
  309.  
  310.         for( var i = 0; i < euro.length - 1; i++ )
  311.         {
  312.             euroTsd += euro.charAt( i );
  313.             if( ( ( euro.length - i ) % 3 ) == 1 )
  314.             {
  315.                 euroTsd += ".";
  316.             }
  317.         }
  318.         euroTsd += euro.charAt( euro.length - 1 );
  319.  
  320.         return euroTsd + "," + eurocent[ 1 ];
  321.     }
  322.  
  323.     function getOverviewLine( data )
  324.     {
  325.         return "<tr>" +
  326.             "<td align=\"right\">" + data.name + "</td>" +
  327.             "<td align=\"right\">" + getEuroString( data.cent / 100 ) + "</td>" +
  328.             "<td align=\"right\">" + data.orders + "</td>" +
  329.             "<td align=\"right\">" + data.products + "</td>" +
  330.             "<td align=\"right\">" + getEuroString( data.cent / 100 / data.products ) + "</td>" +
  331.             "<td align=\"right\">" + getEuroString( data.cent / 100 / data.month ) + "</td>" +
  332.             "</tr>";
  333.     }
  334.  
  335.     function getOrderLine( data )
  336.     {
  337.         var nameList = "<ul style=\"margin:0; padding:0 0 0 2em\">";
  338.         for( var i = 0; i < data.names.length; i++ )
  339.         {
  340.             nameList += '<li>' + data.names[ i ] +  ' | ' + data.prices[ i ] + '</li>';
  341.         }
  342.         nameList += "</ul>";
  343.  
  344.         return "<tr>" +
  345.             "<td align=\"center\" valign=\"top\"><a href=\"" + data.link + "\">Link</a></td>" +
  346.             "<td align=\"right\" valign=\"top\">" + data.date + "</td>" +
  347.             "<td align=\"center\" valign=\"top\">" + data.products + "</td>" +
  348.             "<td align=\"right\" valign=\"top\">" + data.price + "</td>" +
  349.             "<td align=\"left\" valign=\"top\">" + data.recip + "</td>" +
  350.             "<td align=\"left\" valign=\"top\">" + nameList + "</td>" +
  351.             "</tr>";
  352.     }
  353.  
  354.     function getShipmentLine( shipment )
  355.     {
  356.         var nameList = "";
  357.         for( var i = 0; i < shipment.names.length; i++ ) {
  358.             nameList += shipment.names[ i ] +  ' | ' + shipment.prices[ i ] + ' # ';
  359.         }
  360.  
  361.         return "<tr>" +
  362.             "<td align=\"center\" valign=\"top\">" + shipment.orderNumber + "</td>" +
  363.             "<td align=\"right\" valign=\"top\">" + shipment.orderDate + "</td>" +
  364.             "<td align=\"center\" valign=\"top\">" + shipment.orderPrice + "</td>" +
  365.             "<td align=\"right\" valign=\"top\">" + shipment.date + "</td>" +
  366.             "<td align=\"left\" valign=\"top\">" + shipment.products + "</td>" +
  367.             "<td align=\"left\" valign=\"top\">" + shipment.price + "</td>" +
  368.             "<td align=\"left\" valign=\"top\">" + nameList + "</td>" +
  369.             "</tr>";
  370.     }
  371.  
  372.  
  373.     function printOrders()
  374.     {
  375.         var now = new Date();
  376.         var thisYear = "" + ( 1900 + now.getYear() );
  377.         var thisYearMonthCount = now.getMonth() + 1;
  378.  
  379.         var allOrders = [];
  380.         var years = [];
  381.         var overall = { "name" : "Insg.", "cent" : 0, "orders" : 0, "products" : 0, "month" : 0 };
  382.  
  383.         for( var i = 0; i < orders.length; i++ )
  384.         {
  385.             var yearStr = orders[ i ].year.substr( 5 );
  386.             var year = { "name" : yearStr, "cent" : 0, "orders" : 0, "products" : 0, "month" : ( yearStr == thisYear ? thisYearMonthCount : 12 ) };
  387.  
  388.             for( var j = 0; j < orders[ i ].pages.length; j++ )
  389.             {
  390.                 for( var k = 0; k < orders[ i ].pages[ j ].entries.length; k++ )
  391.                 {
  392.                     var entry = orders[ i ].pages[ j ].entries[ k ];
  393.  
  394.                     var price = entry.price.replace(/\./,"").split( "," );
  395.                     var cent = parseInt( price[ 0 ] ) * 100 + parseInt( price[ 1 ] );
  396.  
  397.                     year.cent += cent;
  398.                     year.products += entry.products;
  399.                     year.orders++;
  400.  
  401.                     allOrders.push( entry );
  402.                 }
  403.             }
  404.  
  405.             overall.cent += year.cent;
  406.             overall.products += year.products;
  407.             overall.orders += year.orders;
  408.             overall.month += year.month;
  409.  
  410.             years.push( year );
  411.         }
  412.  
  413.         var text = "<h2>Uebersicht</h2>";
  414.  
  415.         text += "<table cellspacing=\"0\" cellpadding=\"4\" border=\"1\"><tr>" +
  416.             "<th>Jahr</th>" +
  417.             "<th>Euro</th>" +
  418.             "<th>Bestell.</th>" +
  419.             "<th>Produkte</th>" +
  420.             "<th>Euro/Prod.</th>" +
  421.             "<th>Euro/Monat</th>" +
  422.             "</tr>";
  423.  
  424.         text += getOverviewLine( overall );
  425.         for( var i = 0; i < years.length; i++ )
  426.         {
  427.             text += getOverviewLine( years[ i ] );
  428.         }
  429.         text += "</table>";
  430.  
  431.         text += "<h2>Einzel-Bestellungen</h2>";
  432.  
  433.         text += "<table cellspacing=\"0\" cellpadding=\"4\" border=\"1\"><tr>" +
  434.             "<th>Link</th>" +
  435.             "<th>Datum</th>" +
  436.             "<th>Produkte</th>" +
  437.             "<th>Preis</th>" +
  438.             "<th>Versandadresse</th>" +
  439.             "<th>Produktbeschreibungen</th>" +
  440.             "</tr>";
  441.  
  442.         for( var i = 0; i < allOrders.length; i++ )
  443.         {
  444.             text += getOrderLine( allOrders[ i ] );
  445.         }
  446.         text += "</table>";
  447.  
  448.         text += "<h2>Lieferungen</h2>";
  449.  
  450.         text += "<table cellspacing=\"0\" cellpadding=\"4\" border=\"1\"><tr>" +
  451.             "<th>Bestellnummer</th>" +
  452.             "<th>Bestelldatum</th>" +
  453.             "<th>Bestellsumme</th>" +
  454.             "<th>Lieferdatum</th>" +
  455.             "<th>Anzahl Produkte</th>" +
  456.             "<th>Summe / Abbuchung</th>" +
  457.             "<th>Produkte | Preis</th>" +
  458.             "</tr>";
  459.  
  460.         for( var i = 0; i < shipments.length; i++ )
  461.         {
  462.             text += getShipmentLine( shipments[ i ] );
  463.         }
  464.         text += "</table>";
  465.  
  466.         document.body.innerHTML = text;
  467.     }
  468.  
  469.     function loadOrders( event )
  470.     {
  471.         if( event.currentTarget.onlyOnce )
  472.         {
  473.             return;
  474.         }
  475.         event.currentTarget.onlyOnce = true;
  476.  
  477.         findOrders( event.currentTarget.document, event.currentTarget.yearIndex, event.currentTarget.pageIndex );
  478.         findShipments( event.currentTarget.document, event.currentTarget.yearIndex, event.currentTarget.pageIndex );
  479.  
  480.         event.currentTarget.close();
  481.     }
  482.  
  483.     function loadYear( event )
  484.     {
  485.         if( event.currentTarget.onlyOnce )
  486.         {
  487.             return;
  488.         }
  489.         event.currentTarget.onlyOnce = true;
  490.  
  491.         var doc = event.currentTarget.document;
  492.         var as = doc.getElementsByTagName( "a" );
  493.         var maxIndex = 0;
  494.         for( var i = 0; i < as.length; i++ )
  495.         {
  496.             if( as[ i ].href.match( /startIndex=(\d+)/ ) )
  497.             {
  498.                 maxIndex = Math.max( maxIndex, parseInt( RegExp.$1 ) );
  499.             }
  500.         }
  501.  
  502.         var year = event.currentTarget.yearIndex;
  503.  
  504.         for( var i = 0; i <= maxIndex; i += 10 )
  505.         {
  506.             orders[ year ].pages.push( { "done" : false, "entries" : [] } );
  507.         }
  508.  
  509.         findOrders( doc, year, 0 );
  510.         findShipments( doc, year, 0 );
  511.  
  512.         var pageUri = "https://www.amazon.de/gp/css/order-history/gp/css/order-history/ref=oss_pagination?ie=UTF8&orderFilter=" +
  513.             orders[ year ].year + "&search=&startIndex=";
  514.  
  515.         var pageIndex = 1;
  516.         for( var i = 10; i <= maxIndex; i += 10 )
  517.         {
  518.             var pageTab = window.open( pageUri + i );
  519.             pageTab.yearIndex = year;
  520.             pageTab.pageIndex = pageIndex;
  521.             pageTab.addEventListener( "load", loadOrders, true );
  522.  
  523.             pageIndex++;
  524.         }
  525.  
  526.         event.currentTarget.close();
  527.     }
  528.  
  529.     function loadYearCount( event )
  530.     {
  531.         if( event.currentTarget.onlyOnce )
  532.         {
  533.             return;
  534.         }
  535.         event.currentTarget.onlyOnce = true;
  536.  
  537.         var doc = event.currentTarget.document;
  538.         var form = doc.getElementsByClassName('time-period-chooser a-spacing-none')[0];
  539.         var filter = doc.getElementsByName('orderFilter')[0];
  540.  
  541.         for( var i = 0; i < filter.options.length; i++ )
  542.         {
  543.             var regex = /year-(\d\d\d\d)/;
  544.             if( regex.exec( filter.options[ i ].value ) )
  545.             {
  546.                 orders.push( { "year" : filter.options[ i ].value, "pages" : [] } );
  547.             }
  548.         }
  549.  
  550.         //orders.splice( 0, orders.length - 2 );
  551.  
  552.         var yearUri = "https://www.amazon.de/gp/css/order-history?";
  553.         for( var i = 0; i < form.elements.length; i++ )
  554.         {
  555.             var element = form.elements[ i ];
  556.             if( element == filter )
  557.             {
  558.                 continue;
  559.             }
  560.  
  561.             yearUri += encodeURIComponent( element.name ) + "=" + encodeURIComponent( element.value ) + "&";
  562.         }
  563.         yearUri += "orderFilter=";
  564.         //alert( yearUri );
  565.  
  566.         for( var i = 0; i < orders.length; i++ )
  567.         {
  568.             var yearTab = window.open( yearUri + orders[ i ].year );
  569.             yearTab.yearIndex = i;
  570.             yearTab.addEventListener( "load", loadYear, true );
  571.         }
  572.  
  573.         waitInterval = setInterval( waitForFinish, 1000 );
  574.  
  575.         event.currentTarget.close();
  576.     }
  577.  
  578.     function waitForFinish()
  579.     {
  580.         printState();
  581.  
  582.         for( var i = 0; i < orders.length; i++ )
  583.         {
  584.             if( orders[ i ].pages.length == 0 )
  585.             {
  586.                 return;
  587.             }
  588.             for( var j = 0; j < orders[ i ].pages.length; j++ )
  589.             {
  590.                 if( !orders[ i ].pages[ j ].done )
  591.                 {
  592.                     return;
  593.                 }
  594.             }
  595.         }
  596.  
  597.         clearInterval( waitInterval );
  598.         printOrders();
  599.     }
  600.  
  601.     var orders = [];
  602.     var shipments = [];
  603.     var waitInterval;
  604.  
  605.     var mainTab = window.open("https://www.amazon.de/gp/css/order-history/ref=ya_orders_css");
  606.     mainTab.addEventListener( "load", loadYearCount, true );
  607.  
  608. })();
Advertisement
Add Comment
Please, Sign In to add comment