CracksHash Magnet Getter with Popup Blocker

Adds a floating button that gets the magnet link when pressed and blocks pop-up windows

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         CracksHash Magnet Getter with Popup Blocker
// @namespace    http://tampermonkey.net/
// @version      1.7
// @description  Adds a floating button that gets the magnet link when pressed and blocks pop-up windows
// @author       ThatDudeJBob
// @match        *://crackshash.com/*
// @grant        none
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    // Configuration
    const buttonConfig = {
        text: localStorage.getItem('buttonText') || 'Click Magnet',
        backgroundColor: localStorage.getItem('buttonBgColor') || '#007bff',
        textColor: 'white',
        initialTop: localStorage.getItem('buttonTop') || '10px',
        initialRight: localStorage.getItem('buttonRight') || '10px'
    };

    // Helper function to create and style elements
    function createElement(type, styles, textContent = '') {
        const element = document.createElement(type);
        Object.assign(element.style, styles);
        element.textContent = textContent;
        return element;
    }

    // Function to show overlay warning
    function showOverlayWarning(message, type) {
        const overlay = createElement('div', {
            position: 'fixed',
            top: '10px',
            left: '50%',
            transform: 'translateX(-50%)',
            backgroundColor: type === 'error' ? 'rgba(245, 0, 0, 0.5)' : 'rgba(0, 0, 0, 0.5)',
            color: 'white',
            padding: '10px',
            borderRadius: '5px',
            zIndex: '1000',
            transition: 'opacity 1s',
            opacity: '1'
        }, message);
        document.body.appendChild(overlay);

        setTimeout(() => {
            overlay.style.opacity = '0';
            setTimeout(() => document.body.removeChild(overlay), 1000);
        }, 2000);
    }

    // Function to toggle settings menu visibility
    function toggleSettingsMenu() {
        settingsMenu.style.display = settingsMenu.style.display === 'none' ? 'block' : 'none';
    }

    // Save settings
    function saveSettings() {
        localStorage.setItem('buttonText', buttonTextInput.value);
        localStorage.setItem('buttonBgColor', buttonBgColorInput.value);
        localStorage.setItem('buttonTop', buttonTopInput.value + 'px');
        localStorage.setItem('buttonRight', buttonRightInput.value + 'px');
        button.innerText = buttonTextInput.value;
        button.style.backgroundColor = buttonBgColorInput.value;
        button.style.top = buttonTopInput.value + 'px';
        button.style.right = buttonRightInput.value + 'px';
        settingsMenu.style.display = 'none';
    }

    // Block pop-up windows, except for settings menu interactions
    function preventPopup(e) {
        if (e.target.tagName === 'A' && (e.target.href.startsWith('magnet:') || new URL(e.target.href).hostname === window.location.hostname)) {
            return;
        }

        if (settingsMenu.contains(e.target) || e.target === settingsButton) {
            return;
        }

        e.preventDefault();
    }

    // Create the floating button
    const button = createElement('button', {
        position: 'fixed',
        top: buttonConfig.initialTop,
        right: buttonConfig.initialRight,
        zIndex: '1000',
        backgroundColor: buttonConfig.backgroundColor,
        color: buttonConfig.textColor,
        border: 'none',
        padding: '10px',
        borderRadius: '5px',
        cursor: 'pointer',
        width: 'auto',
        whiteSpace: 'nowrap'
    }, buttonConfig.text);
    document.body.appendChild(button);

    // Create the settings button
    const settingsButton = createElement('button', {
        position: 'fixed',
        top: '10px',
        right: '50px', // Adjusted to avoid overlap
        zIndex: '1000',
        backgroundColor: '#555',
        color: 'white',
        border: 'none',
        padding: '10px',
        borderRadius: '5px',
        cursor: 'pointer',
        width: 'auto',
        whiteSpace: 'nowrap'
    }, '?');
    document.body.appendChild(settingsButton);

    // Create the settings menu
    const settingsMenu = createElement('div', {
        position: 'fixed',
        top: '40px',
        right: '10px',
        zIndex: '1000',
        backgroundColor: '#333',
        color: 'white',
        padding: '10px',
        borderRadius: '5px',
        display: 'none'
    });
    document.body.appendChild(settingsMenu);

    const buttonTextInput = createElement('input', { display: 'block', marginBottom: '10px' });
    buttonTextInput.type = 'text';
    buttonTextInput.placeholder = 'Button Text';
    buttonTextInput.value = buttonConfig.text;
    settingsMenu.appendChild(buttonTextInput);

    const buttonBgColorInput = createElement('input', { display: 'block', marginBottom: '10px' });
    buttonBgColorInput.type = 'color';
    buttonBgColorInput.value = buttonConfig.backgroundColor;
    settingsMenu.appendChild(buttonBgColorInput);

    const buttonTopInput = createElement('input', { display: 'block', marginBottom: '10px' });
    buttonTopInput.type = 'number';
    buttonTopInput.placeholder = 'Top Position (px)';
    buttonTopInput.value = parseInt(buttonConfig.initialTop, 10);
    settingsMenu.appendChild(buttonTopInput);

    const buttonRightInput = createElement('input', { display: 'block', marginBottom: '10px' });
    buttonRightInput.type = 'number';
    buttonRightInput.placeholder = 'Right Position (px)';
    buttonRightInput.value = parseInt(buttonConfig.initialRight, 10);
    settingsMenu.appendChild(buttonRightInput);

    const saveButton = createElement('button', {
        marginTop: '10px',
        backgroundColor: '#007bff',
        color: 'white',
        border: 'none',
        padding: '5px',
        borderRadius: '5px',
        cursor: 'pointer'
    }, 'Save');
    settingsMenu.appendChild(saveButton);

    settingsButton.addEventListener('click', toggleSettingsMenu);
    saveButton.addEventListener('click', saveSettings);

    document.addEventListener('click', (event) => {
        if (!settingsMenu.contains(event.target) && event.target !== settingsButton) {
            settingsMenu.style.display = 'none';
        }
    });

    // Add click event to the button
    button.addEventListener('click', () => {
        const magnetLink = document.querySelector('a[href^="magnet:"]');
        if (magnetLink) {
            const originalBeforeUnload = window.onbeforeunload; // Backup the original onbeforeunload handler
            window.onbeforeunload = null; // Allow navigation for this action
            magnetLink.click();
            window.onbeforeunload = originalBeforeUnload; // Restore the original handler
        } else {
            showOverlayWarning('No magnet link found on this page.', 'error');
        }
    });

    // Override window.open to detect blocked pop-ups
    const originalWindowOpen = window.open;
    window.open = function(url, name, specs) {
        const newWindow = originalWindowOpen(url, name, specs);
        if (!newWindow || newWindow.closed || typeof newWindow.closed === 'undefined') {
            showOverlayWarning('Blocked a pop-up window.', 'error');
        }
        return newWindow;
    };

    window.addEventListener('beforeunload', preventPopup);
    window.addEventListener('unload', preventPopup);
    document.addEventListener('click', preventPopup);
})();