Greasy Fork

Greasy Fork is available in English.

夸克懒得点 (屏蔽版)

夸克懒得点.. 修复误判,组合“头像Hash+昵称”进行精准屏蔽

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         夸克懒得点 (屏蔽版)
// @namespace    http://greasyfork.icu/users/158417
// @version      0.19
// @description  夸克懒得点.. 修复误判,组合“头像Hash+昵称”进行精准屏蔽
// @author       JIEMO
// @match        *://pan.quark.cn/*
// @icon         https://pan.quark.cn/favicon.ico
// @license      GPL-3.0 License
// @run-at       document-end
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_registerMenuCommand
// @grant        GM_unregisterMenuCommand
// ==/UserScript==

(function() {
    'use strict';

    // 数据存储键名 (升级为v2,避免与旧版纯Hash数据冲突)
    const STORAGE_KEY = "blocked_users_v2";
    const DEFAULT_BLOCKED = [];

    // ============================================================
    // 1. 基础工具
    // ============================================================

    function getBlockedList() {
        return GM_getValue(STORAGE_KEY, DEFAULT_BLOCKED);
    }

    function setBlockedList(list) {
        GM_setValue(STORAGE_KEY, list);
    }

    // 字符串转 Hash 算法
    function computeStringHash(str) {
        if (!str) return "null";
        let hash = 0;
        for (let i = 0; i < str.length; i++) {
            const char = str.charCodeAt(i);
            hash = (hash << 5) - hash + char;
            hash |= 0;
        }
        return "u" + Math.abs(hash);
    }

    // ============================================================
    // 2. 核心逻辑:提取分享者信息
    // ============================================================

    // 获取【分享信息区域】内的完整特征
    function getTargetSharerInfo() {
        // 1. 定位分享信息容器 (关键!限定范围)
        const shareContainer = document.querySelector('.share-info-wrap');
        if (!shareContainer) {
            return null;
        }

        // 2. 获取头像 Hash
        const imgElement = shareContainer.querySelector('img');
        if (!imgElement || !imgElement.src) {
            return null;
        }
        const hashID = computeStringHash(imgElement.src);

        // 3. 获取用户昵称
        // 根据你的需求:<div class="author-name ">名称</div>
        const nameElement = shareContainer.querySelector('.author-name');
        let nickName = "Unknown";
        if (nameElement) {
            nickName = nameElement.innerText.trim();
        } else {
            // 备用方案:有时候可能没有author-name类,尝试找类似结构的文本
            const possibleNames = shareContainer.querySelectorAll('div');
            if(possibleNames.length > 1) {
                nickName = possibleNames[1].innerText.trim(); // 盲猜第二个div是名字
            }
        }

        // 在控制台打印,方便调试
        console.log(`[夸克懒得点] 捕获分享者: [昵称: ${nickName}] [Hash: ${hashID}]`);

        return {
            name: nickName,
            hash: hashID
        };
    }

    // ============================================================
    // 3. UI 交互
    // ============================================================

    function showBlockedOverlay(user) {
        var overlay = document.createElement('div');
        Object.assign(overlay.style, {
            position: 'fixed', top: '0', left: '0', width: '100%', height: '100%',
            backgroundColor: 'rgba(0, 0, 0, 0.95)', zIndex: '999999',
            display: 'flex', justifyContent: 'center', alignItems: 'center', flexDirection: 'column'
        });

        var text = document.createElement('h1');
        text.innerText = "⚠️ 已屏蔽该分享者";
        text.style.cssText = "color: red; font-size: 60px; font-weight: bold; text-shadow: 2px 2px 10px black; margin: 0;";

        var subText = document.createElement('div');
        subText.innerHTML = `<p style='font-size:24px; color:white'>昵称:<span style='color:#ff6a00'>${user.name}</span></p>
                             <p style='font-size:16px; color:#888'>Hash:${user.hash}</p>`;
        subText.style.textAlign = 'center';
        subText.style.marginTop = '20px';

        var unlockBtn = document.createElement('button');
        unlockBtn.innerText = "本次临时允许 (点击消失)";
        unlockBtn.style.cssText = "margin-top: 30px; padding: 10px 20px; cursor: pointer; background: #333; color: #fff; border: 1px solid #666;";
        unlockBtn.onclick = function() { overlay.remove(); };

        overlay.appendChild(text);
        overlay.appendChild(subText);
        overlay.appendChild(unlockBtn);
        document.body.appendChild(overlay);
    }

    function registerMenus() {
        // 菜单:屏蔽当前
        GM_registerMenuCommand("🚫 屏蔽当前分享者 (昵称+头像)", function() {
            const currentUser = getTargetSharerInfo();
            if (!currentUser) {
                alert("❌ 无法定位 .share-info-wrap 区域。\n请确保页面已加载完毕,且当前是分享详情页。");
                return;
            }

            const list = getBlockedList();
            // 检查是否已存在 (必须名字和Hash都相同)
            const exists = list.some(u => u.name === currentUser.name && u.hash === currentUser.hash);

            if (exists) {
                alert(`用户 [${currentUser.name}] 已经在屏蔽列表中了。`);
            } else {
                list.push(currentUser);
                setBlockedList(list);
                if(confirm(`✅ 已添加屏蔽!\n\n昵称: ${currentUser.name}\nHash: ${currentUser.hash}\n\n是否立即刷新生效?`)) {
                    location.reload();
                }
            }
        });

        // 菜单:管理
        GM_registerMenuCommand("📋 管理屏蔽列表", function() {
            const list = getBlockedList();
            if (list.length === 0) {
                alert("屏蔽列表为空。");
                return;
            }

            // 构建显示列表
            let msg = "当前屏蔽列表 (请输入【序号】进行删除):\n----------------------\n";
            list.forEach((u, index) => {
                msg += `【${index + 1}】 昵称: ${u.name}  (Hash: ${u.hash})\n`;
            });

            const input = prompt(msg + "\n----------------------\n请输入要删除的序号 (例如 1):");
            if (input) {
                const index = parseInt(input) - 1;
                if (!isNaN(index) && index >= 0 && index < list.length) {
                    const removed = list.splice(index, 1);
                    setBlockedList(list);
                    alert(`✅ 已移除: ${removed[0].name}\n刷新生效。`);
                    location.reload();
                } else {
                    alert("❌ 序号无效。");
                }
            }
        });
    }

    registerMenus();

    // ============================================================
    // 4. 主程序执行
    // ============================================================

    // 场景1:分享页面
    if (window.location.href.startsWith("https://pan.quark.cn/s/")) {

        window.onload = function() {
            // 稍微增加延迟,确保 share-info-wrap 渲染完成
            setTimeout(function() {

                // --- 步骤 A: 获取当前分享者信息 ---
                const currentUser = getTargetSharerInfo();

                // --- 步骤 B: 检查屏蔽列表 ---
                if (currentUser) {
                    const blockedList = getBlockedList();
                    // 核心判断:必须昵称和Hash同时匹配才算命中
                    const isBlocked = blockedList.some(u => u.name === currentUser.name && u.hash === currentUser.hash);

                    if (isBlocked) {
                        console.warn(`[夸克懒得点] 触发屏蔽!用户: ${currentUser.name}`);
                        showBlockedOverlay(currentUser);
                        return; // ⛔ 阻断后续操作
                    }
                } else {
                    console.log("[夸克懒得点] 未检测到分享者信息区域,跳过屏蔽检查。");
                }

                // --- 步骤 C: 自动转存 (未屏蔽时执行) ---
                console.log("[夸克懒得点] 检查通过,执行自动转存...");

                // 1. 勾选文件
                var checkboxElement = document.querySelector('.ant-checkbox-input');
                try {
                    if (checkboxElement && !checkboxElement.checked) {
                        checkboxElement.click();
                    }
                } catch (error) { console.error(error); }

                // 2. 点击保存
                var saveButtonElement = document.querySelector('.share-save');
                if (saveButtonElement) {
                    saveButtonElement.click();
                } else {
                    var saveButtonElement2 = document.querySelector('.file-info_r');
                    if (saveButtonElement2) {
                        saveButtonElement2.click();
                    }
                }

                // 3. 确认与跳转
                setTimeout(function() {
                    var confirmButtonElement = document.querySelector('.confirm-btn');
                    if (confirmButtonElement) {
                        confirmButtonElement.click();
                    }

                    var intervalId = setInterval(function() {
                        var viewButtonElement = document.querySelector('.path');
                        if (viewButtonElement) {
                            viewButtonElement.click();
                            clearInterval(intervalId);
                        }
                    }, 1000);
                }, 1000);

            }, 1500);
        };
    }

    // 场景2:列表页面 (保持原样)
    if (window.location.href.startsWith("https://pan.quark.cn/list")) {
        window.onload = function() {
            setTimeout(function() {
                var checkboxElement = document.querySelector('.ant-checkbox-wrapper');
                try {
                    if(checkboxElement) checkboxElement.click();
                } catch (error) {}
            }, 1000);
        };
    }

})();