Greasy Fork

Greasy Fork is available in English.

虚空终端上传工具

虚空终端上传工具,添加按钮方便上传数据至虚空终端(https://xk.jdsha.com/),同时在米游社通行证页面添加按钮获取祈愿查询链接

目前为 2022-12-03 提交的版本,查看 最新版本

// ==UserScript==
// @name         虚空终端上传工具
// @namespace    https://yinr.cc/
// @version      0.3.1
// @description  虚空终端上传工具,添加按钮方便上传数据至虚空终端(https://xk.jdsha.com/),同时在米游社通行证页面添加按钮获取祈愿查询链接
// @homepage     http://greasyfork.icu/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
// ==/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 = '<span class="header__navmore header__uploadxk">上传虚空</span>'
            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 = '<span class="header__navmore header__getcookie">获取 Cookie</span>'
            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 = '<i class="anticon mhy-icon sidebar-icon icon-link"></i> <span>获取祈愿记录</span>'
            btn.addEventListener('click', () => getGachaUrl())
            sidebar.append(btn)
        }

        launchObserver({
            parentNode: document,
            selector: sidebarSelector,
            successCallback: addGachaUrlButton,
        })
    }

})();