// ==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 = ''
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,
})
}
})();