Greasy Fork is available in English.

Pinterest Copy Links

点击复制到剪贴板,多次点击多次累积;右下角问号出重置,点重置清理剪贴板。

// ==UserScript==
// @name         Pinterest Copy Links
// @namespace    http://leizingyiu.net/
// @version      20241125
// @description  点击复制到剪贴板,多次点击多次累积;右下角问号出重置,点重置清理剪贴板。
// @author       leizingyiu
// @match        *://*.pinterest.*/*
// @grant        GM_setClipboard
// @license     GNU AGPLv3
// ==/UserScript==

(function () {
    'use strict';

    let clipboardContent = ''; // 用于累积复制的链接

  // let hoverstyle = document.createElement('style');
  // hoverstyle.innerText=`
  // [data-test-id]:hover .copy-link-btn{
  // opacity:1;
  // }`;
  // document.body.appendChild(hoverstyle);

    var 样式名称='yiu_pin_copying';
    // 为每个项目添加复制链接按钮
    function addCopyButton() {
      if(!document.body.classList.contains(样式名称)){
        return ;
      }
        const items = document.querySelectorAll('[data-test-id="pin"]'); // 定位到瀑布流项
        items.forEach((item) => {
            // 检查是否已添加按钮
            if (item.querySelector('.copy-link-btn')) return;

            // 获取超链接
            const linkElement = item.querySelector('a[href]');
            if (!linkElement) return;

            const href = linkElement.href;

            // 创建按钮
            const copyButton = document.createElement('button');
            copyButton.textContent = '复制链接';
            copyButton.className = 'copy-link-btn';

            copyButton.style.display = 'block';
            copyButton.style.marginTop = '8px';
            copyButton.style.backgroundColor = '#E60023';
            copyButton.style.color = 'white';
            copyButton.style.border = 'none';
            copyButton.style.borderRadius = '26px';
            copyButton.style.padding = '6px 12px';
            copyButton.style.cursor = 'pointer';
            copyButton.style.fontSize = '14px';
            copyButton.style.opacity=0;
            copyButton.style.transition='opacity ease 0.4s';

            // 按钮点击逻辑
            copyButton.addEventListener('click', (e) => {
                // clipboardContent += clipboardContent ? `\n${href}` : href; // 累积链接
              clipboardContent=clipboardContent.split('\n');
              clipboardContent.push(href);
              clipboardContent=[...new Set(clipboardContent)];
              clipboardContent=clipboardContent.join('\n');


               copyButton.style.opacity='0!important';
              copyButton.textContent = '复制链接✅';
              console.log(copyButton,copyButton.style.opacity);
            setTimeout(()=>{
              copyButton.style.opacity='1!important';
              copyButton.textContent = '复制链接';
              console.log(copyButton,copyButton.style.opacity);
            },500);
               GM_setClipboard(clipboardContent); // 复制到剪贴板
                // alert(`链接已复制:\n${href}`);
            });

            // 将按钮插入到项目中
            const saveButton = item.querySelector('button'); // 保存按钮
            if (saveButton) {
                saveButton.parentNode.appendChild(copyButton);
            }
          setTimeout(()=>{
            copyButton.style.opacity=1;
                      },1);
        });
    }

    // 创建问号和重置按钮
    function createResetButton() {
        // 问号容器
        const helpContainer = document.createElement('div');
        helpContainer.style.position = 'fixed';
        helpContainer.style.bottom = '20px';
        helpContainer.style.right = '20px';
        helpContainer.style.zIndex = '9999';
        helpContainer.style.cursor = 'pointer';

        const helpIcon = document.createElement('div');
        helpIcon.textContent = '?';
        helpIcon.style.width = '40px';
        helpIcon.style.height = '40px';
        helpIcon.style.borderRadius = '50%';
        helpIcon.style.backgroundColor = '#E60023';
        helpIcon.style.color = 'white';
        helpIcon.style.display = 'flex';
        helpIcon.style.justifyContent = 'center';
        helpIcon.style.alignItems = 'center';
        helpIcon.style.fontSize = '24px';
        helpIcon.style.fontWeight = 'bold';
        helpIcon.style.transition = 'all 0.3s';

        // 重置按钮
        const resetButton = document.createElement('button');
        resetButton.textContent = '重置剪贴板';
        resetButton.style.position = 'absolute';
        resetButton.style.width = '10em';
        resetButton.style.right = '60px';
        resetButton.style.bottom = '0';
        resetButton.style.backgroundColor = '#FF4500';
        resetButton.style.color = 'white';
        resetButton.style.border = 'none';
        resetButton.style.borderRadius = '4px';
        resetButton.style.padding = '8px 12px';
        resetButton.style.cursor = 'pointer';
        resetButton.style.fontSize = '14px';
        resetButton.style.opacity = '0';
        resetButton.style.transition = 'opacity 0.3s';
        resetButton.style.pointerEvents = 'none';

        // 问号 hover 显示按钮
        helpIcon.addEventListener('mouseover', () => {
            resetButton.style.opacity = '1';
            resetButton.style.pointerEvents = 'auto';
        });
        helpIcon.addEventListener('mouseout', () => {
            setTimeout(() => {
                if (!resetButton.matches(':hover')) {
                    resetButton.style.opacity = '0';
                    resetButton.style.pointerEvents = 'none';
                }
            }, 200);
        });

        // 鼠标移到按钮上保持显示
        resetButton.addEventListener('mouseover', () => {
            resetButton.style.opacity = '1';
            resetButton.style.pointerEvents = 'auto';
        });

        // 重置按钮点击逻辑
        resetButton.addEventListener('click', () => {
            clipboardContent = '';
            // alert('剪贴板已清空');
        });

        helpContainer.appendChild(helpIcon);
        helpContainer.appendChild(resetButton);
        document.body.appendChild(helpContainer);
    }

    // 初始化
    function init() {
        createResetButton();
        setInterval(addCopyButton, 250); // 定时检查新加载的项目


      // 监听键盘按键事件
    document.addEventListener('keydown', function (event) {
         if (event.altKey && event.code === 'KeyC') {
            const body = document.body;
            if (body.classList.contains(样式名称)) {
                body.classList.remove(样式名称);
             } else {
                body.classList.add(样式名称);
             }
             event.preventDefault();
        }
    });
document.body.classList.add(样式名称);


    }

    // 延迟等待页面加载完成
    window.addEventListener('load', init);
})();