您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Automatically convert all currencies on any website to your local currency
// ==UserScript== // @name Auto Currency // @namespace http://tampermonkey.net/ // @version 2024-09-25 // @description Automatically convert all currencies on any website to your local currency // @author Obelous // @match *://*/* // @icon // @grant none // @license apache2 // ==/UserScript== ///////////////////////////////////////////// // YOU MUST EDIT THIS SCRIPT FOR IT TO WORK// ///////////////////////////////////////////// (function() { 'use strict'; // API settings: Get a free API key from https://www.exchangerate-api.com/ const apiKey = 'API_KEY'; const apiURL = `https://v6.exchangerate-api.com/v6/${apiKey}/latest/USD`; // Function to fetch conversion rate async function getGBPConversionRate() { try { const response = await fetch(apiURL); const data = await response.json(); return data.conversion_rates.GBP; } catch (error) { console.error('Error fetching conversion rate:', error); return null; } } // Function to convert USD to GBP and format the price function convertAndReplacePrices(usdToGbpRate, targetNode) { const priceRegex = /\$([0-9]+(?:\.[0-9]{2})?)/g; // Iterate over all text nodes, including nested text nodes inside spans and labels const walker = document.createTreeWalker(targetNode, NodeFilter.SHOW_TEXT, { acceptNode: function(node) { if (priceRegex.test(node.nodeValue)) return NodeFilter.FILTER_ACCEPT; } }); while (walker.nextNode()) { const node = walker.currentNode; node.nodeValue = node.nodeValue.replace(priceRegex, function(match, usdPrice) { const usdValue = parseFloat(usdPrice); const gbpValue = (usdValue * usdToGbpRate).toFixed(2); return `£${gbpValue} (${match})`; }); } } // Function to handle nested price elements in the DOM function handlePriceElements(usdToGbpRate) { const priceSelectors = ['.woocommerce-Price-amount', '.wc-pao-addon-price']; priceSelectors.forEach(selector => { const elements = document.querySelectorAll(selector); elements.forEach(element => { const priceText = element.innerText.match(/\$([0-9]+(?:\.[0-9]{2})?)/); if (priceText) { const usdValue = parseFloat(priceText[1]); const gbpValue = (usdValue * usdToGbpRate).toFixed(2); element.innerText = `£${gbpValue} ($${usdValue})`; } }); }); } // Function to observe DOM changes async function observeDOMChanges() { const usdToGbpRate = await getGBPConversionRate(); if (!usdToGbpRate) return; // Initial price conversion on the whole page convertAndReplacePrices(usdToGbpRate, document.body); handlePriceElements(usdToGbpRate); // Handle nested price elements // Callback to execute when mutations are observed const mutationCallback = function(mutationsList) { for (let mutation of mutationsList) { if (mutation.type === 'childList' || mutation.type === 'subtree') { mutation.addedNodes.forEach(node => { if (node.nodeType === Node.ELEMENT_NODE) { convertAndReplacePrices(usdToGbpRate, node); handlePriceElements(usdToGbpRate); // Handle nested price elements in new nodes } }); } } }; // Set up a MutationObserver to watch for changes to the body const observer = new MutationObserver(mutationCallback); observer.observe(document.body, { childList: true, subtree: true }); } // Start observing DOM changes observeDOMChanges(); })();