Twitter: view more replies and remove shit

View more replies and remove shit from twitter

当前为 2021-07-20 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Twitter: view more replies and remove shit
  3. // @description View more replies and remove shit from twitter
  4. // @author MK
  5. // @namespace max44
  6. // @homepage https://gf.qytechs.cn/en/users/309172-max44
  7. // @include https://twitter.com/*
  8. // @include https://mobile.twitter.com/*
  9. // @version 1.2.4
  10. // @require https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js
  11. // @grant none
  12. // @run-at document-idle
  13. // ==/UserScript==
  14.  
  15. (function () {
  16. 'use strict';
  17.  
  18. function findAndClick(selector, observer) {
  19. const elem = document.querySelector(selector);
  20.  
  21. if (elem != null) {
  22. elem.click();
  23. observer.disconnect();
  24. }
  25. }
  26.  
  27. function isLink(element) {
  28. return element.getAttribute("role") === "link";
  29. }
  30.  
  31. function isParentLink(element, parentN) {
  32. if (isLink(element)) {
  33. return true;
  34. }
  35.  
  36. for (let i = 0; i <= parentN; i++) {
  37. element = element.parentElement;
  38.  
  39. if (isLink(element)) {
  40. return true;
  41. }
  42. }
  43.  
  44. return false;
  45. }
  46.  
  47. const config = {childList: true, subtree: true};
  48. // Replies list
  49. const repliesSelector = "[aria-labelledby^='accessible-list'][role='region'][class='css-1dbjc4n']";
  50. // "View more replies" button on preview tweets
  51. const viewMoreSelector = "[href*='i/status/']" +
  52. "[role='link']" +
  53. "[data-focusable='true']" +
  54. "[class^='css-4rbku5 css-18t94o4 css-1dbjc4n r-1loqt21 r-1ny4l3l'][class$='r-o7ynqc r-6416eg'] " +
  55. "div span";
  56. // "Show additional replies, including those that may contain offensive content" button
  57. const offensiveSelector = "div[role='button']" +
  58. "[tabindex='0']" +
  59. "[class^='css-18t94o4 css-1dbjc4n r-1niwhzg r-42olwf r-sdzlij r-1phboty r-rs99b7'][class$='r-o7ynqc r-6416eg r-lrvibr'] " +
  60. "div > span > span";
  61. // "Show replies" and "Show more replies" buttons
  62. const moreRepliesSelector = "div[role='button']" +
  63. "[tabindex='0']" +
  64. "[class='css-18t94o4 css-1dbjc4n r-1777fci r-1pl7oy7 r-1ny4l3l r-o7ynqc r-6416eg r-13qz1uu'] " +
  65. "div > div > span";
  66. //"div[class='css-1dbjc4n r-16y2uox r-1wbh5a2 r-1777fci'] " +
  67. //"div[class^='css-901oao'][class$='r-qvutc0'][dir='auto'] " +
  68. //"span[class^='css-901oao css-16my406'][class$='r-bcqeeo r-qvutc0']";
  69.  
  70. setTimeout(function () {
  71. // For preview tweets, tweets that are opened from external sources may has a special format where only a few replies are shown and the rest are replaced
  72. // by a "More Tweets" section that contains popular tweets from random accounts that may or may not be related to the previewed tweet
  73. const previewSelector = "[data-testid='primaryColumn'] " +
  74. "[class='css-1dbjc4n r-yfoy6g r-18bvks7 r-1ljd8xs r-13l2t4g r-1phboty r-1jgb5lz r-11wrixw r-61z16t r-1ye8kvj r-13qz1uu r-184en5c']";
  75. const preview = document.querySelector(previewSelector);
  76.  
  77. if (preview != null) {
  78. const viewMore = document.querySelector(viewMoreSelector);
  79.  
  80. if (viewMore != null) {
  81. viewMore.click();
  82. }
  83. }
  84. }, 3000);
  85.  
  86. const rootCallback = function (mutationsList, observer) {
  87. //Remove shit
  88. $( "span:contains('Who to follow')" ).parent().parent().parent().parent().parent().hide().next().hide().next().hide().next().hide().next().hide().next().hide();
  89. $( "span:contains('Topics to follow')" ).parent().parent().parent().parent().parent().hide().next().hide().next().hide().next().hide();
  90. //$( "span:contains('Who to follow')" ).parent().parent().parent().parent().parent().remove();
  91. //$( "span:contains('Topics to follow')" ).parent().parent().parent().parent().parent().parent().remove();
  92. //destroys content on mobile browser: $( "section[aria-labelledby='accessible-list-0'][role='region']" ).parent().parent().remove();
  93. $( "article span:contains('Promoted')" ).parent().parent().parent().parent().parent().hide().next().hide().next().hide().next().hide();
  94. $( "span:contains('Promoted by')" ).parent().parent().parent().parent().hide().next().hide().next().hide().next().hide();
  95. $( "span:contains('Promoted Tweet')" ).parent().parent().parent().parent().remove();
  96. $( "span:contains('Promoted')" ).parent().parent().parent().parent().parent().remove();
  97. $( "span:contains('Trends for you')" ).parent().parent().parent().parent().parent().parent().parent().parent().parent().parent().parent().remove();
  98. $( "span:contains('Expand your timeline with Topics')" ).parent().parent().parent().parent().parent().parent().parent().parent().parent().parent().parent().remove();
  99. $( "span:contains('Discover new Lists')" ).parent().parent().parent().parent().parent().parent().parent().parent().parent().parent().parent().remove();
  100. //-----$( "div[aria-label='Set as not interested']" ).parent().parent().parent().parent().parent().parent().parent().parent().parent().parent().parent().parent().parent().parent().parent().remove();
  101. $( "div[aria-label='Set as not interested']" ).parent().parent().parent().parent().parent().parent().parent().parent().remove();
  102. $( "span:contains('Open app')" ).parent().parent().parent().remove();
  103.  
  104. const repliesNode = document.querySelector(repliesSelector);
  105.  
  106. if (repliesNode != null) {
  107. const offensiveObserver = new MutationObserver(offensiveCallback);
  108. const moreRepliesObserver = new MutationObserver(moreRepliesCallback);
  109. offensiveObserver.observe(repliesNode, config);
  110. moreRepliesObserver.observe(repliesNode, config);
  111. }
  112. };
  113.  
  114. const offensiveCallback = function (mutationsList, observer) {
  115. findAndClick(offensiveSelector, observer);
  116. };
  117.  
  118. const moreRepliesCallback = function (mutationsList, observer) {
  119. findAndClick(moreRepliesSelector, observer);
  120. /*const moreRepliesNodes = document.querySelectorAll(moreRepliesSelector);
  121.  
  122. for (let elem of moreRepliesNodes) {
  123. if (isParentLink(elem, 4)) {
  124. continue;
  125. }
  126. elem.click();
  127. }*/
  128. };
  129.  
  130. const rootNode = document.querySelector("#react-root");
  131. if (rootNode != null) {
  132. const rootObserver = new MutationObserver(rootCallback);
  133. rootObserver.observe(rootNode, config);
  134. }
  135. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址