YouTube SuperChat貨幣轉換器

將各種國際貨幣金額轉為你所在地區的幣種(如CNY,HKD,NTD,USD,JPY等)

目前為 2024-07-21 提交的版本,檢視 最新版本

// ==UserScript==
// @name         YouTube SuperChat货币转换器
// @name:zh-CN   YouTube SuperChat货币转换器
// @name:zh-TW   YouTube SuperChat貨幣轉換器
// @name:zh-HK   YouTube SuperChat貨幣轉換器
// @name:ja      YouTube SuperChat通貨変換器
// @name:kr      YouTube SuperChat 화폐 변환기
// @name:ar      محول العملات لـ YouTube SuperChat
// @name:bg      YouTube SuperChat Конвертор на валута
// @name:cs      YouTube SuperChat Převodník měn
// @name:da      YouTube SuperChat Valutaomregner
// @name:de      YouTube SuperChat Währungsrechner
// @name:el      YouTube SuperChat Μετατροπέας νομισμάτων
// @name:es      Convertidor de divisas de YouTube SuperChat
// @name:fr      Convertisseur de devises YouTube SuperChat
// @name:he      ממיר מטבעות של YouTube SuperChat
// @name:hi      YouTube SuperChat मुद्रा परिवर्तक
// @name:hu      YouTube SuperChat Pénzváltó
// @name:id      YouTube SuperChat Konverter Mata Uang
// @name:it      Convertitore di valuta YouTube SuperChat
// @name:nl      YouTube SuperChat Valuta Converter
// @name:no      YouTube SuperChat Valutakonverterer
// @name:pl      Konwerter walut YouTube SuperChat
// @name:pt-BR   Conversor de moedas YouTube SuperChat
// @name:ro      Convertor de valute YouTube SuperChat
// @name:ru      Конвертер валют YouTube SuperChat
// @name:sv      YouTube SuperChat Valutakonverterare
// @name:th      ตัวแปลงสกุลเงิน YouTube SuperChat
// @name:tr      YouTube SuperChat Döviz Çevirici
// @name:uk      Конвертер валют YouTube SuperChat
// @name:vi      Trình chuyển đổi tiền tệ YouTube SuperChat

