// ==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);
});
})();