您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Hide tweets from multiple users on Twitter
// ==UserScript== // @name Twitter User Blocker // @name:ja Twitter ユーザーをミュートするやつ // @namespace http://tampermonkey.net/ // @version 1.0.3 // @description Hide tweets from multiple users on Twitter // @description:ja IDを入力することですぐミュートできる。表示したり非表示にしたりの切り替えも可能 // @author Nogaccho // @match https://twitter.com/* // @match https://x.com/* // @grant none // @license MIT // ==/UserScript== (function () { 'use strict'; let isBlockingEnabled = false;// ブロッキングが有効かどうかのフラグ let initialLoad = true;// 初回読み込みかどうかのフラグ let ids = [];// ブロックするユーザーIDのリスト function saveUserIds(userIds) { localStorage.setItem("blockedUserIds", JSON.stringify(userIds));// 非表示するユーザーIDをlocalStorageに保存 } function loadUserIds() { return JSON.parse(localStorage.getItem("blockedUserIds") || "[]");// ローカルストレージから非表示するユーザーIDを読み込み } function hideTweets() { if (!isBlockingEnabled) return;// ブロッキングが無効なら処理を中断 let blockedUserIds = loadUserIds();// ブロックするユーザーIDを取得 let tweets = document.querySelectorAll(`[data-testid="tweet"]`); // ツイートの要素を取得 let count = 0; tweets.forEach(tweet => { if (initialLoad && count >= 50) return; // 初回読み込み時は50ツイートのみ処理 let authorLink = blockedUserIds.some(id => tweet.querySelector(`a[href*="/${id}"]`)); if (authorLink) { tweet.style.display = 'none'; count++; } }); initialLoad = false; } function handleScroll() { // スクロールイベントの処理。新しいツイートが表示されるたびにhideTweetsを呼び出す let lastTweet = document.querySelectorAll(`[data-testid="tweet"]`).item(document.querySelectorAll(`[data-testid="tweet"]`).length - 1); let observer = new IntersectionObserver((entries, observer) => { entries.forEach(entry => { if (entry.isIntersecting) { hideTweets(); observer.unobserve(lastTweet); } }); }, { threshold: 1.0 }); observer.observe(lastTweet); } function toggleBlocking() { // 非表示のON/OFFを切り替える isBlockingEnabled = !isBlockingEnabled; if (isBlockingEnabled) { hideTweets(); } else { document.querySelectorAll(`[data-testid="tweet"]`).forEach(tweet => { tweet.style.display = ''; }); } } function editBlockList() { // 非表示リストの編集画面 let ids = loadUserIds(); let editContainer = document.createElement("div"); editContainer.style.position = "fixed"; editContainer.style.top = "100px"; editContainer.style.right = "10px"; editContainer.style.backgroundColor = "#273340"; editContainer.style.padding = "10px"; editContainer.style.border = "0.5px solid gray"; editContainer.style.zIndex = "1000"; editContainer.style.color = "white"; editContainer.style.borderRadius = "10px"; editContainer.style.display = "flex"; editContainer.style.flexDirection = "column"; let idListContainer = document.createElement("div"); idListContainer.style.maxHeight = "260px"; idListContainer.style.overflowY = "auto"; idListContainer.style.marginBottom = "10px"; let idList = document.createElement("ul"); ids.forEach(id => { let listItem = document.createElement("li"); listItem.style.display = "flex"; listItem.style.justifyContent = "space-between"; listItem.style.alignItems = "center"; let idText = document.createElement("span"); idText.textContent = id; listItem.appendChild(idText); let removeButton = document.createElement("button"); removeButton.textContent = "削除"; removeButton.style.marginLeft = "10px"; styleButton(removeButton); removeButton.onclick = function () { ids = ids.filter(userId => userId !== id); saveUserIds(ids); listItem.remove() }; listItem.appendChild(removeButton); idList.appendChild(listItem); }); idListContainer.appendChild(idList); editContainer.appendChild(idListContainer); let closeButton = document.createElement("button"); closeButton.textContent = "閉じる"; closeButton.style.alignSelf = "flex-start"; styleButton(closeButton); closeButton.onclick = function () { document.body.removeChild(editContainer); }; editContainer.appendChild(closeButton); document.body.appendChild(editContainer); } // Create interface for blocking user IDs let inputBox = document.createElement("input"); inputBox.type = "text"; inputBox.placeholder = ' IDを入力'; inputBox.style.backgroundColor = "#273340"; inputBox.style.color = "#757575"; inputBox.style.border = "none"; inputBox.style.borderRadius = "2px"; let saveButton = document.createElement("button"); saveButton.textContent = "追加"; styleButton(saveButton); saveButton.onclick = function () { let newUserIds = inputBox.value.split(',').map(id => id.trim().replace(/"/g, '')).filter(id => id !== ""); if (newUserIds.length > 0) { let currentIds = loadUserIds(); let updatedIds = currentIds.concat(newUserIds.filter(id => !currentIds.includes(id))); saveUserIds(updatedIds); hideTweets(); } inputBox.value = ""; }; let toggleCheckbox = document.createElement("input"); toggleCheckbox.type = "checkbox"; toggleCheckbox.checked = isBlockingEnabled; toggleCheckbox.onchange = toggleBlocking; let toggleLabel = document.createElement("label"); toggleLabel.style.marginLeft = "5px"; toggleLabel.insertBefore(toggleCheckbox, toggleLabel.firstChild); let editButton = document.createElement("button"); editButton.textContent = "IDリスト"; editButton.style.marginLeft = "10px"; styleButton(editButton); editButton.onclick = function () { ids = loadUserIds(); editBlockList(); }; let container = document.createElement("div"); container.style.position = "fixed"; container.style.top = "55px"; container.style.right = "10px"; container.appendChild(inputBox); container.appendChild(saveButton); container.appendChild(editButton); container.appendChild(toggleLabel); document.body.appendChild(container); function styleButton(button) { button.style.backgroundColor = "#1A8CD8"; button.style.color = "#FFFFFF"; button.style.borderRadius = "10px"; button.style.border = "none"; button.onmouseover = function () { button.style.backgroundColor = "#1576b6"; }; button.onmousedown = function () { button.style.backgroundColor = "#0f5a94"; }; button.onmouseup = function () { button.style.backgroundColor = "#1A8CD8"; }; button.onmouseleave = function () { button.style.backgroundColor = "#1A8CD8"; }; } window.addEventListener('scroll', handleScroll);// スクロールイベントリスナーを追加 let observer = new MutationObserver(hideTweets);// DOMの変更を監視するオブザーバーを追加 observer.observe(document.body, { childList: true, subtree: true }); })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址