您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Block sites you want with your own description!
// ==UserScript== // @name SiteBlocker // @namespace https://github.com/asmagaa/SiteBlock // @version 1.2 // @description Block sites you want with your own description! // @author asmagaa // @match *://*/* // @grant GM_setValue // @grant GM_getValue // @grant GM_registerMenuCommand // @grant GM_deleteValue // @run-at document-idle // @license MIT // ==/UserScript== (function() { 'use strict'; const BLOCK_LIST_KEY = 'siteblocker_blocklist'; const TEMP_UNBLOCK_KEY = 'siteblocker_temp_unblock'; const TEMP_UNBLOCK_DURATION = 15 * 60 * 1000; const currentHost = window.location.hostname.replace(/^www\./, ''); const blockList = GM_getValue(BLOCK_LIST_KEY, {}); const tempUnblockTime = GM_getValue(TEMP_UNBLOCK_KEY, 0); const isTempUnblocked = tempUnblockTime && Date.now() < tempUnblockTime; if (blockList[currentHost] && !isTempUnblocked) { renderBlockPage(blockList[currentHost]); } else { setTimeout(renderControlPanel, 3000); } GM_registerMenuCommand('Manage Blocked Sites', openBlockListManager); GM_registerMenuCommand('Clear All Blocks', clearAllBlocks); function renderBlockPage(message) { const scrollPosition = window.scrollY; document.body.innerHTML = ` <div style=" position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: #fff; z-index: 999999; display: flex; flex-direction: column; justify-content: center; align-items: center; padding: 20px; box-sizing: border-box; font-family: Arial, sans-serif; text-align: center; "> <div style="max-width: 600px;"> <h1 style="color: #e74c3c; font-size: 2.5rem; margin-bottom: 20px;"> <span style="font-size: 3rem;">🚫</span> Site Blocked </h1> <div style=" background: #f9f9f9; border-left: 4px solid #e74c3c; padding: 15px; margin: 20px 0; text-align: left; "> <p style="margin: 0; font-size: 1.2rem;">${message || 'You blocked this site using SiteBlocker'}</p> </div> <div style="margin: 30px 0; display: flex; gap: 10px; flex-wrap: wrap; justify-content: center;"> <button id="siteblock-unblock-btn" style=" padding: 12px 25px; font-size: 1rem; background: #2ecc71; color: white; border: none; border-radius: 4px; cursor: pointer; font-weight: bold; "> Unblock for 15 Minutes </button> <button id="siteblock-manage-btn" style=" padding: 12px 25px; font-size: 1rem; background: #3498db; color: white; border: none; border-radius: 4px; cursor: pointer; "> Manage Blocked Sites </button> </div> <div style="margin-top: 30px; color: #7f8c8d; font-size: 0.9rem;"> <p>SiteBlocker is preventing you from accessing this site.</p> <p>You can temporarily unblock or manage your blocked sites.</p> </div> </div> </div> `; window.scrollTo(0, scrollPosition); document.getElementById('siteblock-unblock-btn').addEventListener('click', tempUnblock); document.getElementById('siteblock-manage-btn').addEventListener('click', openBlockListManager); } function renderControlPanel() { if (document.getElementById('siteblock-control-panel')) return; const panel = document.createElement('div'); panel.id = 'siteblock-control-panel'; panel.style.cssText = ` position: fixed; bottom: 20px; right: 20px; z-index: 999999; background: white; border-radius: 8px; box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2); padding: 20px; width: 300px; font-family: Arial, sans-serif; transition: transform 0.3s ease; `; panel.innerHTML = ` <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px;"> <h3 style="margin: 0; color: #2c3e50;">SiteBlocker</h3> <button id="siteblock-close-btn" style=" background: none; border: none; font-size: 1.2rem; cursor: pointer; color: #7f8c8d; ">×</button> </div> <p style="margin-top: 0; margin-bottom: 15px;"> Current site: <strong>${currentHost}</strong> </p> <textarea id="siteblock-reason" placeholder="Why do you want to block this site?" style="width: 100%; height: 80px; padding: 10px; margin-bottom: 15px; border: 1px solid #ddd; border-radius: 4px;"></textarea> <div style="display: flex; gap: 10px;"> <button id="siteblock-block-btn" style=" flex: 1; padding: 10px; background: #e74c3c; color: white; border: none; border-radius: 4px; cursor: pointer; font-weight: bold; ">Block This Site</button> </div> <div style="margin-top: 15px; text-align: center;"> <button id="siteblock-manage-link" style=" background: none; border: none; color: #3498db; cursor: pointer; font-size: 0.9rem; text-decoration: underline; ">Manage Blocked Sites</button> </div> `; document.body.appendChild(panel); document.getElementById('siteblock-close-btn').addEventListener('click', () => { panel.style.transform = 'translateY(150%)'; setTimeout(() => panel.remove(), 300); }); document.getElementById('siteblock-block-btn').addEventListener('click', blockCurrentSite); document.getElementById('siteblock-manage-link').addEventListener('click', openBlockListManager); } function blockCurrentSite() { const reason = document.getElementById('siteblock-reason').value || "Blocked by SiteBlocker"; const blockList = GM_getValue(BLOCK_LIST_KEY, {}); blockList[currentHost] = reason; GM_setValue(BLOCK_LIST_KEY, blockList); const panel = document.getElementById('siteblock-control-panel'); if (panel) { panel.innerHTML = ` <div style="padding: 20px; text-align: center;"> <div style="font-size: 3rem; color: #2ecc71;">✓</div> <h3 style="color: #2ecc71;">Site Blocked!</h3> <p>${currentHost} has been added to your block list.</p> <p>Refresh the page to activate blocking.</p> </div> `; setTimeout(() => { if (panel.parentNode) panel.parentNode.removeChild(panel); }, 3000); } } function tempUnblock() { const unblockTime = Date.now() + TEMP_UNBLOCK_DURATION; GM_setValue(TEMP_UNBLOCK_KEY, unblockTime); window.location.reload(); } function openBlockListManager() { const blockList = GM_getValue(BLOCK_LIST_KEY, {}); const existingManager = document.getElementById('siteblock-manager'); if (existingManager) existingManager.remove(); const manager = document.createElement('div'); manager.id = 'siteblock-manager'; manager.style.cssText = ` position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.7); z-index: 1000000; display: flex; justify-content: center; align-items: center; font-family: Arial, sans-serif; `; const sites = Object.entries(blockList); manager.innerHTML = ` <div style=" background: white; border-radius: 8px; width: 90%; max-width: 600px; max-height: 90vh; overflow: hidden; display: flex; flex-direction: column; "> <div style="padding: 20px; border-bottom: 1px solid #eee;"> <h2 style="margin: 0; color: #2c3e50;">Blocked Sites Manager</h2> </div> <div style="flex: 1; overflow-y: auto; padding: 20px;"> ${sites.length ? ` <table style="width: 100%; border-collapse: collapse;"> <thead> <tr style="background: #f8f9fa;"> <th style="text-align: left; padding: 10px; border-bottom: 1px solid #eee;">Site</th> <th style="text-align: left; padding: 10px; border-bottom: 1px solid #eee;">Reason</th> <th style="width: 100px; border-bottom: 1px solid #eee;"></th> </tr> </thead> <tbody> ${sites.map(([site, reason]) => ` <tr> <td style="padding: 10px; border-bottom: 1px solid #eee;">${site}</td> <td style="padding: 10px; border-bottom: 1px solid #eee;">${reason}</td> <td style="padding: 10px; border-bottom: 1px solid #eee; text-align: center;"> <button data-site="${site}" class="siteblock-remove-btn" style=" background: #e74c3c; color: white; border: none; border-radius: 4px; padding: 5px 10px; cursor: pointer; ">Remove</button> </td> </tr> `).join('')} </tbody> </table> ` : ` <div style="text-align: center; padding: 40px 20px; color: #7f8c8d;"> <p style="font-size: 1.2rem;">No sites blocked yet</p> <p>Add sites using the control panel</p> </div> `} </div> <div style="padding: 20px; display: flex; justify-content: space-between; border-top: 1px solid #eee;"> <button id="siteblock-manager-close" style=" padding: 10px 20px; background: #3498db; color: white; border: none; border-radius: 4px; cursor: pointer; ">Close</button> <button id="siteblock-clear-all" style=" padding: 10px 20px; background: #e74c3c; color: white; border: none; border-radius: 4px; cursor: pointer; ">Clear All</button> </div> </div> `; document.body.appendChild(manager); document.getElementById('siteblock-manager-close').addEventListener('click', () => manager.remove()); document.getElementById('siteblock-clear-all').addEventListener('click', clearAllBlocks); document.querySelectorAll('.siteblock-remove-btn').forEach(btn => { btn.addEventListener('click', (e) => { const site = e.target.dataset.site; const blockList = GM_getValue(BLOCK_LIST_KEY, {}); delete blockList[site]; GM_setValue(BLOCK_LIST_KEY, blockList); e.target.closest('tr').remove(); if (Object.keys(blockList).length === 0) { const tbody = manager.querySelector('tbody'); if (tbody) { tbody.innerHTML = ` <tr> <td colspan="3" style="text-align: center; padding: 20px; color: #7f8c8d;"> No blocked sites </td> </tr> `; } } }); }); } function clearAllBlocks() { if (confirm('Are you sure you want to remove ALL blocked sites?')) { GM_setValue(BLOCK_LIST_KEY, {}); const manager = document.getElementById('siteblock-manager'); if (manager) manager.remove(); alert('All blocked sites have been removed.'); } } })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址