您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Twitter'da retweet'leri otomatik olarak siler, hızı ayarlar ve istatistikleri gösterir.
// ==UserScript== // @name Twitter Retweet Temizleyici // @namespace http://tampermonkey.net/ // @version 1.1 // @description Twitter'da retweet'leri otomatik olarak siler, hızı ayarlar ve istatistikleri gösterir. // @author odk-0160 // @match https://twitter.com/* // @match https://x.com/* // @grant none // @license MIT // ==/UserScript== (function () { 'use strict'; // Panel HTML'i const panelHTML = ` <div id="retweetCleanerPanel" style="position: fixed; top: 10px; right: 10px; background: var(--background-color, #ffffff); padding: 15px; border: 1px solid var(--border-color, #e1e8ed); border-radius: 12px; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); z-index: 1000; font-family: 'TwitterChirp', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif; color: var(--text-color, #000000); width: 320px;"> <h3 style="margin: 0 0 15px; font-size: 16px; font-weight: 700; color: var(--text-color, #000000);">Retweet Temizleyici</h3> <div style="display: flex; gap: 10px; margin-bottom: 15px;"> <button id="startButton" style="flex: 1; padding: 8px 12px; background: #1DA1F2; color: white; border: none; border-radius: 8px; cursor: pointer; font-size: 14px; font-weight: 500; transition: background 0.2s;">Başlat</button> <button id="stopButton" style="flex: 1; padding: 8px 12px; background: #ff4b4b; color: white; border: none; border-radius: 8px; cursor: pointer; font-size: 14px; font-weight: 500; transition: background 0.2s;">Durdur</button> </div> <div style="margin-bottom: 15px;"> <label for="limitInput" style="font-size: 14px; color: var(--text-secondary, #657786);">Kaç RT silinsin? (Boş bırakılırsa sınır yok):</label> <input id="limitInput" type="number" min="1" placeholder="Boş bırakın" style="width: 100%; padding: 5px; border-radius: 8px; border: 1px solid var(--border-color, #e1e8ed); background: var(--background-color, #ffffff); color: var(--text-color, #000000);"> </div> <div style="margin-bottom: 15px;"> <label for="speedInput" style="font-size: 14px; color: var(--text-secondary, #657786);">Hız (ms cinsinden):</label> <input id="speedInput" type="number" min="500" value="1000" style="width: 100%; padding: 5px; border-radius: 8px; border: 1px solid var(--border-color, #e1e8ed); background: var(--background-color, #ffffff); color: var(--text-color, #000000);"> </div> <div style="margin-bottom: 15px;"> <label style="font-size: 14px; color: var(--text-secondary, #657786);">İstatistikler:</label> <div style="font-size: 14px; color: var(--text-color, #000000);"> <span>Kaldırılan: <span id="removedCount">0</span></span><br> <span>Atlanan: <span id="skippedCount">0</span></span><br> <span>Hatalar: <span id="errorCount">0</span></span> </div> </div> <div style="margin-bottom: 15px;"> <label style="font-size: 14px; color: var(--text-secondary, #657786);">İşlem Logu:</label> <div id="logBox" style="height: 100px; overflow-y: auto; background: var(--log-background, #f5f8fa); border: 1px solid var(--border-color, #e1e8ed); border-radius: 8px; padding: 5px; font-size: 12px; color: var(--text-color, #000000);"> <!-- Log mesajları buraya eklenecek --> </div> </div> </div> `; // Paneli sayfaya ekle document.body.insertAdjacentHTML('afterbegin', panelHTML); // Değişkenler let isRunning = false; let totalUnretweets = 0; let skippedCount = 0; let errorCount = 0; // Log mesajı ekleme fonksiyonu function addLog(message) { const logBox = document.getElementById('logBox'); const logEntry = document.createElement('div'); logEntry.textContent = message; logBox.appendChild(logEntry); logBox.scrollTop = logBox.scrollHeight; // Otomatik kaydırma } // Retweet'leri geri alma fonksiyonu async function unretweetAll() { const limitInput = document.getElementById('limitInput'); const speedInput = document.getElementById('speedInput'); const limit = limitInput.value ? parseInt(limitInput.value, 10) : Infinity; const speed = parseInt(speedInput.value, 10); while (isRunning && totalUnretweets < limit) { let unretweetButtons = document.querySelectorAll('[data-testid="unretweet"]'); if (unretweetButtons.length === 0) { addLog("⏭️ Kaldırılacak retweet bulunamadı. Sayfa kaydırılıyor..."); window.scrollTo(0, document.body.scrollHeight); await new Promise(resolve => setTimeout(resolve, speed)); continue; } for (const button of unretweetButtons) { if (!isRunning || totalUnretweets >= limit) break; button.click(); await new Promise(resolve => setTimeout(resolve, 500)); const confirmButton = document.querySelector('[data-testid="unretweetConfirm"]'); if (confirmButton) { confirmButton.click(); totalUnretweets++; document.getElementById('removedCount').textContent = totalUnretweets; addLog(`✅ Retweet kaldırıldı. Toplam kaldırılan retweet sayısı: ${totalUnretweets}`); } else { skippedCount++; document.getElementById('skippedCount').textContent = skippedCount; addLog("⏭️ Retweet atlandı (onay butonu bulunamadı)."); } await new Promise(resolve => setTimeout(resolve, speed)); } } if (isRunning) { addLog("🏁 İşlem tamamlandı."); isRunning = false; } } // Başlat butonu document.getElementById('startButton').addEventListener('click', () => { if (!isRunning) { isRunning = true; addLog("▶️ İşlem başlatıldı."); unretweetAll(); } }); // Durdur butonu document.getElementById('stopButton').addEventListener('click', () => { if (isRunning) { isRunning = false; addLog("🛑 İşlem durduruldu."); } }); })();