// ==UserScript== // @name View More Twitter Replies // @namespace jak0723 // @version 1.2 // @description Automatically displays replies hidden behind buttons // @author JAK0723 // @match http*://*twitter.com/*/status/* // @license MIT // @grant none // @run-at document-idle // @downloadURL none // ==/UserScript== (function () { 'use strict'; function findAndClick(selector, textContent, observer) { for (let elem of document.querySelectorAll(selector)) { if (elem.textContent === textContent) { elem.click(); observer.disconnect(); } } } const viewMoreSelector = "[href*='i/status/'] div span"; const viewMoreText = "View more replies"; const showMoreSelector = "[role='button'] div div span"; const showMoreText = "Show more replies"; const offensiveSelector = "[role='button'] div span span"; const offensiveText = "Show"; const rootNode = document.querySelector("#react-root"); const config = {childList: true, subtree: true}; const repliesCallback = function (mutationsList, observer) { findAndClick(showMoreSelector, showMoreText, observer); findAndClick(offensiveSelector, offensiveText, observer); }; const rootCallback = function (mutationsList, observer) { findAndClick(viewMoreSelector, viewMoreText, observer); const repliesNode = document.querySelector("[aria-label='Timeline: Conversation']"); if (repliesNode != null) { const repliesObserver = new MutationObserver(repliesCallback); repliesObserver.observe(repliesNode, config); } }; const rootObserver = new MutationObserver(rootCallback); rootObserver.observe(rootNode, config); })();