您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Blurs inactive WhatsApp chats/messages, unblurs on hover, enables messaging without saving numbers, and toggles blur for unread messages.
当前为
// ==UserScript== // @name WhatsApp Web Blur & Quick Message // @namespace http://tampermonkey.net/ // @version 1.2.11 // @description Blurs inactive WhatsApp chats/messages, unblurs on hover, enables messaging without saving numbers, and toggles blur for unread messages. // @author Noushad Bhuiyan // @match https://web.whatsapp.com/* // @icon https://www.google.com/s2/favicons?sz=64&domain=whatsapp.com // @grant GM_setValue // @grant GM_getValue // @license MIT // ==/UserScript== (() => { // Load blur state for unread messages (default: true, blur enabled) let blurUnread = GM_getValue('blurUnread', true); // Data URLs for toggle icons const toggleOffIcon = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAADsAAAA7AF5KHG9AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAArpJREFUWIXtl01IVFEUx3/nORpBKbpRyITSCJIUhAgiEMogKmwhCG6E0Ny4cBAU1I07cRb5hQulZbQQjISijQUSRAvRINyYtJIoU8ePFuOb++a0qHmOM85HjjOL6g8P3nvnP+/87j2He+/Avy5JZhgd1fy8PIpFKFKlUITT8byqbFkW39va5APA1JTmbG9zxXEo9nhYam2VlejfeOIkLc3NpVOVeqA8FEp9RMZQBzA2ppfX13kCVAHYNoyP6xTQ0t4uP+ICjIzoTVWmbZuC1NO6etvRIa8nJrQgEOBFKERZVLwR2AEehl9YkdHBQS01hmljKDAGjnC9BNjdpd0YyuJ4WoaG9PyhM6BKpzFHGnlYqwCOw6UEHlGlEvgcA+A43E8jOaq/4I1hLZFPZD/ulqC/X/ON4dwRpx5jwHG4BhAM8tQYNI5vsaKC+RgAoMQYJB0AY2jo69Oz/f0ybwxeYwhGxddUaW5sFMedjfBNT49eBd6nU4Lfmt3Y4M7kpAR7e7UqFKJZhBJVPorweGBANg6UI3zT1aW3gVfHAAAwK8IDn09WowPd3XoL8Pt8Mg8RTWgMJ1SPKT3UActerz5X5Z1lsQmUqXLXtrkO3AsbXQDbxpKkC/Mf6STQBDQ5zsGAyH7vuQCOc3BRyqREyIkBMCb5xpRRAMeBY+yBZADuYF2AYJAspQcR3P01sgR/sOn+jQDBIIEsAri5IpvQn60mVGUzBmBvD7+VpZXAsvDHAHg8fLNtlBQOqmlKA4H988CBZLW1ugKUZxhgeW5OLoYfok9EM6p0ZhhgJvIhGuBRKEQLpHUuTKQtj4fhyBcx9a6p0RsiPMsAxJYqDQsL8iYhAEB1tZ5RxQvUAxfi+VKQAp+AmZwchhcX5Uu0IemHKyv1FFACFAGFquQn8ouwA2wCfuDr0tL+v6D/Okw/AWuAfPZgEcTJAAAAAElFTkSuQmCC'; const toggleOnIcon = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAADsAAAA7AF5KHG9AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAA8lJREFUWIXFl09oHGUUwH9vNtWwRZKNRVBrDy2oSAvqJgqttSLYgif/EDyJeghJa1PFNJCWNqSFULZJqCEYU0GKHjy0gnrooV6MKB5iU6QqoYUUSSsFNdmoNWR33nzPw0ymk7BtliabPBiY771v5v3e9+d974NVFlmsw8mTVmPGfSLUmZER4Z5S/TyPX5qaZCypO3XKqlVpCALqRLjS3Cw/lwUwNGT1ztEiwi4z1pcZzOSePbJurjE4aK3AESCT6POT59HU0iLn5xRVyT+cPm2p69fpKxbZl4CbAX4H8tHzzy0Afph76e+3o6ocBhBhzIyrwBPA48C3AwO2o7U1hJgHcO0afcA7wKwI/cBX6TTnm5vFL3MU6O21x4KAg4Az4622NvkUoKfH1lZV8bEZrwEfAU+SiJJczupFGAEKzvFCR4d8X67TpORydlSEwyJ80t4ubyZtPT221ozfgHXOsbmjQ3715ozOsVsV8X3679Q5QBCwURV8n+8W2trb5T9VLqiCKhshMQWq7AQQ4cs7dQ7gHHkzMGNDKbsqG0RAhDyAB9DVZbWqrFdlZmKC0aUAqHJOFZzj7a4um7eDOjvtjSDgUVWmVBmBaA0cOGAPex6XgMvd3fLIUgDA5NAhvjFjBzAJfCDChBnbgdcJg97d3S1DcHMKMqpAuM2WKGJBYK86x+fAc0BnwqjAkVwudB4DFIvURu3ppQPAsWMyCfb8/v286Bw7RbgXGE+l+Oz4cbmU7FsF4PtURwtjdjkAQhHr7eUscPZ2vaoAnIvzgS0fQGlpbbU2Mw46xzODgzLmAaiSivZmUGkA3+dpVerM2AzRCKiu3AgEAUR5ghhgobKSUiwi0XqzGMD348gXrQ+WKqp4EYCLAVTDBlFmXBUAkZUBcC72cRPAjNloHVRXGkA19OF5FGKAQoF8NAKZW365fAB10etUDADko7NgJQAyEB7bEM35jRv8GSWiB7NZW1Mp542Ndpcq96tCocBfMcDwsEyrclWVdG0t9ZUCmJykXpW0KhPDwzIdAwAEAV8HARSLvFQpAFVeCYKwaJnTJWvCD1WxIGDftm22fbmdb91qz6qyVxXzfeJ6YF7ma2iwEyK8CxTMGAC+cI4fR0fLL8uTks3aGhGeSqV42Yy9wN3AiZERea8kQGOjpcbH6YOSF5Npworp70X81hDupgzwAJCO9Aa8v2kT7WfOSHzqlsz9W7ZYVoQWYBfwUDnR3kYmgHPA0MWLcmGhcdHDJ5u1mpmZ8HIqQsas9OU0/qHwrxl5M6bSaf4YHZXFRmx15X/BpK1mTxvAuwAAAABJRU5ErkJggg=='; const applyBlur = el => { // Reset existing blur state if (el.hasAttribute('is-blurred')) { el.style.filter = 'none'; el.style.transition = 'none'; el.removeAttribute('is-blurred'); el.removeEventListener('mouseenter', () => {}); el.removeEventListener('mouseleave', () => {}); } // Apply blur if conditions are met if (!el.hasAttribute('aria-selected')) { const isUnread = el.querySelector('[aria-label*="unread"]'); if (!isUnread || (isUnread && blurUnread)) { el.style.filter = 'blur(8px)'; el.style.transition = 'filter 0.3s ease-in-out'; el.setAttribute('is-blurred', 'true'); el.addEventListener('mouseenter', () => el.style.filter = 'none'); el.addEventListener('mouseleave', () => el.style.filter = 'blur(8px)'); } } }; const clearBlurFromActiveChat = () => document.querySelectorAll('[aria-label="Chat list"] [aria-selected="true"]').forEach(el => { const listItem = el.closest('[role="listitem"]'); if (listItem?.hasAttribute('is-blurred')) { listItem.style.filter = 'none'; listItem.style.transition = 'none'; listItem.removeAttribute('is-blurred'); listItem.removeEventListener('mouseenter', () => {}); listItem.removeEventListener('mouseleave', () => {}); } }); const blurElements = () => { document.querySelectorAll('[aria-label="Chat list"] [role="listitem"], [role="application"] [data-testid="conversation-panel-messages"]').forEach(applyBlur); clearBlurFromActiveChat(); }; const addButtons = () => { const h1 = document.querySelector('h1'); if (h1 && !document.getElementById('quick-message-btn')) { // Quick Message Button const msgBtn = Object.assign(document.createElement('button'), { id: 'quick-message-btn', title: 'Send message to a number without saving', style: 'margin-left:10px;cursor:pointer;background:none;border:none;vertical-align:middle' }); msgBtn.innerHTML = '<img src="data:image/jpeg;base64,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" alt="Message Icon" style="width:20px;height:20px">'; msgBtn.onclick = showModal; h1.parentElement.parentElement.insertBefore(msgBtn, h1.parentElement.nextSibling); // Toggle Blur Button const toggleBtn = Object.assign(document.createElement('button'), { id: 'toggle-blur-btn', title: blurUnread ? 'Disable blur for unread messages' : 'Enable blur for unread messages', style: 'margin-left:10px;cursor:pointer;background:none;border:none;vertical-align:middle' }); toggleBtn.innerHTML = `<img src="${blurUnread ? toggleOnIcon : toggleOffIcon}" alt="Toggle Blur Icon" style="width:20px;height:20px">`; toggleBtn.onclick = () => { blurUnread = !blurUnread; GM_setValue('blurUnread', blurUnread); toggleBtn.title = blurUnread ? 'Disable blur for unread messages' : 'Enable blur for unread messages'; toggleBtn.innerHTML = `<img src="${blurUnread ? toggleOnIcon : toggleOffIcon}" alt="Toggle Blur Icon" style="width:20px;height:20px">`; blurElements(); }; h1.parentElement.parentElement.insertBefore(toggleBtn, msgBtn.nextSibling); } }; const showModal = () => { document.getElementById('quick-message-modal')?.remove(); const isDark = window.matchMedia('(prefers-color-scheme: dark)').matches; const modal = Object.assign(document.createElement('div'), { id: 'quick-message-modal', style: 'position:fixed;top:0;left:0;width:100%;height:100%;background:' + (isDark ? 'rgba(0,0,0,0.7)' : 'rgba(0,0,0,0.5)') + ';backdrop-filter:blur(5px);display:flex;align-items:center;justify-content:center;z-index:1000' }); const content = Object.assign(document.createElement('div'), { style: 'background:' + (isDark ? '#1a1a1a' : '#fff') + ';color:' + (isDark ? '#fff' : '#000') + ';padding:20px;border-radius:8px;max-width:400px;width:100%;box-shadow:0 4px 8px rgba(0,0,0,0.2)' }); content.onclick = e => e.stopPropagation(); const input = Object.assign(document.createElement('input'), { type: 'text', placeholder: 'Enter phone number', style: 'width:-webkit-fill-available;padding:10px;margin:10px 0;border-radius:4px;background:rgb(51,51,51);color:rgb(255,255,255)', autofocus: true }); const note = Object.assign(document.createElement('div'), { style: 'font-size:12px;color:' + (isDark ? '#bbb' : '#555') + ';margin-bottom:10px', innerHTML: 'Please include the country code (e.g., +1234567890)' }); const btnRow = Object.assign(document.createElement('div'), { style: 'display:flex;gap:10px' }); const checkBtn = Object.assign(document.createElement('button'), { textContent: 'Check Number', style: 'background:#25D366;color:#fff;padding:10px;border:none;border-radius:4px;cursor:pointer;flex:1' }); checkBtn.onclick = () => { const num = input.value.trim().replace(/[\s-+]/g, ''); if (num) { window.location.href = `https://web.whatsapp.com/send/?phone=${num}`; modal.remove(); } }; const closeBtn = Object.assign(document.createElement('button'), { textContent: 'Close', style: 'background:' + (isDark ? '#444' : '#ccc') + ';color:' + (isDark ? '#fff' : '#000') + ';padding:10px;border:none;border-radius:4px;cursor:pointer;flex:1' }); closeBtn.onclick = () => modal.remove(); modal.onclick = e => e.target === modal && modal.remove(); btnRow.append(checkBtn, closeBtn); content.append(input, note, btnRow); modal.appendChild(content); document.body.appendChild(modal); }; blurElements(); addButtons(); const observer = new MutationObserver(mutations => mutations.forEach(m => m.addedNodes.length && (blurElements(), addButtons()))); const target = document.querySelector('body'); target && observer.observe(target, { childList: true, subtree: true }); window.addEventListener('unload', () => observer.disconnect()); })();