辅助工具
// ==UserScript== // @name 预发映射警告 // @namespace http://tampermonkey.net/ // @version 2025-01-02 // @description 辅助工具 // @author mocobk // @match *://tmesaas-pre.tencentmusic.com/* // @icon https://www.google.com/s2/favicons?sz=64&domain=tencentmusic.com // @grant none // @license MIT // ==/UserScript== const isDebugger = false; function log(...message){ if (isDebugger){ console.log(...message); } } function getElementBySelector(selector, parentNode = null) { log("getElementBySelector", selector, parentNode); return (parentNode || document).querySelector(selector); } function findElement(callback, timeout = 10000, interval = 500) { const startTime = Date.now(); return new Promise(function (resolve, reject) { const intervalHandler = setInterval(function () { const el = callback(); if (el) { resolve(el); clearInterval(intervalHandler); } if (Date.now() - startTime >= timeout) { resolve(null); clearInterval(intervalHandler); } }, interval); }); } async function findElementBySelector(selector, parentNode = null, timeout = 10000, interval = 500) { log("findElementBySelector", selector); const r###lt = await findElement(() => getElementBySelector(selector, parentNode), timeout, interval); if (r###lt) { return r###lt; } else { log("Error: findElementBySelector failed", selector); return null; } } async function addWarningBlock() { const warningBlock = document.querySelector('#warningBlock'); if (warningBlock){ return } const logo = await findElementBySelector('.ant-pro-global-header-logo'); if(logo){ log('添加警告'); const div = document.createElement('div'); div.setAttribute('id', 'warningBlock'); div.innerHTML = `<div style="padding: 10px;display: flex;height: 40px;color: #fe4a4a;font-size: 20px;background: #fcd6d6;border-radius: 20px;align-items: center;">当前预发环境存在映射,请勿操作写数据!</div>`; logo.after(div); } } async function removeWarningBlock() { const warningBlock = document.querySelector('#warningBlock'); if (warningBlock){ warningBlock.remove(); } } async function hasUserMapping() { const token = localStorage.getItem('tme-header-token') if (!token) { return false } const response = await fetch('https://tmesaas-pre.tencentmusic.com/openapi/musician/companySaas/user/getMyUserInfo', { headers: { 'content-type': 'application/json', 'tme-header-token': token} }) const data = await response.json() const departmentTreeName = data?.data?.departmentTreeName log('预发环境saas ->', departmentTreeName) return !departmentTreeName.startsWith('预发环境saas') } async function handleWarning() { const isMapping = await hasUserMapping(); if (!isMapping){ log('账号无有映射'); await removeWarningBlock(); return } log('账号有映射'); await addWarningBlock(); } (async function() { 'use strict'; // Your code here... log('==============SaaS 预发映射警告=============='); handleWarning(); setInterval(handleWarning, 10000) })();