Greasy Fork

Greasy Fork is available in English.

Pinterest Ultra Assistant V6.5 (Ghost Stable)

Ghost Engine: One-Click Originals, AI 2x Sharpen, and Source Finder. Optimized for maximum stability.

当前为 2025-12-30 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         Pinterest Ultra Assistant V6.5 (Ghost Stable)
// @namespace    http://tampermonkey.net/
// @version      6.5
// @description  Ghost Engine: One-Click Originals, AI 2x Sharpen, and Source Finder. Optimized for maximum stability.
// @author       Pi Xiao
// @match        https://*.pinterest.com/*
// @grant        GM_openInTab
// @grant        GM_setClipboard
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    const BRIDGE_PAGE = "https://meishubiji.cn/ai-processing-center/";

    // --- 算法与颜色逻辑 (保持 V6.4 核心) ---
    function getColorDist(hex1, hex2) {
        const r1 = parseInt(hex1.slice(1,3), 16), g1 = parseInt(hex1.slice(3,5), 16), b1 = parseInt(hex1.slice(5,7), 16);
        const r2 = parseInt(hex2.slice(1,3), 16), g2 = parseInt(hex2.slice(3,5), 16), b2 = parseInt(hex2.slice(5,7), 16);
        return Math.sqrt((r1-r2)**2 * 0.3 + (g1-g2)**2 * 0.59 + (b1-b2)**2 * 0.11);
    }

    function rgbToHex(r, g, b) {
        return "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1).toUpperCase();
    }

    function getVividPalette(img) {
        try {
            const canvas = document.createElement('canvas');
            const ctx = canvas.getContext('2d');
            canvas.width = 100; canvas.height = 100;
            ctx.drawImage(img, 0, 0, 100, 100);
            const data = ctx.getImageData(0, 0, 100, 100).data;
            let colorMap = {};
            for (let i = 0; i < data.length; i += 12) {
                const r = data[i], g = data[i+1], b = data[i+2], a = data[i+3];
                if (a < 128) continue;
                const saturation = Math.max(r, g, b) - Math.min(r, g, b);
                const brightness = (r + g + b) / 3;
                let bias = (saturation > 40) ? 1 : 0.1;
                if (brightness < 30 || brightness > 230) bias = 0.2;
                const hex = rgbToHex(r, g, b);
                colorMap[hex] = (colorMap[hex] || 0) + (Math.pow(saturation, 2) * bias + 1);
            }
            const sortedColors = Object.keys(colorMap).sort((a, b) => colorMap[b] - colorMap[a]);
            const final = [];
            for (const c of sortedColors) {
                if (final.length >= 6) break;
                if (final.every(ec => getColorDist(ec, c) > 50)) final.push(c);
            }
            return final;
        } catch(e) { return []; }
    }

    // --- 预览窗逻辑 ---
    async function processAndShow(imgUrl) {
        const originalUrl = imgUrl.replace(/\/(236x|474x|564x|736x|1200x)\//, '/originals/').replace(/\.webp$/, '.jpg');
        const overlay = document.createElement('div');
        overlay.style = "position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.97);z-index:2147483647;display:flex;flex-direction:column;align-items:center;justify-content:center;color:white;font-family:sans-serif;cursor:zoom-out;";
        overlay.innerHTML = '<div style="text-align:center;"><div class="px-spin"></div><div style="margin-top:15px;font-size:14px;color:#00ffcc;">ANALYZING PIXELS...</div></div><style>.px-spin{width:30px;height:30px;border:2px solid rgba(0,255,204,0.1);border-top-color:#00ffcc;border-radius:50%;animation:spin .8s linear infinite;margin:0 auto;}@keyframes spin{to{transform:rotate(360deg)}}</style>';
        overlay.onclick = () => overlay.remove();
        document.body.appendChild(overlay);

        const img = new Image();
        img.crossOrigin = "Anonymous";
        img.src = originalUrl;
        img.onload = function() {
            const palette = getVividPalette(img);
            overlay.innerHTML = "";
            const container = document.createElement('div');
            container.style = "text-align:center;width:95%;height:90vh;display:flex;flex-direction:column;cursor:default;";
            container.onclick = (e) => e.stopPropagation();
            const scrollBox = document.createElement('div');
            scrollBox.style = "overflow:auto;border:1px solid #333;border-radius:12px;flex:1;background:#050505;display:flex;align-items:center;justify-content:center;";
            const pImg = document.createElement('img');
            pImg.src = originalUrl;
            pImg.style = "max-width:200%;image-rendering:-webkit-optimize-contrast;filter:contrast(1.05);";
            scrollBox.appendChild(pImg);

            const bar = document.createElement('div');
            bar.style = "padding:25px;display:flex;flex-direction:column;align-items:center;gap:20px;background:#0a0a0a;";
            let palHTML = '<div style="display:flex;gap:12px;align-items:center;"><span style="font-size:10px;color:#444;text-transform:uppercase;letter-spacing:1px;">Accents:</span>';
            palette.forEach(c => { palHTML += `<div class="px-c" style="width:28px;height:28px;background:${c};border-radius:6px;cursor:pointer;border:2px solid #222;" data-hex="${c}"></div>`; });
            palHTML += '</div>';
            bar.innerHTML = palHTML + `<div><button id="px-go" style="background:linear-gradient(45deg,#6a11cb 0%,#2575fc 100%);color:white;border:none;padding:14px 50px;border-radius:50px;font-size:15px;font-weight:bold;cursor:pointer;box-shadow:0 10px 30px rgba(37,117,252,0.3);">🚀 LAUNCH AI 8K ENGINE</button></div>`;
            
            container.appendChild(scrollBox);
            container.appendChild(bar);
            overlay.appendChild(container);
            
            overlay.querySelectorAll('.px-c').forEach(el => {
                el.onclick = () => { GM_setClipboard(el.dataset.hex); el.style.borderColor = "#fff"; setTimeout(()=>el.style.borderColor="#222",500); };
            });
            overlay.querySelector('#px-go').onclick = () => window.open(`${BRIDGE_PAGE}?url=${encodeURIComponent(originalUrl)}`, '_blank');
        };
        img.onerror = () => { window.open(originalUrl, '_blank'); overlay.remove(); };
    }

    // --- 核心注入逻辑:Ghost 模式 ---
    function injectButtons() {
        try {
            const images = document.querySelectorAll('img[src*="pinimg.com"]');
            images.forEach(img => {
                if (img.width < 100 || img.closest('.px-helper-bar')) return;
                
                // 更稳健的容器探测
                const container = img.closest('[data-test-id="pin-visual-wrapper"]') || 
                                  img.closest('[data-test-id="visual-content-container"]') ||
                                  img.closest('.XiG') || img.parentElement;

                if (container && container.tagName !== 'BODY') {
                    // 仅在必要时修改定位,避免触发 Pinterest 全量重绘
                    if (window.getComputedStyle(container).position === 'static') {
                        container.style.setProperty('position', 'relative', 'important');
                    }

                    const bar = document.createElement('div');
                    bar.className = 'px-helper-bar';
                    bar.style = "position:absolute;top:8px;left:8px;z-index:999;display:flex;gap:4px;opacity:0;transition:0.2s;pointer-events:auto;";
                    
                    container.addEventListener('mouseenter', () => bar.style.opacity = "1");
                    container.addEventListener('mouseleave', () => bar.style.opacity = "0");

                    const btnS = 'color:white;border:none;border-radius:4px;cursor:pointer;padding:4px 8px;font-weight:bold;font-size:9px;box-shadow:0 2px 5px rgba(0,0,0,0.3);white-space:nowrap;';
                    
                    const b1 = document.createElement('button'); b1.innerHTML = '🪄 2x HD'; b1.style = btnS + 'background:#00BFFF;';
                    b1.onclick = (e) => { e.preventDefault(); e.stopPropagation(); processAndShow(img.src); };
                    
                    const b2 = document.createElement('button'); b2.innerHTML = '🖼️ Originals'; b2.style = btnS + 'background:#E60023;';
                    b2.onclick = (e) => { e.preventDefault(); e.stopPropagation(); window.open(img.src.replace(/\/(236x|474x|564x|736x)\//, '/originals/'), '_blank'); };

                    const b3 = document.createElement('button'); b3.innerHTML = '🔍 Source'; b3.style = btnS + 'background:#34a853;';
                    b3.onclick = (e) => { e.preventDefault(); e.stopPropagation(); window.open(`https://lens.google.com/uploadbyurl?url=${encodeURIComponent(img.src.replace(/\/(236x|474x|564x|736x)\//, '/originals/'))}`, '_blank'); };

                    bar.append(b1, b2, b3);
                    container.appendChild(bar);
                }
            });
        } catch (e) { console.error("Injection error skipped."); }
    }

    // --- 启动流程:避开加载高峰 ---
    window.addEventListener('load', () => {
        // 等待 2 秒,确保 Pinterest 的 JS 引擎已经跑顺了
        setTimeout(() => {
            injectButtons();
            const obs = new MutationObserver(injectButtons);
            obs.observe(document.body, { childList: true, subtree: true });
            setInterval(injectButtons, 3000);
        }, 2000);
    });

})();