Greasy Fork

Amazon Global Price Comparator

It shows prices across amazon portals (IT,DE,FR,ES,UK,US)

目前为 2022-08-26 提交的版本。查看 最新版本

// ==UserScript==
// @name        Amazon Global Price Comparator
// @description It shows prices across amazon portals (IT,DE,FR,ES,UK,US) 
// @match       https://www.amazon.it/*
// @match       https://www.amazon.de/*
// @match       https://www.amazon.co.uk/*
// @match       https://www.amazon.fr/*
// @match       https://www.amazon.es/*
// @match       https://www.amazon.com/*
// @version     1.8
// @author      SH3LL
// @grant       GM_xmlhttpRequest
// @namespace https://greasyfork.org/users/762057
// ==/UserScript==

function get_price(url,location) {
    return new Promise(function (resolve, reject) {
        GM_xmlhttpRequest({
            method: 'GET',
            responseType: 'document',
            synchronous: false,
            url: url,
            onload: (resp) => {
                  const doc = document.implementation.createHTMLDocument().documentElement;
                  doc.innerHTML = resp.responseText;
                  let grabbed_price=null;
                  
              
                  // --- PriceBlock of type: APEX ---
                  let price_block=doc.querySelector("#apex_desktop") //id blocco del prezzo
                  if(price_block!==null){
                    if(price_block.innerText.includes("€") || price_block.innerText.includes("£") || price_block.innerText.includes("$")){ // se il blocco c'è

                      let etichette = price_block.getElementsByTagName("span");
                      for(let el of etichette){
                        if(el.className.includes("a-text-price") && el.getAttribute("data-a-color")==="price"){
                              grabbed_price = el.firstChild;
                              break;
                        }
                        if(el.className.includes("a-price") && el.className.includes("priceToPay")){
                              grabbed_price = el.firstChild;
                              break;
                        }
                        if(el.id==="priceblock_ourprice"){
                          console.log("preso");
                          grabbed_price = el;
                          break;
                        }
                      }
                    }
                  }  
              
                  // --- PriceBlock of type: OURPRICE ---
                  if(grabbed_price === null) grabbed_price = doc.querySelector('#priceblock_ourprice'); // id prezzo 
                  if(grabbed_price === null) {
                    grabbed_price = doc.querySelector('#apexPriceToPay'); 
                    if(grabbed_price!== null && grabbed_price.children[1]!==null) grabbed_price=grabbed_price.children[1]; 
                  }// nuova classe id del prezzo 
                  if(grabbed_price === null) grabbed_price = doc.querySelector('#priceblock_saleprice') // id prezzo scontato
                  if(grabbed_price === null) grabbed_price = doc.querySelector('#priceblock_dealprice') // id prezzo offerta flash
                  if(grabbed_price === null) grabbed_price = doc.querySelector('#priceblock_pospromoprice') // id prezzo offerta flash
                  
              
                  // --- PriceBlock of type: "New and Used From.." ---
                  if(grabbed_price === null){
                    let etichette = doc.getElementsByTagName("span"); //ottiene tutti i tag "span" della pagina
                    for(let el of etichette){
                      if(   ( el.innerText.includes("Nuevos") && el.innerText.includes("desde")  ) ||
                              ( el.innerText.includes("Nuovo") && el.innerText.includes("da") ) ||
                              ( el.innerText.includes("Neufs") && el.innerText.includes("occasions") ) ||
                              ( el.innerText.includes("Neu") && el.innerText.includes("ab")  ) ||
                              ( el.innerText.includes("New") && el.innerText.includes("from") ) 
                          ) {
                              if(el.children[0]!==undefined && el.children[0].children[1]!==undefined){
                                console.log(el.children[0].children[1])
                                grabbed_price = el.children[0].children[1];
                              }
                              break;

                            }
                    }
                  }
              
                  // PASS THE OUTPUT
                  if(grabbed_price !== null && grabbed_price !== undefined && grabbed_price.innerText !== null && grabbed_price.innerText !== undefined && grabbed_price.innerText.trim()!== "" && grabbed_price.innerText.length < 10) {
                    resolve(grabbed_price.innerText); return;
                  }
                  resolve("error"); return;
           }
        });
    });
}

