您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
自动替换小米官方下载链接为阿里云节点镜像,适配xiaomirom.com等场景
// ==UserScript== // @name miuirom: 加速小米rom下载链接 (全场景适配版) // @description 自动替换小米官方下载链接为阿里云节点镜像,适配xiaomirom.com等场景 // @namespace xuebaiyo // @include http*://xiaomirom.com/* // @include http*://bigota.d.miui.com/* // @include http*://bn.d.miui.com/* // @include http*://cdnorg.d.miui.com/* // @include http*://hugeota.d.miui.com/* // @version 3.2 // @grant none // @license GPL-3.0 // @author xuebaiyo // ==/UserScript== // 目标替换域名(阿里云新加坡节点) const targetDomain = "bkt-sgp-miui-ota-update-alisgp.oss-ap-southeast-1.aliyuncs.com"; // 需要替换的小米官方域名列表 const officialDomains = [ "bigota.d.miui.com", "bn.d.miui.com", "cdnorg.d.miui.com", "hugeota.d.miui.com" ]; // 生成匹配所有官方域名的正则表达式 const domainRegex = new RegExp( `^https?:\\/\\/(?<domain>${officialDomains.join("|")})(?<path>\\/.*)$`, "gi" ); // 1. 重写 window.open 拦截所有通过脚本打开的链接 const originalOpen = window.open; window.open = function(url, name, features) { // 检测并替换URL中的小米官方域名 if (typeof url === 'string') { const newUrl = url.replace(domainRegex, `https://${targetDomain}$2`); if (newUrl !== url) { console.log(`[MIUIROM] 拦截window.open链接: ${url} -> 替换为 ${newUrl}`); return originalOpen.call(window, newUrl, name, features); } } return originalOpen.call(window, url, name, features); }; // 2. 处理页面已加载的a标签链接(兼容传统href跳转) const processLinks = () => { const links = document.querySelectorAll(`a[href*="${officialDomains.join('"], a[href*="')}"]`); links.forEach(link => { let href = link.getAttribute('href'); if (href) { const newHref = href.replace(domainRegex, `https://${targetDomain}$2`); if (newHref !== href) { link.setAttribute('href', newHref); console.log(`[MIUIROM] 替换a标签链接: ${href} -> ${newHref}`); } } }); }; // 3. 处理页面onclick事件中的字符串链接(针对xiaomirom.com的特殊格式) const processOnClickLinks = () => { // 匹配onclick中包含window.open('https://bigota...')的元素 const elements = document.querySelectorAll('[onclick*="window.open(\'https://bigota")'); elements.forEach(el => { let onclick = el.getAttribute('onclick'); if (onclick) { // 提取URL部分并替换域名 const match = onclick.match(/window.open\('(https?:\/\/[^']+)'\)/); if (match && match[1]) { const originalUrl = match[1]; const newUrl = originalUrl.replace(domainRegex, `https://${targetDomain}$2`); if (newUrl !== originalUrl) { // 替换onclick中的URL const newOnclick = onclick.replace(originalUrl, newUrl); el.setAttribute('onclick', newOnclick); console.log(`[MIUIROM] 替换onclick链接: ${originalUrl} -> ${newUrl}`); } } } }); }; // 4. 动态监听DOM变化(处理异步加载的内容) const observeDOM = (function() { const MutationObserver = window.MutationObserver || window.WebKitMutationObserver; if (!MutationObserver) return; const observer = new MutationObserver(mutations => { mutations.forEach(mutation => { if (mutation.type === "childList") { // 处理新添加的a标签链接 const newLinks = Array.from(mutation.addedNodes) .filter(node => node.nodeType === 1) .flatMap(node => Array.from(node.querySelectorAll(`a[href*="${officialDomains.join('"], a[href*="')}"]`))); newLinks.forEach(link => processLinks(link)); // 处理新添加的onclick链接 const newElements = Array.from(mutation.addedNodes) .filter(node => node.nodeType === 1) .flatMap(node => Array.from(node.querySelectorAll('[onclick*="window.open(\'https://bigota")'))); newElements.forEach(el => processOnClickLinks(el)); } }); }); return { start: (element) => observer.observe(element, { childList: true, subtree: true }) }; })(); // 初始化执行:处理当前页面所有链接 (function() { processLinks(); processOnClickLinks(); // 检测当前URL是否需要跳转(如直接访问官方链接) if (domainRegex.test(window.location.href)) { const newUrl = window.location.href.replace(domainRegex, `https://${targetDomain}$2`); console.log(`[MIUIROM] 跳转当前页面: ${window.location.href} -> ${newUrl}`); window.location.replace(newUrl); } // 启动DOM监听 if (observeDOM) { observeDOM.start(document.body); console.log('[MIUIROM] 已启动DOM变化监听'); } })();