您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Greasy Fork is available in English.
WhatsApp Web sohbet listesine hızlı arşivleme simgesi ekler.
// ==UserScript== // @name WhatsApp Web Sohbet Arşivle Butonu // @namespace http://tampermonkey.net/ or https://violentmonkey.github.io // @version 0.8 // @description WhatsApp Web sohbet listesine hızlı arşivleme simgesi ekler. // @author CustME // @match https://web.whatsapp.com/ // @grant none // @icon data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik0zIDhoMThtMC00SDMuMTdhMiAyIDAgMDAtMS45MiAyLjU4TDMuMDcgMjlhMiAyIDAgMDAxLjkzIDEuNDJINi40NWEyIDIgMCAwMDItMlY0eiIvPjxwYXRoIGQ9Ik0xMiAxNlY2Ii8+PHBhdGggZD0iTTcgMTEuMkwxMiAxNmw1LTMuMiIvPjwvc3ZnPg== // @license MIT // ==/UserScript== (function() { 'use strict'; const svgNS = 'http://www.w3.org/2000/svg'; function addArchiveButton(chatElement) { if (chatElement.classList.contains('archive-button-added')) { return; } chatElement.classList.add('archive-button-added'); const timeStatusContainer = chatElement.querySelector('._ak8j'); if (!timeStatusContainer) { console.warn('WhatsApp: Zaman/durum konteyneri (._ak8j) bulunamadı:', chatElement); return; } if (timeStatusContainer.querySelector('.whatsapp-archive-button')) { return; } const button = document.createElement('button'); button.className = 'whatsapp-archive-button'; button.title = 'Sohbeti Arşivle'; button.style.cssText = ` width: 18px; height: 18px; min-width: 18px; background-color: #e9e9eb; border: none; border-radius: 3px; cursor: pointer; color: #555; display: flex; align-items: center; justify-content: center; padding: 0; margin-left: 5px; opacity: 0.8; transition: opacity 0.1s ease-in-out; flex-shrink: 0; `; // Yeni, daha modern arşiv ikonu SVG'si const svg = document.createElementNS(svgNS, 'svg'); svg.setAttribute('viewBox', '0 0 24 24'); svg.setAttribute('width', '100%'); svg.setAttribute('height', '100%'); svg.setAttribute('fill', 'none'); svg.setAttribute('stroke', 'currentColor'); svg.setAttribute('stroke-width', '2'); svg.setAttribute('stroke-linecap', 'round'); svg.setAttribute('stroke-linejoin', 'round'); const path = document.createElementNS(svgNS, 'path'); path.setAttribute('d', 'M3 8h18m0-4H3.17a2 2 0 00-1.92 2.58L3.07 29a2 2 0 001.93 1.42H6.45a2 2 0 002-2V4z'); // Kasa veya kutu kısmı const path2 = document.createElementNS(svgNS, 'path'); path2.setAttribute('d', 'M12 16V6'); // Okun dikey çizgisi const path3 = document.createElementNS(svgNS, 'path'); path3.setAttribute('d', 'M7 11.2L12 16l5-3.2'); // Okun başı svg.appendChild(path); svg.appendChild(path2); svg.appendChild(path3); button.appendChild(svg); button.addEventListener('mouseover', () => { button.style.opacity = '1'; }); button.addEventListener('mouseout', () => { button.style.opacity = '0.8'; }); button.addEventListener('click', (event) => { event.stopPropagation(); event.preventDefault(); const targetChat = event.target.closest('._ak8l'); if (!targetChat) return; const chatRect = targetChat.getBoundingClientRect(); const contextMenuEvent = new MouseEvent('contextmenu', { bubbles: true, cancelable: true, clientX: chatRect.left + chatRect.width - 20, clientY: chatRect.top + chatRect.height / 2 }); targetChat.dispatchEvent(contextMenuEvent); setTimeout(() => { const contextMenu = document.querySelector('._ak4w'); if (contextMenu) { let archiveMenuItem = null; // 1. Yol: data-icon ile arama (en güvenilir yol) archiveMenuItem = contextMenu.querySelector('li[role="button"] > div > span[data-icon="archive-refreshed"]'); if (!archiveMenuItem) { // 2. Yol: Eğer data-icon bulunamazsa, innerText ile arama (yedek) archiveMenuItem = Array.from(contextMenu.querySelectorAll('li[role="button"]')) .find(item => item.querySelector('span.x1o2sk6j')?.innerText === 'Sohbeti arşivle'); } if (archiveMenuItem) { // Bulunan menü öğesinin en yakın li elementine tıklayın archiveMenuItem.closest('li[role="button"]').click(); console.log('WhatsApp: Arşiv butonu tıklandı, menü öğesi bulundu ve tıklandı.'); } else { console.error('WhatsApp: "Sohbeti arşivle" menü öğesi bulunamadı. Mevcut menü öğeleri:'); contextMenu.querySelectorAll('li[role="button"]').forEach(item => { const spanText = item.querySelector('span.x1o2sk6j')?.innerText; const dataIcon = item.querySelector('span[data-icon]')?.getAttribute('data-icon'); console.log(`- Metin: "${spanText || 'Yok'}", İkon: "${dataIcon || 'Yok'}"`); }); } } else { console.error('WhatsApp: Bağlam menüsü konteyneri (._ak4w) bulunamadı.'); } }, 150); // Gecikmeyi 150ms'ye çıkarıldı. }); timeStatusContainer.appendChild(button); } const chatListContainerSelector = 'div[aria-label="Sohbet listesi"][role="grid"]'; const observer = new MutationObserver((mutations) => { mutations.forEach((mutation) => { if (mutation.type === 'childList' && mutation.addedNodes.length > 0) { mutation.addedNodes.forEach((node) => { if (node.nodeType === 1) { if (node.classList && node.classList.contains('_ak8l')) { addArchiveButton(node); } if (node.querySelectorAll) { node.querySelectorAll('._ak8l').forEach(addArchiveButton); } } }); } }); }); function findContainerAndObserve() { const chatListContainer = document.querySelector(chatListContainerSelector); if (chatListContainer) { console.log('WhatsApp: Sohbet listesi konteyneri bulundu. Mevcut sohbetlere butonlar ekleniyor ve yenileri gözlemleniyor.'); chatListContainer.querySelectorAll('._ak8l').forEach(addArchiveButton); observer.observe(chatListContainer, { childList: true, subtree: false }); } else { console.log('WhatsApp: Sohbet listesi konteyneri (', chatListContainerSelector, ') bulunamadı. Tekrar deneniyor...'); setTimeout(findContainerAndObserve, 1000); } } window.addEventListener('load', () => { setTimeout(findContainerAndObserve, 500); }); })();