async function main(){  
  
    if(window.location.href.includes("/dp/") || window.location.href.includes("/gp/product/") ){
      
      //get amazon country
      let my_location = (window.location.href).split("www.amazon.")[1].split("/")[0].trim();
      
      let amz_code; //get amazon product code
      if(window.location.href.includes("/gp/product/") && window.location.href.includes("?") ){
        amz_code=(window.location.href).split("?")[0].split('/gp/product/')[1];
        
      }else if(window.location.href.includes("/gp/product/") && !window.location.href.includes("?")){
        amz_code=(window.location.href).split('/gp/product/')[1];

      }else if(window.location.href.includes("/dp/") && window.location.href.includes("?")){
         amz_code=(window.location.href).split("?")[0].split('/dp/')[1].split('/')[0];
        
      }else if(window.location.href.includes("/dp/") && !window.location.href.includes("?")){ 
         amz_code=(window.location.href).split('/dp/')[1].split('/')[0];
        
      }
      
      
      //let price_block = document.querySelector('#price');  //VECCHIO HOOK (che non esiste quando il prezzo è fuori stock)
      let price_block = document.querySelector('#desktop_unifiedPrice'); //HOOK
      if(price_block===null) price_block = document.querySelector('#productOverview_feature_div').children[0];
      
      let tr1 = document.createElement("tr");
      
      let div1 = document.createElement("div");
      div1.style.position = "relative";
      div1.style.left="100%";
      
      let message1= document.createElement("label");
      message1.innerText="⏳ Loading Prices... ⏳";
      message1.style.color="firebrick";
      
      tr1.append(div1);
      div1.append(message1);
      //price_block.children[0].children[0].append(tr1);  //VECCHIO HOOK (che non esiste quando il prezzo è fuori stock)
      price_block.append(tr1);
      
      
      let locations = ["it","de","fr","es","co.uk","com"];
      let flags = { "it":"🇮🇹", "de":"🇩🇪", "fr":"🇫🇷", "es":"🇪🇸", "co.uk":"🇬🇧", "com":"🇺🇸" };
      let prices=[],link,min_price=999999999999999999999999999;
      
      console.log("My Location:"+my_location);
      
      for(let curr_location of locations){
        let curr_price = await get_price("https://www.amazon."+curr_location+"/dp/"+amz_code , curr_location);
        
        
        
        
        console.log(curr_location+": price-> " + curr_price)
        
        if(curr_price!=="error"){
          //clean currency font in the right location
          if(curr_location=="it" || curr_location=="de" ||curr_location=="fr" ||curr_location=="es") {curr_price=curr_price.replace("€","").trim()+"€"}
          if(curr_location=="co.uk") {curr_price=curr_price.replace("£","").trim()+"£"}
          if(curr_location=="com") {curr_price=curr_price.replace("$","").trim()+"$"}
          
          //get min price
          let cleaned_price=curr_price.replace(",",".");
          cleaned_price=cleaned_price.replace("$","");
          cleaned_price=cleaned_price.replace("£","");
          cleaned_price=cleaned_price.replace("€","");
          cleaned_price=cleaned_price.trim();//remove spaces
          
          //calcola minimo prezzo
          if(parseFloat(cleaned_price)< parseFloat(min_price)){ min_price=cleaned_price }
          
          //creo link
          link= document.createElement("a");
          if(my_location.toString() === curr_location.toString()){
            link.innerText= "[["+ flags[curr_location] + " " + curr_price.replace(".",",")+"]]";
          }else{
            link.innerText= "["+ flags[curr_location] + " " + curr_price.replace(".",",")+"]";
          }
          
          link.href="https://www.amazon."+curr_location+"/dp/"+amz_code;
          link.style.color="dodgerblue";
          link.style.paddingLeft = "5px";
          link.style.paddingRight = "5px";
          
          prices.push(link);
          
        }else{
          
          //creo link
          link= document.createElement("a");
          if(my_location.toString() === curr_location.toString()){
            link.innerText= "[["+ flags[curr_location] + " stock-out]]";
          }else{
            link.innerText= "["+ flags[curr_location] + " stock-out]";
          }
          
          link.href="https://www.amazon."+curr_location+"/dp/"+amz_code;
          link.style.color="red";
          link.style.paddingLeft = "5px";
          link.style.paddingRight = "5px";
          //message.style.color="firebrick";
          
          prices.push(link);
          
        }
      }
      
      //REMOVE LOADING
      //price_block.children[0].children[0].removeChild(price_block.children[0].children[0].lastElementChild); //VECCHIO HOOK (che non esiste quando il prezzo è fuori stock)
      price_block.removeChild(price_block.lastElementChild);
      
      let tr2 = document.createElement("tr");
      let div2 = document.createElement("div");
      tr2.append(div2);
      
      for(let curr_price_link of prices){
        
        let cleaned_price=curr_price_link.innerText.replace("CO.UK","");
        cleaned_price=cleaned_price.replaceAll("🇮🇹","");
        cleaned_price=cleaned_price.replaceAll("🇩🇪","");
        cleaned_price=cleaned_price.replaceAll("🇫🇷","");
        cleaned_price=cleaned_price.replaceAll("🇪🇸","");
        cleaned_price=cleaned_price.replaceAll("🇬🇧","");
        cleaned_price=cleaned_price.replaceAll("🇺🇸","");
        cleaned_price=cleaned_price.replaceAll(",",".");
        cleaned_price=cleaned_price.replaceAll("[","");
        cleaned_price=cleaned_price.replaceAll("]","");
        cleaned_price=cleaned_price.replaceAll("$","");
        cleaned_price=cleaned_price.replaceAll("£","");
        cleaned_price=cleaned_price.replaceAll("€","");
        cleaned_price=cleaned_price.trim();//remove spaces
        
        if(parseFloat(cleaned_price)===parseFloat(min_price)){curr_price_link.style.color="green"}
        div2.append(curr_price_link);
        
      }
      
      price_block.append(tr2);
    }
}

main();