// @description         将各种国际货币金额转为你所在地区的币种(如CNY,HKD,NTD,USD,JPY等)
// @description:zh-CN   将各种国际货币金额转为你所在地区的币种(如CNY,HKD,NTD,USD,JPY等)
// @description:zh-TW   將各種國際貨幣金額轉為你所在地區的幣種(如CNY,HKD,NTD,USD,JPY等)
// @description:zh-HK   將各種國際貨幣金額轉為你所在地區的幣種(如CNY,HKD,NTD,USD,JPY等)
// @description:ja      各国の通貨をあなたの地域の通貨に変換します(CNY, HKD, NTD, USD, JPYなど)
// @description:kr      다양한 국제 통화를 거주 지역의 통화로 변환합니다 (예: CNY, HKD, NTD, USD, JPY 등)
// @description:ar      تحويل مبالغ العملات الدولية المختلفة إلى عملة منطقتك (مثل CNY، HKD، NTD، USD، JPY، إلخ.)
// @description:bg      Преобразуване на суми от различни международни валути във валутата на вашия регион (като CNY, HKD, NTD, USD, JPY и др.)
// @description:cs      Převod různých mezinárodních měn na měnu vašeho regionu (např. CNY, HKD, NTD, USD, JPY atd.)
// @description:da      Konverter forskellige internationale valutaer til din regions valuta (f.eks. CNY, HKD, NTD, USD, JPY osv.)
// @description:de      Konvertieren Sie verschiedene internationale Währungen in die Währung Ihrer Region (z.B. CNY, HKD, NTD, USD, JPY usw.)
// @description:el      Μετατροπή διαφόρων διεθνών νομισμάτων στο νόμισμα της περιοχής σας (π.χ. CNY, HKD, NTD, USD, JPY κ.λπ.)
// @description:es      Convierte diferentes monedas internacionales a la moneda de tu región (como CNY, HKD, NTD, USD, JPY, etc.)
// @description:fr      Convertissez différentes devises internationales en la devise de votre région (comme CNY, HKD, NTD, USD, JPY, etc.)
// @description:he      המרת סכומים במטבעות שונים למטבע המקומי שלך (כגון CNY, HKD, NTD, USD, JPY ועוד)
// @description:hi      विभिन्न अंतरराष्ट्रीय मुद्राओं को अपने क्षेत्र की मुद्रा में परिवर्तित करें (जैसे CNY, HKD, NTD, USD, JPY आदि)
// @description:hu      Különböző nemzetközi valuták összegeit átváltja a régiója pénznemére (pl. CNY, HKD, NTD, USD, JPY stb.)
// @description:id      Mengonversi berbagai jumlah mata uang internasional ke mata uang daerah Anda (seperti CNY, HKD, NTD, USD, JPY, dll.)
// @description:it      Converti diversi importi di valuta internazionale nella valuta della tua regione (come CNY, HKD, NTD, USD, JPY, ecc.)
// @description:nl      Converteert verschillende internationale valuta naar de valuta van uw regio (zoals CNY, HKD, NTD, USD, JPY, enz.)
// @description:no      Konverter forskjellige internasjonale valutaer til valutaen i din region (f.eks. CNY, HKD, NTD, USD, JPY osv.)
// @description:pl      Przekształć różne międzynarodowe waluty na walutę swojego regionu (np. CNY, HKD, NTD, USD, JPY itp.)
// @description:pt-BR   Converta diferentes moedas internacionais para a moeda da sua região (como CNY, HKD, NTD, USD, JPY, etc.)
// @description:ro      Convertiți diverse sume de valută internațională în moneda regiunii dvs. (cum ar fi CNY, HKD, NTD, USD, JPY etc.)
// @description:ru      Конвертируйте различные международные валюты в валюту вашего региона (например, CNY, HKD, NTD, USD, JPY и т. д.)
// @description:sv      Konvertera olika internationella valutor till din regions valuta (t.ex. CNY, HKD, NTD, USD, JPY osv.)
// @description:th      แปลงสกุลเงินต่างประเทศเป็นสกุลเงินในท้องถิ่นของคุณ (เช่น CNY, HKD, NTD, USD, JPY เป็นต้น)
// @description:tr      Farklı uluslararası para birimlerini kendi bölgenizin para birimine çevirin (örneğin CNY, HKD, NTD, USD, JPY vb.)
// @description:uk      Конвертуйте різні міжнародні валюти у валюту вашого регіону (наприклад, CNY, HKD, NTD, USD, JPY тощо)
// @description:vi      Chuyển đổi các loại tiền tệ quốc tế khác nhau sang tiền tệ của khu vực bạn (như CNY, HKD, NTD, USD, JPY, v.v.)
// @description:en      Convert various international currency amounts to your local currency (such as CNY, HKD, NTD, USD, JPY, etc.)

