您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Greasy Fork is available in English.
Gets the price displayed on shopping sites and shows the equivalent hours of your life spent to earn that money.
当前为
// ==UserScript== // @name Show Price as Hours of your Life // @description Gets the price displayed on shopping sites and shows the equivalent hours of your life spent to earn that money. // @author navchandar // @version 1.0 // @run-at document-end // @copyright 2019, navchandar(https://github.com/navchandar) // @license MIT // @grant GM_addStyle // @grant GM_getValue // @grant GM_setValue // @include https://play.google.com/store/* // @include https://play.google.com/store* // @include http://play.google.com/store* // @include http://www.amazon.com // @include https://www.amazon.com // @include http://www.amazon.in // @match https://www.amazon.in/* // @include https://www.flipkart.com* // @include http://www.flipkart.com* // @include https://paytm.com* // @include http://paytm.com* // @include https://paytmmall.com* // @include http://paytmmall.com* // @namespace http://greasyfork.icu/users/302262 // ==/UserScript== function updateValuesINR() { var approxHourlySalary = Number(GM_getValue("approxAnnualSalary", "")) / (9 * 22 * 12); if (!approxHourlySalary) { console.log("Error calculating approxHourlySalary.") } if (approxHourlySalary > 0) { var items, separator; // These xpaths cover most of the price elements shown. Feel free to comment/fork to update if required. var amazonINRxpath = "//span[contains(@class, 'CurrencyINR')]//following-sibling::span" + " | " + "//span[@class='currencyINR']/parent::*" + " | " + "//*[contains(@class, 'rice')][contains(text(), '₹')]" + " | " + "//*[contains(@class, 'price')]//*[contains(text(), '₹')]" + " | " + "//*[contains(@class, 'price-whole')]" + " | " + "//h2/span[contains(text(), '₹')]"; var amazonUSDxpath = "//*[@class='dealPrice']" + " | " + "//*[@class='buyingPrice']" + " | " + "//*[contains(@class,'-price-whole')]" + " | " + "(//span[@class='dv-conditional-linebreak']//following-sibling::text())[1]" + " | " + "(//span[@class='dv-conditional-linebreak']//following-sibling::text())[2]" + " | " + "//span[contains(@class, 'price')][contains(text(), '$')]" + " | " + "//h2[contains(@class, 'headline') and contains(text(), '₹')]" + " | " + "//a[@id='dealTitle']" + " | " + "//div[contains(@class, 'priceBlock')]"; var flipkartINRxpath = "//*[contains(@title, '₹')]/div[3]" + " | " + "//div[contains(text(), '₹')]"; var paytmINRxpath = "//span/span[contains(text(), 'Rs')]" + " | " + "//a//*[contains(@class, 'iconRupess')]//.." + " | " + "//*[contains(@class, 'iconRupess')]//.."; var playStoreINRxpath = "//*[@class='display-price' and contains(text(), '₹')]" + " | " + "//button[@jsmodel]//span[contains(text(), '₹')]" + " | " + "//button[contains(text(), '₹')]//text()"; var hostURL = window.location.href; if (hostURL.indexOf('amazon.in') >= 0) { items = document.evaluate(amazonINRxpath, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); separator = " "; } else if (hostURL.indexOf('amazon.com') >= 0) { items = document.evaluate(amazonUSDxpath, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); separator = " "; } else if (hostURL.indexOf('flipkart') >= 0) { items = document.evaluate(flipkartINRxpath, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); separator = " "; } else if (hostURL.indexOf('paytm') >= 0) { items = document.evaluate(paytmINRxpath, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); separator = "<br/>"; } else if ((hostURL.indexOf('google') >= 0) && (hostURL.indexOf('details') >= 0)) { items = document.evaluate(playStoreINRxpath, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); separator = " "; } else if ((hostURL.indexOf('google') >= 0) && (hostURL.indexOf('store') >= 0)) { items = document.evaluate(playStoreINRxpath, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); separator = "<br/>"; } else { console.log("Show Price Hours script didnt match with the current site."); } if (!items) { console.log("No items found with the xpath in this page."); } else if (items.snapshotLength <= 0) { console.log("No items found with the xpath in this page."); } else { var passCount = 0; for (let i = 0; i < items.snapshotLength; i++) { var thisitem = items.snapshotItem(i); var txt = thisitem.innerText; var alreadyUpdated = false; try { if (txt.indexOf('hrs') >= 0 | txt.indexOf('days') >= 0 | txt.indexOf('month') >= 0) { alreadyUpdated = true; } } catch (err) {} try { if (thisitem.innerHTML.indexOf('hrs') >= 0 | thisitem.innerHTML.indexOf('days') >= 0 | thisitem.innerHTML.indexOf('month') >= 0) { alreadyUpdated = true; } } catch (err) {} if (!alreadyUpdated) { try { // to remove +10% offers from flipkart if (txt.indexOf('+') >= 0) { txt = txt.split('+')[0]; } // to remove hidden text from paytm if (txt.indexOf('%') >= 0 && txt.indexOf('-') >= 0) { txt = txt.split('-')[0] } // to remove 100-200 range from amazon if (txt.indexOf('-') >= 0) { txt = txt.split('-')[1]; } if (txt.indexOf('to') >= 0) { txt = txt.split('to')[1]; } txt = (txt.replace(/\d+ Used/i, "").replace(/\d+ New/i, "")).replace(/\(\d+%\)/g, ""); txt = txt.replace(/[a-z]/gi, ""); // remove unneccessary text and convert to number. var amount = Number(txt.replace(",", "").replace("Rs.", "").replace("₹", "").replace("$", "").replace(".00", "").replace(" ", "")); if (!amount || amount <= 0) { amount = Number((txt.replace(".00", "").replace(/\.\d+/, "")).replace(/\D+/g, "")); } //console.log(amount, txt); if (amount > 0) { var calculated = (amount / approxHourlySalary).toFixed(2); if (calculated) { if (calculated < 10){ thisitem.innerHTML += (separator + "<b>(" + calculated + " hrs)</b>"); }else if (calculated < 190){ thisitem.innerHTML += (separator + "<b>(" + (calculated/9).toFixed(2) + " days)</b>"); }else{ thisitem.innerHTML += (separator + "<b>(" + (calculated/198).toFixed(2) + " months)</b>"); } passCount++; } else { console.log("Error calculating amount : " + amount); } } } catch (err) {} } } console.log("Updated hours to " + passCount + " items."); items = ""; } } } function ButtonClickAction(zEvent) { GM_setValue("approxAnnualSalary", ""); var approxAnnualSalary = prompt('To calculate how many hours of your life, each item will cost, add an approximate Annual Salary/Wage Amount :', ''); if (approxAnnualSalary) { GM_setValue("approxAnnualSalary", approxAnnualSalary); console.log("Stored approxAnnualSalary : " + approxAnnualSalary); GM_setValue("UserCancelledPrompt", false); self.location.assign(location); } else { GM_setValue("UserCancelledPrompt", true); console.log("User Cancelled prompt to update approxAnnualSalary."); } } function AddButton() { // Add a button element on div var zNode = document.createElement('div'); zNode.innerHTML = '<button id="myButton" title="To update your stored wage/salary, Click me" type="button">Reset</button>'; zNode.setAttribute('id', 'myContainer'); document.body.appendChild(zNode); //--- Activate the newly added button. document.getElementById("myButton").addEventListener("click", ButtonClickAction, false); //--- Style our newly added element using CSS. GM_addStyle(` #myContainer { position: fixed; bottom: 0; left: 0; font-size: 11px; margin: 0px; opacity: 0.75; } #myButton { cursor: pointer; background-color: lightgrey; color: black; } #myButton:hover { background-color: #555; color: white; box-shadow: 0 2px 6px 0 rgba(0,0,0,.24), 0 5px 10px 0 rgba(0,0,0,.19); opacity: 1; } `); } (function () { 'use strict'; //GM_setValue("approxAnnualSalary", ""); // Reset here for test. var approxAnnualSalary = GM_getValue("approxAnnualSalary", ""); var checkPriorCancellation = GM_getValue("UserCancelledPrompt"); if ((approxAnnualSalary == "" || !approxAnnualSalary) && !checkPriorCancellation) { approxAnnualSalary = prompt('To calculate how many hours of your life, each item will cost, add an approximate Annual Salary/Wage Amount :', ''); if (approxAnnualSalary) { GM_setValue("approxAnnualSalary", approxAnnualSalary); GM_setValue("UserCancelledPrompt", false); console.log("Stored approxAnnualSalary : " + approxAnnualSalary); } else { GM_setValue("UserCancelledPrompt", true); console.log("User Cancelled prompt to update approxAnnualSalary."); } } else { console.log("Retrieved approxAnnualSalary : " + approxAnnualSalary); } // call this function once AddButton(); // call this every 2 seconds to update according to page load setInterval(function () { updateValuesINR(); }, 2000); })();