您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Save and mark serial codes as used when accessed.
当前为
// ==UserScript== // @name Serial Code Tracker // @description Save and mark serial codes as used when accessed. // @description:ja アクセスされたシリアルコードを保存し、使用済みとしてマークします。 // @author Ginoa AI // @namespace https://greasyfork.org/ja/users/119008-ginoaai // @version 1.0 // @match https://www.hoyolab.com/article/* // @grant GM_setValue // @grant GM_getValue // @grant GM_listValues // @icon https://pbs.twimg.com/profile_images/1648150443522940932/4TTHKbGo_400x400.png // ==/UserScript== // 保存されているコードの一覧を取得 function getSavedCodes() { return new Set(GM_listValues()); // Setを使って効率化 } // テキスト置換用の関数 function updateLinkText(node) { const savedCodes = getSavedCodes(); // 必要時に最新状態を取得 const links = node.querySelectorAll('a'); // 対象のaタグを取得 links.forEach((link) => { if (link.href.includes('code=')) { const url = new URL(link.href); const code = url.searchParams.get('code'); // codeパラメータを取得 if (savedCodes.has(code)) { link.textContent = 'アクセス済み'; // テキストを置換 } } }); } // 指定要素が存在するまで待機 function waitForElement(selector, callback) { const element = document.querySelector(selector); if (element) { callback(element); } else { const observer = new MutationObserver(() => { const element = document.querySelector(selector); if (element) { observer.disconnect(); callback(element); } }); observer.observe(document.body, { childList: true, subtree: true }); } } // クリックイベントでcodeを保存(ホイールクリック対応) document.addEventListener('mousedown', function (event) { if (event.button === 0 || event.button === 1) { // 左クリック (0) またはホイールクリック (1) const target = event.target.closest('a'); // aタグをクリックしたか確認 if (target && target.href.includes('code=')) { const url = new URL(target.href); const code = url.searchParams.get('code'); // codeパラメータを取得 if (code) { GM_setValue(code, true); // codeを保存 console.log(`Saved code: ${code}`); // 保存後に即時置換処理を実行 waitForElement('div[class="mhy-article-page__content"]', (ost) => { updateLinkText(ost); }); } } } }); // メイン処理 waitForElement('div[class="mhy-article-page__content"]', (ost) => { // 初期ロード時にテキストを置換 updateLinkText(ost); // DOM変更を監視して必要な部分のみ処理 const observer = new MutationObserver((mutations) => { for (const mutation of mutations) { for (const addedNode of mutation.addedNodes) { if (addedNode.nodeType === Node.ELEMENT_NODE) { updateLinkText(addedNode); // 追加された要素を処理 } } } }); observer.observe(ost, { childList: true, subtree: true }); // 必要に応じてsubtreeをtrueに console.log('Saved Codes:', getSavedCodes()); // デバッグ用 });