【油猴脚本】白嫖NL装饰

脚本已更新

新增白嫖用户卡背景图片


```javascript
// ==UserScript==
// @name 白嫖NodeLoc装饰
// @namespace QQ:94575594
// @version 1.2
// @description 免费使用装饰店的头像边框、用户名颜色特效、用户卡背景图片
// @author chendaye
// @grant GM_addStyle
// @match https://www.nodeloc.com/*
// @run-at document-end
// @license MIT
// @downloadURL https://update.greasyfork.org/scripts/531714/白嫖NodeLoc装饰.user.js
// @updateURL https://update.greasyfork.org/scripts/531714/白嫖NodeLoc装饰.meta.js
// ==/UserScript==

(function() {

const config = {
userName: ‘替换为自己的用户名’,
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

} 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
  }
} 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
} 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
} 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
console.log(storedSrc)
document.getElementsByClassName(‘username’).textContent = ‘’
document.querySelectorAll([username="${config.userName}"]).forEach(userContainer => {
console.log(userContainer.closest(‘.UserCard’))
let cardElement = userContainer.closest(‘.UserCard’)
if (cardElement && !cardElement.querySelector(‘video’)) {
if (cardElement) {
if (storedSrc.includes(‘mp4’)) {
cardElement.style.background = ‘transparent’
cardElement.style.overflow = ‘hidden’
const video = document.createElement(‘video’)
video.src = storedSrc
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 = ‘0’
video.style.width = ‘100%’
video.style.zIndex = ‘-1’
if (cardElement.className.includes(‘UserHero’)) {
cardElement.style.position = ‘relative’
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: #4834d4; 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; } )
})()

```

NL会不会切换到discourse不好说

@“叫我沈同学”#p297489 :xhj23: