白嫖NodeLoc装饰

免费使用装饰店的头像边框、用户名颜色特效、用户卡背景图片

// ==UserScript==
// @name         白嫖NodeLoc装饰
// @namespace    QQ:94575594
// @version      1.4
// @description  免费使用装饰店的头像边框、用户名颜色特效、用户卡背景图片
// @author       chendaye
// @grant        GM_addStyle
// @match        https://www.nodeloc.com/*
// @run-at       document-end
// @icon         https://favicon.im/www.nodeloc.com
// @license MIT
// ==/UserScript==

(function () {
  const config = {
    userName: "meihang",
    delay: 500
  };

  const debounce = (func, delay) => {
    let timeout;
    return (...args) => {
      clearTimeout(timeout);
      timeout = setTimeout(() => func.apply(this, args), delay);
    };
  };

  const replaceUserName = node => {
    if (node == null) document.querySelectorAll(`[username="${config.userName}"]`).forEach(item => replaceUserName(item));
    else {
      let lable = node.parentNode.querySelector(".username");
      if (!lable) {
        replaceUserName(node.parentNode);
      } else {
        if (lable.querySelector(localStorage.userNameStyle)) {
          return;
        }
        lable.className = "username " + localStorage.userNameStyle;
      }
    }
  };

  const insertBtn = () => {
    document.querySelectorAll(".DecorationStoreLabel").forEach(label => {
      if (label.querySelector(".btnPiao")) return;

      if (label.previousElementSibling.querySelector(".DecorationItemAvatarImage")) {
        const btn = Object.assign(document.createElement("button"), {
          className: "btnPiao DecorationItemLabel",
          innerHTML: "白嫖头像边框",
          onclick: e => handleImageStorage(label, e)
        });

        label.appendChild(btn);
      } else if (label.previousElementSibling.querySelector(".decorationItemUsernameColorStyle")) {
        const btn = Object.assign(document.createElement("button"), {
          className: "btnPiao DecorationItemLabel",
          innerHTML: "白嫖用户名颜色",
          onclick: e => handleUserNameStyle(label, e)
        });

        label.appendChild(btn);
      } else if (label.previousElementSibling.querySelector(".DecorationItemProfileBackgroundImage")) {
        const btn = Object.assign(document.createElement("button"), {
          className: "btnPiao DecorationItemLabel",
          innerHTML: "白嫖用户卡背景",
          onclick: e => handleUserBackGroundImg(label, e)
        });

        label.appendChild(btn);
      } else if (label.previousElementSibling.querySelector(".DecorationItemProfileBackgroundVideo")) {
        const btn = Object.assign(document.createElement("button"), {
          className: "btnPiao DecorationItemLabel",
          innerHTML: "白嫖用户卡背景",
          onclick: e => handleUserBackGroundVideo(label, e)
        });

        label.appendChild(btn);
      }
    });
  };

  const handleUserNameStyle = (label, event) => {
    try {
      // 阻止事件冒泡
      if (event.stopPropagation) {
        event.stopPropagation();
      } else {
        event.cancelBubble = true;
      }
      const container = label.closest(".DecorationStoreContainer");
      const style = container?.querySelector(".decorationItemUsernameColorStyle div");
      localStorage.userNameStyle = style.className;
      alert("白嫖成功");
    } catch (e) {
      console.error("白嫖失败:", e);
    }
    replaceUserName();
  };

  const handleImageStorage = (label, event) => {
    try {
      // 阻止事件冒泡
      if (event.stopPropagation) {
        event.stopPropagation();
      } else {
        event.cancelBubble = true;
      }
      const container = label.closest(".DecorationStoreContainer");
      const img = container?.querySelector(".DecorationItemAvatarImage");

      if (img?.src) {
        localStorage.avatarUrl = img.src;
      }
      alert("白嫖成功");
    } catch (e) {
      console.error("白嫖失败:", e);
    }
    replaceAvatar();
  };

  const handleUserBackGroundImg = (label, event) => {
    try {
      // 阻止事件冒泡
      if (event.stopPropagation) {
        event.stopPropagation();
      } else {
        event.cancelBubble = true;
      }
      let container;
      let imgSrc = "";
      if (
        label.previousElementSibling.childNodes.length &&
        label.previousElementSibling.childNodes[0].className === "DecorationItemProfileBackgroundImage"
      ) {
        container = label.previousElementSibling.childNodes[0];
        if (container) {
          imgSrc = container?.style.backgroundImage;
        }
      }
      localStorage.backgroundImgUrl = imgSrc;
      alert("白嫖成功");
    } catch (e) {
      console.error("白嫖失败:", e);
    }
    replaceBgImg();
  };

  const handleUserBackGroundVideo = (label, event) => {
    try {
      // 阻止事件冒泡
      if (event.stopPropagation) {
        event.stopPropagation();
      } else {
        event.cancelBubble = true;
      }
      let container;
      let imgSrc = "";
      if (
        label.previousElementSibling.childNodes.length &&
        label.previousElementSibling.childNodes[0].className === "DecorationItemProfileBackgroundVideo"
      ) {
        container = label.previousElementSibling.childNodes[0].childNodes[0];
        if (container) {
          imgSrc = container.src;
        }
      }
      localStorage.backgroundImgUrl = imgSrc;
      alert("白嫖成功");
    } catch (e) {
      console.error("白嫖失败:", e);
    }
    replaceBgImg();
  };

  const replaceAvatar = () => {
    const storedSrc = localStorage.avatarUrl;
    if (!storedSrc) return;

    document.querySelectorAll(`[username="${config.userName}"]`).forEach(userContainer => {
      const images = userContainer.querySelectorAll("img");
      images.forEach(img => {
        if (img.src !== storedSrc) {
          img.src = storedSrc;
        }
      });
    });
  };

  const replaceBgImg = () => {
    const storedSrc = localStorage.backgroundImgUrl;
    if (!storedSrc) return;
    document.getElementsByClassName("username").textContent = "";
    document.querySelectorAll(`[username="${config.userName}"]`).forEach(userContainer => {
      let cardElement = userContainer.closest(".UserCard");
      if (cardElement && !cardElement.querySelector("video")) {
        if (cardElement) {
          if (storedSrc.includes("mp4")) {
            cardElement.style.background = "transparent";
            cardElement.style.overflow = "hidden";
            console.log(cardElement.offsetWidth);
            const video = document.createElement("video");
            video.src = storedSrc;
            video.addEventListener("loadedmetadata", () => {
              if (video.videoWidth / video.videoHeight < cardElement.offsetWidth / cardElement.offsetHeight) {
                video.style.width = "100%";
                video.style.height = "auto";
              } else {
                video.style.width = "auto";
                video.style.height = "100%";
              }
            });
            video.autoplay = true;
            video.loop = true;
            video.muted = true;
            video.playsinline = true;
            video.controls = false;
            video.style.position = "absolute";
            video.style.top = "0";
            video.style.left = "50%";
            video.style.right = "50%";
            video.style.zIndex = "-1";
            video.style.transform = "translateX(-50%)";
            if (cardElement.className.includes("UserHero")) {
              cardElement.style.position = "relative";
              video.style.left = "0";
              video.style.right = "0%";
              video.style.width = "100%";
              video.style.height = "unset";
              video.style.transform = "translateY(-50%)";
            }
            cardElement.appendChild(video);
          } else {
            cardElement.style.backgroundImage = storedSrc;
            cardElement.style = `background-image: ${storedSrc}; background-size: cover; background-position: center;`;
          }
        }
      }
    });
  };
  const begin = () => {
    replaceAvatar();
    replaceUserName();
    replaceBgImg();
    insertBtn();
  };
  const observer = new MutationObserver(
    debounce(mutationsList => {
      mutationsList.forEach(mutation => {
        if (mutation.type === "childList") {
          mutation.addedNodes.forEach(node => {
            begin();
          });
        }
      });
    }, config.delay)
  );

  observer.observe(document.body, {
    childList: true,
    subtree: true
  });

  begin();

  GM_addStyle(`
        @keyframes slideIn {
            from { transform: translateX(100%); }
            to { transform: translateX(0); }
        }
        .btnPiao {
            background: blue;
            border: none;
            color: white !important;
            cursor: pointer;
            transition: all 0.3s;
            margin-left: 5px;
        }
        .btnPiao:hover {
            transform: translateY(-1px);
            box-shadow: 0 4px 12px #4834d4;
        }
    `);
})();