您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
https://www.nodeloc.com 论坛在首页显示能量的脚本
// ==UserScript== // @name NL显示能量 // @namespace http://tampermonkey.net/ // @version 2025-08-15 001 // @description https://www.nodeloc.com 论坛在首页显示能量的脚本 // @author IWLZ // @match https://www.nodeloc.com/* // @match https://linux.do/* // @match https://clochat.com/* // @icon https://www.google.com/s2/favicons?sz=64&domain=nodeloc.com // @grant none // @license MIT // ==/UserScript== (function () { 'use strict'; console.log("NL能量显示脚本") let ifShowUpgradeProgress = false let userID = null if (window.location.origin == "https://www.nodeloc.com") { ifShowUpgradeProgress = true } function insertPowerEL() { let headerUL = document.getElementsByClassName("icons d-header-icons")[0] let newEle = document.createElement('li'); newEle.setAttribute('id', 'nodeScoreHeader_score_id'); newEle.setAttribute('style', `margin-left:12px;display: flex; align-items: center; justify-content: center;`) newEle.setAttribute('class', 'icon-header icon-header-small icon-header-link'); newEle.innerHTML = ` <button style=' color: green; width: auto;' id="nodeScoreHeader_id_val" class="btn no-text btn-icon ai-bot-button icon btn-flat" title="当前能量" type="button"> </button> ` newEle.addEventListener("mouseenter", () => { // console.log("鼠标移入 div"); getPower(userID) }); let upgradeIcon = null if (ifShowUpgradeProgress == true) { upgradeIcon = document.createElement('div'); upgradeIcon.setAttribute('style', ' width: 42px;') upgradeIcon.id = `upgradeIcon_id` upgradeIcon.innerHTML = ` <a role="tab" class="btn btn-flat btn-icon no-text user-menu-tab" id="home-user-menu-button-upgrade-progress" tabindex="-1" title="升级进度" aria-label="升级进度" aria-selected="false" aria-controls="quick-access-upgrade-progress" data-tab-number="6"> <svg class="fa d-icon d-icon-arrow-up svg-icon svg-string" aria-hidden="true" xmlns="http://www.w3.org/2000/svg"> <use href="#arrow-up"></use></svg> <!----> </a> ` upgradeIcon.addEventListener("mouseenter", () => { // console.log("鼠标移入 div"); showUpgradeDetail() }); upgradeIcon.addEventListener("mouseleave", () => { // console.log("鼠标移出 div"); hideUpgradeDetail() }); } if (headerUL) { if (ifShowUpgradeProgress == true) { headerUL.insertBefore(upgradeIcon, headerUL.firstChild); } headerUL.insertBefore(newEle, headerUL.firstChild); } if (ifShowUpgradeProgress == true) { insertUpgradeDetailEL() } } insertPowerEL() function getUserID() { let retryCount = 0; const maxRetries = 60; // 1分钟(60次) const retryInterval = setInterval(() => { try { let userImgBTN = document.getElementById("toggle-current-user"); if (userImgBTN) { let srcURL = userImgBTN.getElementsByTagName("img")[0].src; let srcArr = srcURL.split('/'); userID = srcArr[srcArr.length - 3]; clearInterval(retryInterval); if (typeof getPower === 'function') { getPower(userID); } } else if (retryCount >= maxRetries) { clearInterval(retryInterval); console.error("未找到userImgBTN元素,重试超时"); } retryCount++; } catch (err) { console.error(err); if (retryCount >= maxRetries) { clearInterval(retryInterval); } } }, 1000); // 每秒重试一次 } getUserID() getPower(userID) function getPower(userID) { if (userID == null) { // console.log("userID 为空") return } let url = `${window.location.origin}/u/${userID}.json` fetch(url) // 替换为实际的 URL .then(response => { if (!response.ok) { throw new Error('网络请求失败'); } return response.json(); // 或 response.text() 等 }) .then(data => { console.log(data.user.gamification_score); let score = data.user.gamification_score if (score) { if (document.getElementById("nodeScoreHeader_id_val")) { document.getElementById("nodeScoreHeader_id_val").innerText = score; } } }) .catch(error => { console.error('发生错误:', error); }); } function getUpgradeProgress(userID) { let url = `${window.location.origin}/u/${userID}/upgrade-progress.json` let divEL = document.getElementById('home-quick-access-upgrade-progress') divEL.innerHTML=`Loading...` fetch(url) // 替换为实际的 URL .then(response => { if (!response.ok) { throw new Error('网络请求失败'); } return response.json(); // 或 response.text() 等 }) .then(data => { // console.log(data); let unmet_conditionsEL = ` ` let met_conditionsEL = ` ` for (let i = 0; i < data.unmet_conditions.length; i++) { // console.log(i); unmet_conditionsEL += ` <li>${data.unmet_conditions[i]}</li> ` } for (let i = 0; i < data.met_conditions.length; i++) { met_conditionsEL += ` <li>${data.met_conditions[i]}</li> ` } divEL.innerHTML = ` <div class="upgrade-progress-panel"> <h3>下一等级:${data.next_level_name}</h3> <div class="upgrade-progress-bar"> <div class="progress" style="width: 86%;"></div> </div> <h4>未满足条件</h4> <ul> ${unmet_conditionsEL} </ul> <h4>已满足条件</h4> <ul> ${met_conditionsEL} </ul> </div> ` }) .catch(error => { console.error('发生错误:', error); }); } function insertUpgradeDetailEL() { let div = document.createElement("div"); div.id = `showUpgradeDetail_div` div.innerHTML = ` <div id="home-quick-access-upgrade-progress" class="quick-access-panel"> </div> ` div.setAttribute('style', ` position: absolute; background-color: #fafafa; box-shadow: rgba(0, 0, 0, 0.12) 0px 4px 16px; display:none; `) let upgradeIconEL = document.getElementById(`upgradeIcon_id`) upgradeIconEL.appendChild(div) } function showUpgradeDetail() { getUpgradeProgress(userID) // console.log(`showUpgradeDetail`) document.getElementById('showUpgradeDetail_div').style.display = 'flex' } function hideUpgradeDetail() { document.getElementById('showUpgradeDetail_div').style.display = 'none' } // Your code here... })();