diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..485dee6 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea diff --git a/README.md b/README.md index a4eabd7..12a7ad7 100644 --- a/README.md +++ b/README.md @@ -9,27 +9,17 @@ About JavaScript, um eine tabellarische Übersicht aller auf amazon.de getätigten Bestellungen zu erhalten. -Original Idee und Thread: -https://ngb.to/threads/1525-Amazon-Bestellungen-Exportieren-(the-hard-way) - -Anleitung von hier: -http://jhein.de/2013/08/04/liste-mit-amazon-bestellungen-exportieren/ - How To -- * Auf Amazon.de einloggen -* Developer-Tools des Browsers (z.B. [Chrome](https://developer.chrome.com/devtools/docs/console), [Firefox](https://developer.mozilla.org/en-US/docs/Tools/Web_Console) oder [Safari](https://developer.apple.com/safari/tools/)) öffnen -* kompletten Inhalt des Scripts in die Javascript-Konsole kopieren -* Enter-Taste betätigen - -Oder einfach das [Bookmarklet](amazonparser-bookmarklet.html) verwenden. +* Git-Repo clonen +* Chrome Extentions öffnen +* "Load unpacked extension" anklicken und geclontes Verzeichnis angeben Hinweise -- * Im Browser müssen für amazon.de (oder generell) Popups erlaubt werden. -* Unter Firefox muss in den erweiterten Einstellungen (*about:config*) die Einstellung *dom.popup_maximum* auf einen ausreichend hohen Wert (z.B. 100) gesetzt werden. * Achtung! Das ist nichts für schwache Rechner. Je nach Umfang der Bestellhistorie werden dutzende Tabs/Fenster geöffnet und deren Inhalt gecrawlt. Bei einer extrem umfangreichen Bestellhistorie kann der Browser durchaus auch abstürzen. -* Dieses Skript funktioniert nicht unter IE. Chrome 37 stürzt mitten in der Durchführung ab. Mit Chrome 35 hat es noch funktioniert. \ No newline at end of file diff --git a/amazonparser-bookmarklet.html b/amazonparser-bookmarklet.html deleted file mode 100644 index 9e3119e..0000000 --- a/amazonparser-bookmarklet.html +++ /dev/null @@ -1,10 +0,0 @@ - -amazon-parser Bookmarklet - -

amazon-parser Bookmarklet

-

-Einfach den folgenden Link als Lesezeichen abspeichern oder mit der Maus in die Lesezeichenleiste ziehen: Amazon Bestellhistorie -

-

Dann einfach bei Amazon.de einloggen und das Lesezeichen aufrufen.

- - \ No newline at end of file diff --git a/amazonparser.js b/amazonparser.js index e0da4f0..49dec7d 100644 --- a/amazonparser.js +++ b/amazonparser.js @@ -1,597 +1,601 @@ -function getClassElement( node, name ) -{ - if (node == null) - return null; - - if( node.className == name ) return node; - for( var i = 0; i < node.childNodes.length; i++ ) - { - var element = getClassElement( node.childNodes[ i ], name ); - if( element ) return element; - } - return null; -} - -function getClassElements( node, name ) -{ - if (node == null) - return null; - - if( node.className == name ) return [ node ]; - var elements = []; - for( var i = 0; i < node.childNodes.length; i++ ) - { - elements = elements.concat( getClassElements( node.childNodes[ i ], name ) ); - } - return elements; -} +(function() { -function getTagElement( node, name ) -{ - if( node.nodeName == name ) return node; - for( var i = 0; i < node.childNodes.length; i++ ) + function getClassElement( node, name ) { - var child = getTagElement( node.childNodes[ i ], name ); - if( child ) return child; - } - return null; -} - -function findOrders( doc, year, page ) -{ - var orderLevels = doc.getElementsByClassName( "order-info" ); - var orderBars = doc.getElementsByClassName( "a-box-group a-spacing-base" ); + if (node == null) + return null; - orders[ year ].pages[ page ].done = true; - - if( orderLevels.length != orderBars.length ) - { - console.log( "Syntax Error " + year + "/" + page ); - return; + if( node.className == name ) return node; + for( var i = 0; i < node.childNodes.length; i++ ) + { + var element = getClassElement( node.childNodes[ i ], name ); + if( element ) return element; + } + return null; } - for( var i = 0; i < orderLevels.length; i++ ) + function getClassElements( node, name ) { - var order = { "price" : "0,00", "date" : "?", "link" : "", "names" : [], "prices" : [], "products" : 0 , "recip" : ""}; + if (node == null) + return null; - var priceElement = getClassElement( orderLevels[ i ], "a-column a-span2" ); - if( priceElement ) + if( node.className == name ) return [ node ]; + var elements = []; + for( var i = 0; i < node.childNodes.length; i++ ) { - // 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 - var price_tag = priceElement.getElementsByClassName('a-color-secondary value'); - if (price_tag.length > 0) { - order.price = priceElement.getElementsByClassName('a-color-secondary value')[0].innerHTML.replace(/EUR/,"").replace(/Summe/,"").replace(/.*coins/i,"0,00").trim(); - } - else { - order.price = "0,00"; - } - } - else - { - console.log( "No price found " + year + "/" + page ); + elements = elements.concat( getClassElements( node.childNodes[ i ], name ) ); } + return elements; + } - var recipElement = getClassElement( orderLevels[ i ], "a-column a-span6 recipient a-span-last" ); - if( recipElement ) - { - var recip_tag = recipElement.getElementsByClassName('trigger-text'); - if (recip_tag.length > 0) { - order.recip = recipElement.getElementsByClassName('trigger-text')[0].innerHTML.trim(); - } - else { - order.recip = "?"; - } - } - else - { - console.log( "No recipient found " + year + "/" + page ); - } - - var dateElement = getClassElement( orderLevels[ i ], "a-color-secondary value" ); - if( dateElement ) - { - order.date = dateElement.innerHTML.trim(); - } - else + function getTagElement( node, name ) + { + if( node.nodeName == name ) return node; + for( var i = 0; i < node.childNodes.length; i++ ) { - console.log( "No date found " + year + "/" + page ); + var child = getTagElement( node.childNodes[ i ], name ); + if( child ) return child; } + return null; + } - var linkElement = orderLevels[ i ].getElementsByTagName('a')[1]; - if( linkElement ) - { - order.link = linkElement.href; - } - else + function findOrders( doc, year, page ) + { + var orderLevels = doc.getElementsByClassName( "order-info" ); + var orderBars = doc.getElementsByClassName( "a-box-group a-spacing-base" ); + + orders[ year ].pages[ page ].done = true; + + if( orderLevels.length != orderBars.length ) { - console.log( "No link found " + year + "/" + page ); + console.log( "Syntax Error " + year + "/" + page ); + return; } - var nameElements = getClassElements( orderBars[ i ], "a-fixed-left-grid-col a-col-right" ); - if( nameElements.length > 0 ) + for( var i = 0; i < orderLevels.length; i++ ) { - var names = []; - var prices = []; - - for( var j = 0; j < nameElements.length; j++ ) + var order = { "price" : "0,00", "date" : "?", "link" : "", "names" : [], "prices" : [], "products" : 0 , "recip" : ""}; + + var priceElement = getClassElement( orderLevels[ i ], "a-column a-span2" ); + if( priceElement ) { - // sometimes there is no link to the item, then we have to fetch the name of the item from the div tag - var a_tags = nameElements[ j ].getElementsByTagName('A'); - if (a_tags.length > 0) { - names.push( nameElements[ j ].getElementsByTagName('A')[0].innerHTML.trim() ); + // 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 + var price_tag = priceElement.getElementsByClassName('a-color-secondary value'); + if (price_tag.length > 0) { + order.price = priceElement.getElementsByClassName('a-color-secondary value')[0].innerHTML.replace(/EUR/,"").replace(/Summe/,"").replace(/.*coins/i,"0,00").trim(); } else { - names.push( nameElements[ j ].getElementsByTagName('DIV')[0].innerHTML.trim() ); - } - - var a_price = getClassElement(nameElements[j],'a-size-small a-color-price'); - if (a_price) { - prices.push(a_price.textContent.trim()); + order.price = "0,00"; } } - order.names = names; - order.prices = prices; - order.products = names.length; - } - else - { - console.log( "No names found " + year + "/" + page ); - } - - orders[ year ].pages[ page ].entries.push( order ); - } -} - -function findShipments(doc, year, page) { - var orderElements = doc.getElementsByClassName('a-box-group a-spacing-base'); - for (var i = 0; i < orderElements.length; i++) { - - var orderNumber = ""; - var orderPrice = ""; - var orderDate = ""; - - var orderInfo = orderElements[i].getElementsByClassName('order-info'); - if (orderInfo.length == 1) { - - var colRight = orderInfo[0].getElementsByClassName('a-col-right'); - if (colRight.length == 1 ) { - var orderNrElements = colRight[0].getElementsByClassName('a-color-secondary value'); - if (orderNrElements.length > 0) { - orderNumber = orderNrElements[0].textContent.trim(); - } - else { - console.log('No order number found ' + year + '/' + page); - } - } - else { - console.log('No order number found ' + year + '/' + page); + else + { + console.log( "No price found " + year + "/" + page ); } - var priceElement = getClassElement(orderElements[i], 'a-column a-span2'); - if (priceElement) { - var price_tag = priceElement.getElementsByClassName('a-color-secondary value'); - if (price_tag.length > 0) { - orderPrice = priceElement.getElementsByClassName('a-color-secondary value')[0].innerHTML.replace(/EUR/, '').replace(/Summe/, '').replace(/.*coins/i, '0,00').trim(); - } else { - orderPrice = '0,00'; + var recipElement = getClassElement( orderLevels[ i ], "a-column a-span6 recipient a-span-last" ); + if( recipElement ) + { + var recip_tag = recipElement.getElementsByClassName('trigger-text'); + if (recip_tag.length > 0) { + order.recip = recipElement.getElementsByClassName('trigger-text')[0].innerHTML.trim(); + } + else { + order.recip = "?"; } - } else { - console.log('No price found ' + year + '/' + page); + } + else + { + console.log( "No recipient found " + year + "/" + page ); } - var dateElement = getClassElement(orderElements[i], 'a-color-secondary value'); - if (dateElement) { - orderDate = dateElement.innerHTML.trim(); - } else { - console.log('No date found ' + year + '/' + page); + var dateElement = getClassElement( orderLevels[ i ], "a-color-secondary value" ); + if( dateElement ) + { + order.date = dateElement.innerHTML.trim(); + } + else + { + console.log( "No date found " + year + "/" + page ); } - } - // walking through shipments of the order - var shipmentElements = orderElements[i].getElementsByClassName('a-box shipment'); - for (var s = 0; s < shipmentElements.length; s++) { - var shipment = { - 'orderNumber' : orderNumber, - 'orderPrice' : orderPrice, - 'orderDate' : orderDate, - 'date' : '?', - 'names': [], - 'prices': [], - 'price': 0, - 'products': 0 - }; - - // finding shipment date: - var topRowElement = getClassElement(shipmentElements[s], 'a-row shipment-top-row') - var dateElement = getClassElement(topRowElement,'a-size-medium a-color-base a-text-bold'); - if (dateElement) { - shipment.date = dateElement.innerHTML.trim(); - } else { - console.log('No shipment date found ' + year + '/' + page); + var linkElement = orderLevels[ i ].getElementsByTagName('a')[1]; + if( linkElement ) + { + order.link = linkElement.href; + } + else + { + console.log( "No link found " + year + "/" + page ); } - // finding Items of the shipment - var nameElements = getClassElements(shipmentElements[s], 'a-fixed-left-grid-col a-col-right'); - if (nameElements.length > 0) { + var nameElements = getClassElements( orderBars[ i ], "a-fixed-left-grid-col a-col-right" ); + if( nameElements.length > 0 ) + { var names = []; var prices = []; - var totalCent = 0; - var totalCount = 0; - var priceNotFound = false; - - for (var j = 0; j < nameElements.length; j++) { - var a_tags = nameElements[j].getElementsByTagName('A'); + + for( var j = 0; j < nameElements.length; j++ ) + { + // sometimes there is no link to the item, then we have to fetch the name of the item from the div tag + var a_tags = nameElements[ j ].getElementsByTagName('A'); if (a_tags.length > 0) { - names.push(nameElements[j].getElementsByTagName('A')[0].innerHTML.trim()); - } else { - names.push(nameElements[j].getElementsByTagName('DIV')[0].innerHTML.trim()); + names.push( nameElements[ j ].getElementsByTagName('A')[0].innerHTML.trim() ); } - - var qty = getClassElement(nameElements[j].parentElement, 'item-view-qty'); - if (qty) { - qty = parseInt ( qty.textContent.trim()); - if (isNaN(qty)) { - qty = 1; - } - } - else { - qty = 1; - } - - var a_price = getClassElement(nameElements[j],'a-size-small a-color-price'); + else { + names.push( nameElements[ j ].getElementsByTagName('DIV')[0].innerHTML.trim() ); + } + + var a_price = getClassElement(nameElements[j],'a-size-small a-color-price'); if (a_price) { - var priceStr = a_price.textContent.trim(); - prices.push(priceStr); - var price = priceStr.replace(/EUR/,"").replace(/Summe/,"").replace(/.*coins/i,"0,00").trim().replace(/\./,"").split( "," ); - var centPrice = parseInt( price[ 0 ] ) * 100 + parseInt( price[ 1 ] ); - if (isNaN(centPrice)) - priceNotFound = true; - else - totalCent += centPrice * qty; + prices.push(a_price.textContent.trim()); + } + } + order.names = names; + order.prices = prices; + order.products = names.length; + } + else + { + console.log( "No names found " + year + "/" + page ); + } + + orders[ year ].pages[ page ].entries.push( order ); + } + } + + function findShipments(doc, year, page) { + var orderElements = doc.getElementsByClassName('a-box-group a-spacing-base'); + for (var i = 0; i < orderElements.length; i++) { + + var orderNumber = ""; + var orderPrice = ""; + var orderDate = ""; + + var orderInfo = orderElements[i].getElementsByClassName('order-info'); + if (orderInfo.length == 1) { + + var colRight = orderInfo[0].getElementsByClassName('a-col-right'); + if (colRight.length == 1 ) { + var orderNrElements = colRight[0].getElementsByClassName('a-color-secondary value'); + if (orderNrElements.length > 0) { + orderNumber = orderNrElements[0].textContent.trim(); + } + else { + console.log('No order number found ' + year + '/' + page); + } + } + else { + console.log('No order number found ' + year + '/' + page); + } + + var priceElement = getClassElement(orderElements[i], 'a-column a-span2'); + if (priceElement) { + var price_tag = priceElement.getElementsByClassName('a-color-secondary value'); + if (price_tag.length > 0) { + orderPrice = priceElement.getElementsByClassName('a-color-secondary value')[0].innerHTML.replace(/EUR/, '').replace(/Summe/, '').replace(/.*coins/i, '0,00').trim(); + } else { + orderPrice = '0,00'; + } + } else { + console.log('No price found ' + year + '/' + page); + } + + var dateElement = getClassElement(orderElements[i], 'a-color-secondary value'); + if (dateElement) { + orderDate = dateElement.innerHTML.trim(); + } else { + console.log('No date found ' + year + '/' + page); + } + } + + // walking through shipments of the order + var shipmentElements = orderElements[i].getElementsByClassName('a-box shipment'); + for (var s = 0; s < shipmentElements.length; s++) { + var shipment = { + 'orderNumber' : orderNumber, + 'orderPrice' : orderPrice, + 'orderDate' : orderDate, + 'date' : '?', + 'names': [], + 'prices': [], + 'price': 0, + 'products': 0 + }; + + // finding shipment date: + var topRowElement = getClassElement(shipmentElements[s], 'a-row shipment-top-row') + var dateElement = getClassElement(topRowElement,'a-size-medium a-color-base a-text-bold'); + if (dateElement) { + shipment.date = dateElement.innerHTML.trim(); + } else { + console.log('No shipment date found ' + year + '/' + page); + } + + // finding Items of the shipment + var nameElements = getClassElements(shipmentElements[s], 'a-fixed-left-grid-col a-col-right'); + if (nameElements.length > 0) { + var names = []; + var prices = []; + var totalCent = 0; + var totalCount = 0; + var priceNotFound = false; + + for (var j = 0; j < nameElements.length; j++) { + var a_tags = nameElements[j].getElementsByTagName('A'); + if (a_tags.length > 0) { + names.push(nameElements[j].getElementsByTagName('A')[0].innerHTML.trim()); + } else { + names.push(nameElements[j].getElementsByTagName('DIV')[0].innerHTML.trim()); + } + + var qty = getClassElement(nameElements[j].parentElement, 'item-view-qty'); + if (qty) { + qty = parseInt ( qty.textContent.trim()); + if (isNaN(qty)) { + qty = 1; + } + } + else { + qty = 1; + } + + var a_price = getClassElement(nameElements[j],'a-size-small a-color-price'); + if (a_price) { + var priceStr = a_price.textContent.trim(); + prices.push(priceStr); + var price = priceStr.replace(/EUR/,"").replace(/Summe/,"").replace(/.*coins/i,"0,00").trim().replace(/\./,"").split( "," ); + var centPrice = parseInt( price[ 0 ] ) * 100 + parseInt( price[ 1 ] ); + if (isNaN(centPrice)) + priceNotFound = true; + else + totalCent += centPrice * qty; + } + + totalCount += qty; + } + shipment.names = names; + shipment.prices = prices; + shipment.products = totalCount; + + if (shipmentElements.length == 1) { + shipment.price = orderPrice; + } + else { + shipment.price = getEuroString(totalCent / 100); + if (priceNotFound) + shipment.price = '*' + shipment.price ; } - - totalCount += qty; + } else { + console.log('No item names in shpiment found ' + year + '/' + page); } - shipment.names = names; - shipment.prices = prices; - shipment.products = totalCount; - - if (shipmentElements.length == 1) { - shipment.price = orderPrice; - } - else { - shipment.price = getEuroString(totalCent / 100); - if (priceNotFound) - shipment.price = '*' + shipment.price ; - } - } else { - console.log('No item names in shpiment found ' + year + '/' + page); + shipments.push(shipment); } - shipments.push(shipment); } } -} -function printState() -{ - var s = ""; - for( var i = 0; i < orders.length; i++ ) + function printState() { - s += orders[ i ].year + ":"; - if( orders[ i ].pages.length == 0 ) + var s = ""; + for( var i = 0; i < orders.length; i++ ) { - s += " waiting..."; + s += orders[ i ].year + ":"; + if( orders[ i ].pages.length == 0 ) + { + s += " waiting..."; + } + for( var j = 0; j < orders[ i ].pages.length; j++ ) + { + s += " " + ( orders[ i ].pages[ j ].done ? "X" : "." ); + } + s += "\n"; } - for( var j = 0; j < orders[ i ].pages.length; j++ ) + + document.body.innerHTML = "
" + s + "
"; + } + + function getEuroString( x ) + { + var eurocent = ( x.toFixed( 2 ) + "" ).split( "." ); + var euro = eurocent[ 0 ]; + var euroTsd = ""; + + for( var i = 0; i < euro.length - 1; i++ ) { - s += " " + ( orders[ i ].pages[ j ].done ? "X" : "." ); + euroTsd += euro.charAt( i ); + if( ( ( euro.length - i ) % 3 ) == 1 ) + { + euroTsd += "."; + } } - s += "\n"; - } + euroTsd += euro.charAt( euro.length - 1 ); - document.body.innerHTML = "
" + s + "
"; -} + return euroTsd + "," + eurocent[ 1 ]; + } -function getEuroString( x ) -{ - var eurocent = ( x.toFixed( 2 ) + "" ).split( "." ); - var euro = eurocent[ 0 ]; - var euroTsd = ""; + function getOverviewLine( data ) + { + return "" + + "" + data.name + "" + + "" + getEuroString( data.cent / 100 ) + "" + + "" + data.orders + "" + + "" + data.products + "" + + "" + getEuroString( data.cent / 100 / data.products ) + "" + + "" + getEuroString( data.cent / 100 / data.month ) + "" + + ""; + } - for( var i = 0; i < euro.length - 1; i++ ) + function getOrderLine( data ) { - euroTsd += euro.charAt( i ); - if( ( ( euro.length - i ) % 3 ) == 1 ) + var nameList = ""; + + return "" + + "Link" + + "" + data.date + "" + + "" + data.products + "" + + "" + data.price + "" + + "" + data.recip + "" + + "" + nameList + "" + + ""; } - euroTsd += euro.charAt( euro.length - 1 ); - - return euroTsd + "," + eurocent[ 1 ]; -} - -function getOverviewLine( data ) -{ - return "" + - "" + data.name + "" + - "" + getEuroString( data.cent / 100 ) + "" + - "" + data.orders + "" + - "" + data.products + "" + - "" + getEuroString( data.cent / 100 / data.products ) + "" + - "" + getEuroString( data.cent / 100 / data.month ) + "" + - ""; -} - -function getOrderLine( data ) -{ - var nameList = ""; - - return "" + - "Link" + - "" + data.date + "" + - "" + data.products + "" + - "" + data.price + "" + - "" + data.recip + "" + - "" + nameList + "" + - ""; -} - -function getShipmentLine( shipment ) -{ - var nameList = ""; - for( var i = 0; i < shipment.names.length; i++ ) { - nameList += shipment.names[ i ] + ' | ' + shipment.prices[ i ] + ' # '; + var nameList = ""; + for( var i = 0; i < shipment.names.length; i++ ) { + nameList += shipment.names[ i ] + ' | ' + shipment.prices[ i ] + ' # '; + } + + return "" + + "" + shipment.orderNumber + "" + + "" + shipment.orderDate + "" + + "" + shipment.orderPrice + "" + + "" + shipment.date + "" + + "" + shipment.products + "" + + "" + shipment.price + "" + + "" + nameList + "" + + ""; } - return "" + - "" + shipment.orderNumber + "" + - "" + shipment.orderDate + "" + - "" + shipment.orderPrice + "" + - "" + shipment.date + "" + - "" + shipment.products + "" + - "" + shipment.price + "" + - "" + nameList + "" + - ""; -} - - -function printOrders() -{ - var now = new Date(); - var thisYear = "" + ( 1900 + now.getYear() ); - var thisYearMonthCount = now.getMonth() + 1; - - var allOrders = []; - var years = []; - var overall = { "name" : "Insg.", "cent" : 0, "orders" : 0, "products" : 0, "month" : 0 }; - - for( var i = 0; i < orders.length; i++ ) + + function printOrders() { - var yearStr = orders[ i ].year.substr( 5 ); - var year = { "name" : yearStr, "cent" : 0, "orders" : 0, "products" : 0, "month" : ( yearStr == thisYear ? thisYearMonthCount : 12 ) }; + var now = new Date(); + var thisYear = "" + ( 1900 + now.getYear() ); + var thisYearMonthCount = now.getMonth() + 1; - for( var j = 0; j < orders[ i ].pages.length; j++ ) + var allOrders = []; + var years = []; + var overall = { "name" : "Insg.", "cent" : 0, "orders" : 0, "products" : 0, "month" : 0 }; + + for( var i = 0; i < orders.length; i++ ) { - for( var k = 0; k < orders[ i ].pages[ j ].entries.length; k++ ) + var yearStr = orders[ i ].year.substr( 5 ); + var year = { "name" : yearStr, "cent" : 0, "orders" : 0, "products" : 0, "month" : ( yearStr == thisYear ? thisYearMonthCount : 12 ) }; + + for( var j = 0; j < orders[ i ].pages.length; j++ ) { - var entry = orders[ i ].pages[ j ].entries[ k ]; + for( var k = 0; k < orders[ i ].pages[ j ].entries.length; k++ ) + { + var entry = orders[ i ].pages[ j ].entries[ k ]; - var price = entry.price.replace(/\./,"").split( "," ); - var cent = parseInt( price[ 0 ] ) * 100 + parseInt( price[ 1 ] ); + var price = entry.price.replace(/\./,"").split( "," ); + var cent = parseInt( price[ 0 ] ) * 100 + parseInt( price[ 1 ] ); - year.cent += cent; - year.products += entry.products; - year.orders++; + year.cent += cent; + year.products += entry.products; + year.orders++; - allOrders.push( entry ); + allOrders.push( entry ); + } } + + overall.cent += year.cent; + overall.products += year.products; + overall.orders += year.orders; + overall.month += year.month; + + years.push( year ); } - overall.cent += year.cent; - overall.products += year.products; - overall.orders += year.orders; - overall.month += year.month; + var text = "

Uebersicht

"; - years.push( year ); - } + text += "" + + "" + + "" + + "" + + "" + + "" + + "" + + ""; - var text = "

Uebersicht

"; + text += getOverviewLine( overall ); + for( var i = 0; i < years.length; i++ ) + { + text += getOverviewLine( years[ i ] ); + } + text += "
JahrEuroBestell.ProdukteEuro/Prod.Euro/Monat
"; - text += "" + - "" + - "" + - "" + - "" + - "" + - "" + - ""; + text += "

Einzel-Bestellungen

"; - text += getOverviewLine( overall ); - for( var i = 0; i < years.length; i++ ) - { - text += getOverviewLine( years[ i ] ); - } - text += "
JahrEuroBestell.ProdukteEuro/Prod.Euro/Monat
"; + text += "" + + "" + + "" + + "" + + "" + + "" + + "" + + ""; - text += "

Einzel-Bestellungen

"; + for( var i = 0; i < allOrders.length; i++ ) + { + text += getOrderLine( allOrders[ i ] ); + } + text += "
LinkDatumProduktePreisVersandadresseProduktbeschreibungen
"; - text += "" + - "" + - "" + - "" + - "" + - "" + - "" + - ""; + text += "

Lieferungen

"; - for( var i = 0; i < allOrders.length; i++ ) - { - text += getOrderLine( allOrders[ i ] ); - } - text += "
LinkDatumProduktePreisVersandadresseProduktbeschreibungen
"; - - text += "

Lieferungen

"; - - text += "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - ""; - - for( var i = 0; i < shipments.length; i++ ) - { - text += getShipmentLine( shipments[ i ] ); - } - text += "
BestellnummerBestelldatumBestellsummeLieferdatumAnzahl ProdukteSumme / AbbuchungProdukte | Preis
"; + text += "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + ""; - document.body.innerHTML = text; -} + for( var i = 0; i < shipments.length; i++ ) + { + text += getShipmentLine( shipments[ i ] ); + } + text += "
BestellnummerBestelldatumBestellsummeLieferdatumAnzahl ProdukteSumme / AbbuchungProdukte | Preis
"; -function loadOrders( event ) -{ - if( event.currentTarget.onlyOnce ) - { - return; + document.body.innerHTML = text; } - event.currentTarget.onlyOnce = true; - findOrders( event.currentTarget.document, event.currentTarget.yearIndex, event.currentTarget.pageIndex ); - findShipments( event.currentTarget.document, event.currentTarget.yearIndex, event.currentTarget.pageIndex ); + function loadOrders( event ) + { + if( event.currentTarget.onlyOnce ) + { + return; + } + event.currentTarget.onlyOnce = true; - event.currentTarget.close(); -} + findOrders( event.currentTarget.document, event.currentTarget.yearIndex, event.currentTarget.pageIndex ); + findShipments( event.currentTarget.document, event.currentTarget.yearIndex, event.currentTarget.pageIndex ); -function loadYear( event ) -{ - if( event.currentTarget.onlyOnce ) - { - return; + event.currentTarget.close(); } - event.currentTarget.onlyOnce = true; - var doc = event.currentTarget.document; - var as = doc.getElementsByTagName( "a" ); - var maxIndex = 0; - for( var i = 0; i < as.length; i++ ) + function loadYear( event ) { - if( as[ i ].href.match( /startIndex=(\d+)/ ) ) + if( event.currentTarget.onlyOnce ) { - maxIndex = Math.max( maxIndex, parseInt( RegExp.$1 ) ); + return; } - } + event.currentTarget.onlyOnce = true; - var year = event.currentTarget.yearIndex; + var doc = event.currentTarget.document; + var as = doc.getElementsByTagName( "a" ); + var maxIndex = 0; + for( var i = 0; i < as.length; i++ ) + { + if( as[ i ].href.match( /startIndex=(\d+)/ ) ) + { + maxIndex = Math.max( maxIndex, parseInt( RegExp.$1 ) ); + } + } - for( var i = 0; i <= maxIndex; i += 10 ) - { - orders[ year ].pages.push( { "done" : false, "entries" : [] } ); - } + var year = event.currentTarget.yearIndex; - findOrders( doc, year, 0 ); - findShipments( doc, year, 0 ); + for( var i = 0; i <= maxIndex; i += 10 ) + { + orders[ year ].pages.push( { "done" : false, "entries" : [] } ); + } - var pageUri = "https://www.amazon.de/gp/css/order-history/gp/css/order-history/ref=oss_pagination?ie=UTF8&orderFilter=" + - orders[ year ].year + "&search=&startIndex="; + findOrders( doc, year, 0 ); + findShipments( doc, year, 0 ); - var pageIndex = 1; - for( var i = 10; i <= maxIndex; i += 10 ) - { - var pageTab = window.open( pageUri + i ); - pageTab.yearIndex = year; - pageTab.pageIndex = pageIndex; - pageTab.addEventListener( "load", loadOrders, true ); + var pageUri = "https://www.amazon.de/gp/css/order-history/gp/css/order-history/ref=oss_pagination?ie=UTF8&orderFilter=" + + orders[ year ].year + "&search=&startIndex="; - pageIndex++; - } + var pageIndex = 1; + for( var i = 10; i <= maxIndex; i += 10 ) + { + var pageTab = window.open( pageUri + i ); + pageTab.yearIndex = year; + pageTab.pageIndex = pageIndex; + pageTab.addEventListener( "load", loadOrders, true ); - event.currentTarget.close(); -} + pageIndex++; + } -function loadYearCount( event ) -{ - if( event.currentTarget.onlyOnce ) - { - return; + event.currentTarget.close(); } - event.currentTarget.onlyOnce = true; - - var doc = event.currentTarget.document; - var form = doc.getElementsByClassName('time-period-chooser a-spacing-none')[0]; - var filter = doc.getElementsByName('orderFilter')[0]; - for( var i = 0; i < filter.options.length; i++ ) + function loadYearCount( event ) { - var regex = /year-(\d\d\d\d)/; - if( regex.exec( filter.options[ i ].value ) ) + if( event.currentTarget.onlyOnce ) { - orders.push( { "year" : filter.options[ i ].value, "pages" : [] } ); + return; } - } + event.currentTarget.onlyOnce = true; - //orders.splice( 0, orders.length - 2 ); + var doc = event.currentTarget.document; + var form = doc.getElementsByClassName('time-period-chooser a-spacing-none')[0]; + var filter = doc.getElementsByName('orderFilter')[0]; - var yearUri = "https://www.amazon.de/gp/css/order-history?"; - for( var i = 0; i < form.elements.length; i++ ) - { - var element = form.elements[ i ]; - if( element == filter ) + for( var i = 0; i < filter.options.length; i++ ) { - continue; + var regex = /year-(\d\d\d\d)/; + if( regex.exec( filter.options[ i ].value ) ) + { + orders.push( { "year" : filter.options[ i ].value, "pages" : [] } ); + } } - yearUri += encodeURIComponent( element.name ) + "=" + encodeURIComponent( element.value ) + "&"; - } - yearUri += "orderFilter="; - //alert( yearUri ); + //orders.splice( 0, orders.length - 2 ); - for( var i = 0; i < orders.length; i++ ) - { - var yearTab = window.open( yearUri + orders[ i ].year ); - yearTab.yearIndex = i; - yearTab.addEventListener( "load", loadYear, true ); - } + var yearUri = "https://www.amazon.de/gp/css/order-history?"; + for( var i = 0; i < form.elements.length; i++ ) + { + var element = form.elements[ i ]; + if( element == filter ) + { + continue; + } + + yearUri += encodeURIComponent( element.name ) + "=" + encodeURIComponent( element.value ) + "&"; + } + yearUri += "orderFilter="; + //alert( yearUri ); - waitInterval = setInterval( waitForFinish, 1000 ); + for( var i = 0; i < orders.length; i++ ) + { + var yearTab = window.open( yearUri + orders[ i ].year ); + yearTab.yearIndex = i; + yearTab.addEventListener( "load", loadYear, true ); + } - event.currentTarget.close(); -} + waitInterval = setInterval( waitForFinish, 1000 ); -function waitForFinish() -{ - printState(); + event.currentTarget.close(); + } - for( var i = 0; i < orders.length; i++ ) + function waitForFinish() { - if( orders[ i ].pages.length == 0 ) - { - return; - } - for( var j = 0; j < orders[ i ].pages.length; j++ ) + printState(); + + for( var i = 0; i < orders.length; i++ ) { - if( !orders[ i ].pages[ j ].done ) + if( orders[ i ].pages.length == 0 ) { return; } + for( var j = 0; j < orders[ i ].pages.length; j++ ) + { + if( !orders[ i ].pages[ j ].done ) + { + return; + } + } } + + clearInterval( waitInterval ); + printOrders(); } - clearInterval( waitInterval ); - printOrders(); -} + var orders = []; + var shipments = []; + var waitInterval; -var orders = []; -var shipments = []; -var waitInterval; + var mainTab = window.open("https://www.amazon.de/gp/css/order-history/ref=ya_orders_css"); + mainTab.addEventListener( "load", loadYearCount, true ); -var mainTab = window.open("https://www.amazon.de/gp/css/order-history/ref=ya_orders_css"); -mainTab.addEventListener( "load", loadYearCount, true ); +})(); \ No newline at end of file diff --git a/background.js b/background.js new file mode 100644 index 0000000..64ecbfb --- /dev/null +++ b/background.js @@ -0,0 +1,5 @@ +chrome.browserAction.onClicked.addListener(function (tab) { + chrome.tabs.executeScript(tab.ib, { + file: 'amazonparser.js' + }); +}); \ No newline at end of file diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..71c10e1 --- /dev/null +++ b/manifest.json @@ -0,0 +1,21 @@ +{ + "name": "Amazon Bestellungen Parser", + "version": "1.0", + "manifest_version": 2, + "description": "Erstellt eine Auswertung über alle Amazon-Bestellugnen.", + "homepage_url": "https://github.com/GameScripting/amazon-parser", + "background": { + "scripts": [ + "amazonparser.js" + ], + "persistent": true + }, + "browser_action": { + "default_title": "Amzn Bestl. Parser" + }, + "permissions": [ + "https://*/*", + "http://*/*", + "tabs" + ] +} \ No newline at end of file