Pixiv 標籤提取器 (含複製功能)

Click a button to extract tags from the current Pixiv artwork and get a copy option. // 英文預設描述

当前为 2025-08-19 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Pixiv 標籤提取器 (含複製功能)
// @namespace    http://tampermonkey.net/
// @version      1.1
// @description  Click a button to extract tags from the current Pixiv artwork and get a copy option. // 英文預設描述
// @description.zh-TW  點擊按鈕後,獲取當前 Pixiv 作品的標籤,並提供複製選項。 // 繁體中文描述
// @description.zh-CN  点击按钮后,获取当前 Pixiv 作品的标签,并提供复制选项。 // 简体中文描述
// @author       您的名字
// @match        https://www.pixiv.net/artworks/*
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    // --- Modal 相關的 DOM 元素和函數 ---
    let tagModal = null;
    let tagTextarea = null;
    let copyButton = null;
    let closeButton = null;

    function createTagModal() {
        // 創建 Modal 的外層容器
        tagModal = document.createElement('div');
        tagModal.style.position = 'fixed';
        tagModal.style.top = '0';
        tagModal.style.left = '0';
        tagModal.style.width = '100%';
        tagModal.style.height = '100%';
        tagModal.style.backgroundColor = 'rgba(0, 0, 0, 0.5)'; // 半透明黑色背景
        tagModal.style.display = 'flex';
        tagModal.style.justifyContent = 'center';
        tagModal.style.alignItems = 'center';
        tagModal.style.zIndex = '10000'; // 確保在最上層

        // 創建 Modal 的內容區域
        const modalContent = document.createElement('div');
        modalContent.style.backgroundColor = '#fff';
        modalContent.style.padding = '30px';
        modalContent.style.borderRadius = '8px';
        modalContent.style.boxShadow = '0 4px 8px rgba(0,0,0,0.2)';
        modalContent.style.textAlign = 'center';
        modalContent.style.maxWidth = '500px';
        modalContent.style.width = '80%';

        // Modal 標題
        const modalTitle = document.createElement('h3');
        modalTitle.textContent = '提取到的作品標籤';
        modalTitle.style.marginBottom = '20px';
        modalTitle.style.color = '#333';
        modalContent.appendChild(modalTitle);

        // 顯示標籤的 textarea
        tagTextarea = document.createElement('textarea');
        tagTextarea.readOnly = true; // 設為唯讀
        tagTextarea.style.width = '100%';
        tagTextarea.style.minHeight = '150px';
        tagTextarea.style.marginBottom = '20px';
        tagTextarea.style.padding = '10px';
        tagTextarea.style.border = '1px solid #ccc';
        tagTextarea.style.borderRadius = '4px';
        tagTextarea.style.fontSize = '14px';
        tagTextarea.style.boxSizing = 'border-box'; // 確保 padding 不影響總寬度
        tagTextarea.style.resize = 'vertical'; // 允許垂直調整大小
        modalContent.appendChild(tagTextarea);

        // 創建按鈕容器
        const buttonContainer = document.createElement('div');
        buttonContainer.style.display = 'flex';
        buttonContainer.style.justifyContent = 'space-around'; // 按鈕之間均勻分布
        buttonContainer.style.marginTop = '15px';

        // 複製按鈕
        copyButton = document.createElement('button');
        copyButton.textContent = '複製到剪貼簿';
        copyButton.style.padding = '10px 20px';
        copyButton.style.backgroundColor = '#28a745'; // 綠色
        copyButton.style.color = 'white';
        copyButton.style.border = 'none';
        copyButton.style.borderRadius = '5px';
        copyButton.style.cursor = 'pointer';
        copyButton.style.fontSize = '16px';
        copyButton.addEventListener('click', copyTagsToClipboard);
        buttonContainer.appendChild(copyButton);

        // 關閉按鈕
        closeButton = document.createElement('button');
        closeButton.textContent = '關閉';
        closeButton.style.padding = '10px 20px';
        closeButton.style.backgroundColor = '#6c757d'; // 灰色
        closeButton.style.color = 'white';
        closeButton.style.border = 'none';
        closeButton.style.borderRadius = '5px';
        closeButton.style.cursor = 'pointer';
        closeButton.style.fontSize = '16px';
        closeButton.addEventListener('click', hideTagModal);
        buttonContainer.appendChild(closeButton);

        modalContent.appendChild(buttonContainer);
        tagModal.appendChild(modalContent);

        // 將 Modal 添加到頁面
        document.body.appendChild(tagModal);
    }

    function showTagModal(tags) {
        if (!tagModal) {
            createTagModal();
        }
        tagTextarea.value = tags.join('\n');
        tagModal.style.display = 'flex'; // 顯示 Modal
    }

    function hideTagModal() {
        if (tagModal) {
            tagModal.style.display = 'none'; // 隱藏 Modal
        }
    }

    function copyTagsToClipboard() {
        if (tagTextarea) {
            tagTextarea.select(); // 選取 textarea 中的所有文字
            try {
                // 使用 navigator.clipboard API 進行複製 (較新且推薦的方式)
                navigator.clipboard.writeText(tagTextarea.value).then(() => {
                    // 複製成功後的提示
                    copyButton.textContent = '已複製!';
                    copyButton.style.backgroundColor = '#17a2b8'; // 淺藍色表示成功
                    setTimeout(() => {
                        copyButton.textContent = '複製到剪貼簿';
                        copyButton.style.backgroundColor = '#28a745'; // 恢復原色
                    }, 2000);
                }).catch(err => {
                    console.error('複製失敗:', err);
                    // 複製失敗的提示
                    copyButton.textContent = '複製失敗';
                    copyButton.style.backgroundColor = '#dc3545'; // 紅色表示失敗
                    setTimeout(() => {
                        copyButton.textContent = '複製到剪貼簿';
                        copyButton.style.backgroundColor = '#28a745'; // 恢復原色
                    }, 2000);
                });
            } catch (e) {
                // 舊瀏覽器或無效上下文的回退方式
                const textArea = document.createElement("textarea");
                textArea.value = tagTextarea.value;
                textArea.style.position = "fixed";
                textArea.style.left = "-9999px";
                document.body.appendChild(textArea);
                textArea.select();
                try {
                    document.execCommand('copy');
                    copyButton.textContent = '已複製!';
                    copyButton.style.backgroundColor = '#17a2b8';
                    setTimeout(() => {
                        copyButton.textContent = '複製到剪貼簿';
                        copyButton.style.backgroundColor = '#28a745';
                    }, 2000);
                } catch (err) {
                    console.error('複製失敗 (execCommand):', err);
                    copyButton.textContent = '複製失敗';
                    copyButton.style.backgroundColor = '#dc3545';
                    setTimeout(() => {
                        copyButton.textContent = '複製到剪貼簿';
                        copyButton.style.backgroundColor = '#28a745';
                    }, 2000);
                }
                document.body.removeChild(textArea);
            }
        }
    }

    // --- 主要腳本邏輯 ---

    // 創建一個按鈕來觸發標籤提取
    const extractButton = document.createElement('button');
    extractButton.textContent = '獲取作品標籤';

    // 設定按鈕的樣式,使其固定在頁面右上角
    extractButton.style.position = 'fixed';
    extractButton.style.top = '10px';
    extractButton.style.right = '10px';
    extractButton.style.zIndex = '1000'; // 確保按鈕在最上層
    extractButton.style.padding = '10px 15px';
    extractButton.style.backgroundColor = '#007bff'; // 藍色背景
    extractButton.style.color = 'white'; // 白色文字
    extractButton.style.border = 'none';
    extractButton.style.borderRadius = '5px';
    extractButton.style.cursor = 'pointer';
    extractButton.style.fontSize = '16px';

    // 為按鈕添加點擊事件監聽器
    extractButton.addEventListener('click', function() {
        // 查找所有具有特定類別的標籤元素
        const tagElements = document.getElementsByClassName('gtm-new-work-tag-event-click');
        const tags = [];

        // 遍歷找到的所有標籤元素
        for (let i = 0; i < tagElements.length; i++) {
            // 獲取每個標籤的文字內容 (例如 "バニー")
            tags.push(tagElements[i].textContent);
        }

        // 在瀏覽器控制台中顯示提取到的標籤
        console.log('提取到的標籤:', tags);

        // 顯示自定義 Modal
        if (tags.length > 0) {
            showTagModal(tags);
        } else {
            alert('未找到任何標籤。'); // 如果沒有找到標籤,仍然使用 alert
        }
    });

    // 將按鈕添加到頁面的 body 中
    document.body.appendChild(extractButton);

})();