自动将网址中的"automagic4android.com"替换为"46.231.200.187",高性能优化版
// ==UserScript==
// @name Automagic网址自动替换 - 高性能版
// @namespace http://tampermonkey.net/
// @version 2.1
// @description 自动将网址中的"automagic4android.com"替换为"46.231.200.187",高性能优化版
// @author Jeff_CF
// @icon https://46.231.200.187/images/AutomagicAdaptiveIcon_25.png
// @match *://46.231.200.187/*
// @match *://automagic4android.com/*
// @match *://www.baidu.com/*
// @match *://*/*
// @grant none
// ==/UserScript==
(function() {
'use strict';
// 目标域名和替换IP
const OLD_DOMAIN = 'automagic4android.com';
const NEW_IP = '46.231.200.187';
// 需要处理的属性列表
const URL_ATTRIBUTES = ['href', 'src', 'action'];
// 防抖计时器
let processTimer = null;
// 安全替换URL - 仅替换域名部分
function replaceUrl(url) {
try {
const urlObj = new URL(url);
if (urlObj.hostname === OLD_DOMAIN) {
urlObj.hostname = NEW_IP;
return urlObj.toString();
}
} catch (e) {
// 无效URL则直接替换字符串
return url.replace(OLD_DOMAIN, NEW_IP);
}
return url;
}
// 处理单个元素
function processElement(element) {
URL_ATTRIBUTES.forEach(attr => {
const value = element.getAttribute(attr);
if (value && value.includes(OLD_DOMAIN)) {
element.setAttribute(attr, replaceUrl(value));
}
});
}
// 初始页面处理(使用高效的选择器)
function processPage() {
// 创建高效的选择器(匹配任何包含目标域名的属性)
const selector = URL_ATTRIBUTES.map(attr => `[${attr}*="${OLD_DOMAIN}"]`).join(',');
if (!selector) return;
const elements = document.querySelectorAll(selector);
for (let i = 0; i < elements.length; i++) {
processElement(elements[i]);
}
}
// 高性能处理DOM变化
function handleMutations(mutations) {
// 使用Set避免重复处理
const elementsToProcess = new Set();
for (const mutation of mutations) {
// 处理新增节点
if (mutation.addedNodes) {
for (const node of mutation.addedNodes) {
if (node.nodeType === Node.ELEMENT_NODE) {
// 检查节点本身
if (node.matches(`[href*="${OLD_DOMAIN}"], [src*="${OLD_DOMAIN}"], [action*="${OLD_DOMAIN}"]`)) {
elementsToProcess.add(node);
}
// 检查直接子节点(避免深层遍历)
for (const child of node.children) {
if (child.matches(`[href*="${OLD_DOMAIN}"], [src*="${OLD_DOMAIN}"], [action*="${OLD_DOMAIN}"]`)) {
elementsToProcess.add(child);
}
}
}
}
}
// 处理属性变化
if (mutation.type === 'attributes' &&
URL_ATTRIBUTES.includes(mutation.attributeName) &&
mutation.target instanceof Element &&
mutation.target.matches(`[${mutation.attributeName}*="${OLD_DOMAIN}"]`)) {
elementsToProcess.add(mutation.target);
}
}
// 处理收集到的元素
for (const element of elementsToProcess) {
processElement(element);
}
}
// 使用防抖的MutationObserver回调
function debouncedMutationCallback(mutations) {
if (processTimer) clearTimeout(processTimer);
// 对百度等高性能敏感页面使用更长的延迟
const delay = window.location.hostname.includes('baidu.com') ? 300 : 100;
processTimer = setTimeout(() => {
handleMutations(mutations);
processTimer = null;
}, delay);
}
// 初始化观察器
function initObserver() {
const observer = new MutationObserver(debouncedMutationCallback);
observer.observe(document, {
childList: true,
subtree: true,
attributes: true,
attributeFilter: URL_ATTRIBUTES
});
return observer;
}
// 主初始化函数
function init() {
// 初始页面处理
processPage();
// 初始化观察器
initObserver();
// 对百度页面添加性能优化提示
if (window.location.hostname.includes('baidu.com')) {
console.log('Automagic网址替换脚本已启用(百度优化模式)');
}
}
// 在页面完全加载后初始化
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init);
} else {
init();
}
})();