// ==UserScript== // @name 我家在... 改 // @namespace https://114514.plus/ // @version 0.2.0 // @description 自动修改淘宝/天猫/京东等购物页面的"配送至"地址,在你分享商品截图的时候保护隐私。 // @author jkfujr // @match https://item.jd.com/*.html* // @match https://cart.jd.com/cart_index* // @match https://npcitem.jd.hk/*.html* // @match https://*.detail.tmall.com/item.htm* // @match https://*.detail.tmall.hk/hk/item.htm* // @match https://item.taobao.com/item.htm* // @grant GM_registerMenuCommand // @grant GM_unregisterMenuCommand // @grant GM_getValue // @grant GM_setValue // @license GNU GPLv3 // @downloadURL none // ==/UserScript== (function () { "use strict"; // 初始化设置 if (GM_getValue('addressSpoofingEnabled') === undefined) { GM_setValue('addressSpoofingEnabled', true); } if (GM_getValue('fakeAddress1') === undefined) { GM_setValue('fakeAddress1', "日本"); } if (GM_getValue('fakeAddress2') === undefined) { GM_setValue('fakeAddress2', "下北沢"); } if (GM_getValue('addressSpoofingDelay') === undefined) { GM_setValue('addressSpoofingDelay', 2500); } // 获取设置 var addressSpoofingEnabled = GM_getValue('addressSpoofingEnabled'); var fakeAddress1 = GM_getValue('fakeAddress1'); var fakeAddress2 = GM_getValue('fakeAddress2'); var addressSpoofingDelay = GM_getValue('addressSpoofingDelay'); // 注册菜单 function registerMenu() { if (window.toggleMenuCommand) GM_unregisterMenuCommand(window.toggleMenuCommand); if (window.addressEditCommand) GM_unregisterMenuCommand(window.addressEditCommand); if (window.delayCommand) GM_unregisterMenuCommand(window.delayCommand); // 地址伪装总开关 var menuText = (addressSpoofingEnabled ? '✅ ' : '❌ ') + '地址伪装'; window.toggleMenuCommand = GM_registerMenuCommand(menuText, function () { addressSpoofingEnabled = !addressSpoofingEnabled; GM_setValue('addressSpoofingEnabled', addressSpoofingEnabled); registerMenu(); location.reload(); }); // 地址修改 window.addressEditCommand = GM_registerMenuCommand('✏️ 地址修改', function () { var address1 = prompt("请输入主要地址 (如省份/国家):", fakeAddress1); if (address1 !== null) { fakeAddress1 = address1 || "日本"; GM_setValue('fakeAddress1', fakeAddress1); var address2 = prompt("请输入次要地址 (如城市/地区):", fakeAddress2); if (address2 !== null) { fakeAddress2 = address2 || "下北沢"; GM_setValue('fakeAddress2', fakeAddress2); registerMenu(); location.reload(); } } }); // 伪装延迟 window.delayCommand = GM_registerMenuCommand(`⏱️ 伪装延迟`, function () { var delay = prompt("请输入伪装延迟时间 (毫秒):", addressSpoofingDelay); if (delay !== null) { addressSpoofingDelay = parseInt(delay) || 2500; GM_setValue('addressSpoofingDelay', addressSpoofingDelay); registerMenu(); } }); } registerMenu(); if (addressSpoofingEnabled) { setTimeout(function () { switch (window.location.host) { case "item.jd.com": case "npcitem.jd.hk": var jdAddressElement = document.querySelector(".ui-area-text"); if (jdAddressElement) { jdAddressElement.innerText = fakeAddress1 + " " + fakeAddress2; } break; case "cart.jd.com": if (window.location.pathname === '/cart_index') { var jdCartAddressElement = document.querySelector('.ui-area-text'); if (jdCartAddressElement) { jdCartAddressElement.innerText = fakeAddress1 + " " + fakeAddress2; } } break; case "detail.tmall.com": case "detail.tmall.hk": case "chaoshi.detail.tmall.com": case "item.taobao.com": // 淘宝/天猫样式 - 使用更泛用的选择器 // 方法1: 尝试使用包含select-trigger的选择器 var taobaoAddressElement = document.querySelector("[class*='--select-trigger--']"); // 方法2: 尝试通过包含delivery-addr-wrap的父元素找到子元素 if (!taobaoAddressElement) { var addrWrap = document.querySelector("[class*='--delivery-addr-wrap--']"); if (addrWrap) { taobaoAddressElement = addrWrap.querySelector("[class*='--select-trigger--']"); } } // 方法3: 尝试寻找带有title属性的元素 if (!taobaoAddressElement) { var allElements = document.querySelectorAll("[title]"); for (var i = 0; i < allElements.length; i++) { var el = allElements[i]; if (el.textContent.trim().length < 20 && !el.querySelector("*")) { var parent = el.parentElement; if (parent && ( parent.className.includes("addr") || parent.className.includes("delivery") || parent.textContent.includes("至") )) { taobaoAddressElement = el; break; } } } } if (taobaoAddressElement) { var originalText = taobaoAddressElement.textContent.trim(); var replacementText = fakeAddress1; if (originalText.includes(' ') || originalText.length > 3) { replacementText = fakeAddress1 + " " + fakeAddress2; } taobaoAddressElement.textContent = replacementText; if (taobaoAddressElement.hasAttribute("title")) { taobaoAddressElement.title = replacementText; } } break; } }, addressSpoofingDelay); } })();