// @namespace    http://tampermonkey.net/
// @version      1.0
// @author       kksskkoopp
// @match        https://www.youtube.com/*
// @grant        GM_xmlhttpRequest
// @require      https://code.jquery.com/jquery-3.6.0.min.js
// @connect      v6.exchangerate-api.com
// @license      MIT
// @run-at document-start
// ==/UserScript==
/* globals  $ */
(function() {
    'use strict';

    // 汇率API信息
    let targetCurrencyCode = 'CNY'; // 目标币种,targetCurrencyCode
    let targetCurrencyPrecision = 1 // 目标币种保留的小数位数;
    // API密钥请在 https://www.exchangerate-api.com/ 免费获取:邮箱注册->一键激活->获得API密钥->替换下面的API_KEY
    let API_KEY = '0c719520222e5b86cf26f479'; // API密钥
    let API_URL = `https://v6.exchangerate-api.com/v6/${API_KEY}/latest/${targetCurrencyCode}`; // API地址

    // YoutubeSuperChat货币符号 : ISO-4217货币码
    let currencyMap = {
        '$': 'USD', // 美元
        '¥': 'JPY', // 日元
        '₱': 'PHP', // 菲律宾比索
        '£': 'GBP', // 英镑
        '€': 'EUR', // 欧元
        '₩': 'KRW', // 韩元
        '₽': 'RUB', // 卢布
        '₹': 'INR', // 卢比
        '฿': 'THB', // 泰铢
        '₣': 'FRF', // 法朗
        '₫': 'VND', // 越南盾
        
        
        
        
        'A$': 'AUD', // 澳大利亚元
        'NZ$': 'NZD', // 新西兰元
        'R$': 'BRL', // 巴西雷亚尔
        'HK$': 'HKD', // 港币
        'NT$': 'TWD', // 新台币
        'CA$': 'CAD', // 加拿大元



        'AED': 'AED', // 阿联酋迪拉姆
        'ARS': 'ARS', // 阿根廷比索
        'SGD': 'SGD', // 新加坡元
        'MYR': 'MYR'  // 马来西亚林吉特
        
        
        
    };

    let exchangeRates = {};
    /*
        计算公式
        targetCurrencyAmount = fromCurrencyAmount * exchangeRates[fromCurrenyCode]
    */

    // 获取汇率信息
    function fetchExchangeRates(callback) {
        console.log(`开始请求汇率${API_URL}`);
        GM_xmlhttpRequest({
            method: 'GET',
            url: API_URL,
            onload: function(response) {
                let data = JSON.parse(response.responseText);
                if (data.result == 'success')
                {
                    exchangeRates = data.conversion_rates;
                    let datetime = new Date();
                    console.log(`汇率 ${datetime.toLocaleDateString()} ${datetime.toLocaleTimeString()}`);
                    console.log(exchangeRates);
                    console.log('汇率请求完毕');
                    callback();
                }
                else if (data.result == 'error')
                {
                    console.error(`错误:error-type:${data.error-type}`);
                    console.error(`详情见https://www.exchangerate-api.com/docs/standard-requests`);
                }
            },
            onerror: function() {
                console.error('无法获取汇率');
            }
        });
    }


    // 解析金额和货币类型
    function parseAmountAndCurrency(text) {
        // 去除空白字符
        text = text.replace(/\s+/g, '');
        // 遍历currencyMap字典,找到匹配的货币符号
        for (let [symbol, code] of Object.entries(currencyMap)) {
            if (text.startsWith(symbol)) {
                // 提取金额部分,并去除货币符号和千位分隔符
                let amount = parseFloat(text.replace(symbol, '').replace(/,/g, ''));
                return { amount, fromCurrencyCode: code };
            }
        }
        console.error(`新的币种${text}.`);
        return null; // 如果未找到匹配的货币符号,返回null
    }

    // 观察DOM变化并转换SuperChat金额
    function observeSuperChat() {

        let targetNode = document.body;
        let config = { childList: true, subtree: true };

        let callback = function(mutationsList, observer) {
            for(let mutation of mutationsList) {
                if (mutation.type === 'childList') {
                    // 遍历新增的节点,检查是否包含SuperChat消息
                    $(mutation.addedNodes).each(function() {
                        let element = $(this).find('yt-formatted-string.style-scope.yt-live-chat-paid-message-renderer, yt-formatted-string.style-scope.yt-live-chat-paid-sticker-renderer');
                        if (element.length > 0) {
                            // 处理每个SuperChat消息
                            element.each(function() {
                                if (!$(this).attr('YoutubeSuperChatCurrencyConverter-converted')) {

                                    let message = $(this).text().trim();
                                    console.log(`捕获到超级留言${message}`);
                                    let parsed = parseAmountAndCurrency(message);
                                    if (parsed) {
                                        console.log(`解析成功${message}:${parsed.fromCurrencyCode} ${parsed.amount}`);
                                        // 获取汇率并计算转换后的金额
                                        let targetCurrencyAmount = parsed.amount / exchangeRates[parsed.fromCurrencyCode];
                                        let targetCurrencyAmount_str = targetCurrencyAmount.toFixed(targetCurrencyPrecision);
                                        let newText = `${message}=${targetCurrencyCode} ${targetCurrencyAmount_str}`;
                                        $(this).text(newText);
                                        $(this).attr('YoutubeSuperChatCurrencyConverter-converted', 'true'); // 标记为已处理

                                    } else {
                                        console.log(`解析失败${message}`);
                                    }
                                }
                            });
                        }
                    });
                }
            }
        };

        // 创建并启动MutationObserver
        let observer = new MutationObserver(callback);
        observer.observe(targetNode, config);
    }

    // 启动观察器
    $(document).ready(function() {
        fetchExchangeRates(observeSuperChat);
    });
})();