// ==UserScript== // @name 虚空终端上传工具 // @namespace https://yinr.cc/ // @version 0.3.1 // @description 虚空终端上传工具,添加按钮方便上传数据至虚空终端(https://xk.jdsha.com/),同时在米游社通行证页面添加按钮获取祈愿查询链接 // @homepage https://greasyfork.org/zh-CN/scripts/454626 // @author Yinr // @license MIT // @icon https://xk.jdsha.com/static/assets/media/logos/favicon.ico // @match http*://bbs.mihoyo.com/ys* // @match http*://bbs.miyoushe.com/ys* // @match http*://user.mihoyo.com/* // @grant GM_registerMenuCommand // @grant GM_addStyle // @run-at document-end // @downloadURL none // ==/UserScript== (function() { 'use strict'; // Utils const launchObserver = ({ parentNode, selector, failCallback = null, successCallback = null, stopWhenSuccess = true, config = { childList: true, subtree: true } }) => { if (!parentNode) return const observeFunc = mutationList => { if (!document.querySelector(selector)) { if (failCallback) failCallback() return } if (stopWhenSuccess) observer.disconnect() mutationList.itemFilter = (fn, type = 'addedNodes') => mutationList.map(i => Array.from(i[type]).filter(fn)).reduce((arr, val) => arr.concat(val), []) if (successCallback) successCallback(mutationList) } const observer = new MutationObserver(observeFunc) observer.observe(parentNode, config) } // Main const host = document.location.host // 米游社 if (host === 'bbs.mihoyo.com') { // 虚空终端上传工具 // javascript:(function(){const s=document.createElement('script');s.src='https://t1.jdsha.com/hoyo/xk.js';document.body.append(s)})(); const xkUpload = () => { const s = document.createElement('script') s.src='https://t1.jdsha.com/hoyo/xk.js' document.body.append(s) } // 添加虚空菜单按钮 const xkUploadCommandId = GM_registerMenuCommand(`上传虚空数据`, () => xkUpload()) // 构建虚空页面按钮 const xkUploadButton = () => { const btn = document.createElement('li') btn.classList.add('header__nav') btn.innerHTML = '上传虚空' btn.addEventListener('click', () => xkUpload()) return btn } // 获取 Cookie 按钮 // modified from https://hut.ao/features/mhy-account-switch.html const getCookie = () => { if (null === document.cookie.match(/(?:^|;)\s*account_id\s*=\s*([^;]+)/)) { alert('无效的 Cookie , 请重新登录!'); } else { if (confirm('Cookie 已经成功获取, 点击确定将 Cookie 复制到剪贴板。')) { navigator.clipboard.writeText(document.cookie).then(() => { alert('Cookie 已成功复制到剪贴板!') }).catch(() => { prompt('复制 Cookie 出错,请手动复制输入框中的内容!', document.cookie) }) } } } // 添加获取 Cookie 菜单按钮 const getCookieCommandId = GM_registerMenuCommand(`获取 Cookie`, () => getCookie()) // 构建获取 Cookie 页面按钮 const getCookieButton = () => { const btn = document.createElement('li') btn.classList.add('header__nav') btn.innerHTML = '获取 Cookie' btn.addEventListener('click', () => getCookie()) return btn } const btnContainerSelector = 'div.header__avatarcontainer' const btnLogoutSelector = 'li.header__nav>span.header__logout' const addButton = () => { const container = document.querySelector(btnContainerSelector) const addBtnAct = mutationList => { if (document.querySelector('.header__uploadxk') !== null) return const logoutBtn = document.querySelector(btnLogoutSelector).parentElement // 添加虚空按钮 const xkBtn = xkUploadButton() logoutBtn.before(xkBtn) // 添加获取 Cookie 按钮 const cookieBtn = getCookieButton() logoutBtn.before(cookieBtn) GM_addStyle('.header__navitem--account .header__nav:nth-child(4) { padding-bottom: 0px; }') GM_addStyle(`.header__navitem--account .header__nav:nth-child(${4 + 2}) { padding-bottom: 10px; }`) } launchObserver({ parentNode: container, selector: btnLogoutSelector, successCallback: addBtnAct, stopWhenSuccess: false, }) } launchObserver({ parentNode: document, selector: btnContainerSelector, successCallback: addButton, }) } // 米哈游通行证 else if (host === 'user.mihoyo.com') { // 加载祈愿链接生成工具 // from https://feixiaoqiu.com/rank_url_upload_init/ // javascript:(function(){const s=document.createElement('script');s.src='https://ys.jdsha.com/static_js/ys.js';document.body.append(s)})(); const getGachaUrl = () => { const s = document.createElement('script') s.src='https://ys.jdsha.com/static_js/ys.js' document.body.append(s) } const sidebarSelector = 'div.mhy-sidebar>ul' const addGachaUrlButton = () => { const sidebar = document.querySelector(sidebarSelector) if (sidebar.querySelector('.icon-link') !== null) return const btn = document.createElement('li') btn.setAttribute('click-upload', '') btn.innerHTML = ' 获取祈愿记录' btn.addEventListener('click', () => getGachaUrl()) sidebar.append(btn) } launchObserver({ parentNode: document, selector: sidebarSelector, successCallback: addGachaUrlButton, }) } })();