Serial Code Tracker

Save and mark serial codes as used when accessed.

目前为 2025-01-06 提交的版本。查看 最新版本

// ==UserScript==
// @name           Serial Code Tracker
// @description    Save and mark serial codes as used when accessed.
// @description:ja アクセスされたシリアルコードを保存し、使用済みとしてマークします。
// @author         Ginoa AI
// @namespace      https://gf.qytechs.cn/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()); // デバッグ用
});

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址