Greasy Fork

Greasy Fork is available in English.

我家在... 改

自动修改淘宝/天猫/京东等购物页面的"配送至"地址,在你分享商品截图的时候保护隐私。

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

})();