X/Twitter Clean menu and sidebar (Supports multiple language)

hidden Menu,Grok,Premium subscription,Explore,Notifications,Messages,Bookmarks and Customizable Settings

目前为 2024-06-11 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name X/Twitter Clean menu and sidebar (Supports multiple language)
  3. // @version 1.0
  4. // @description hidden Menu,Grok,Premium subscription,Explore,Notifications,Messages,Bookmarks and Customizable Settings
  5. // @license MIT
  6. // @author movwei
  7. // @match https://x.com/*
  8. // @match https://twitter.com/*
  9. // @grant GM_registerMenuCommand
  10. // @grant GM_setValue
  11. // @grant GM_getValue
  12. // @grant GM_addStyle
  13. // @namespace https://greasyfork.org/users/1041101
  14. // ==/UserScript==
  15.  
  16. (function() {
  17. 'use strict';
  18.  
  19. const defaultSettings = {
  20. hideGrok: true,
  21. hidePremiumSignUp: true,
  22. hideSelectors: true,
  23. hideExplore: false,
  24. hideNotifications: false,
  25. hideBookmarks: false,
  26. hideMessages: false
  27. };
  28.  
  29. const settings = {
  30. hideGrok: GM_getValue('hideGrok', defaultSettings.hideGrok),
  31. hidePremiumSignUp: GM_getValue('hidePremiumSignUp', defaultSettings.hidePremiumSignUp),
  32. hideSelectors: GM_getValue('hideSelectors', defaultSettings.hideSelectors),
  33. hideExplore: GM_getValue('hideExplore', defaultSettings.hideExplore),
  34. hideNotifications: GM_getValue('hideNotifications', defaultSettings.hideNotifications),
  35. hideBookmarks: GM_getValue('hideBookmarks', defaultSettings.hideBookmarks),
  36. hideMessages: GM_getValue('hideMessages', defaultSettings.hideMessages)
  37. };
  38.  
  39.  
  40. function createSettingsPanel() {
  41. const panel = document.createElement('div');
  42. panel.id = 'settingsPanel';
  43. panel.innerHTML = `
  44. <div id="settingsPanelContent">
  45. <h2>Settings</h2>
  46. <label><input type="checkbox" id="hideGrokCheckbox" ${settings.hideGrok ? 'checked' : ''}> Hide Grok</label><br>
  47. <label><input type="checkbox" id="hidePremiumSignUpCheckbox" ${settings.hidePremiumSignUp ? 'checked' : ''}> Hide Premium Sign-up</label><br>
  48. <label><input type="checkbox" id="hideSelectorsCheckbox" ${settings.hideSelectors ? 'checked' : ''}> Hide Subscribe Message</label><br>
  49. <label><input type="checkbox" id="hideExploreCheckbox" ${settings.hideExplore ? 'checked' : ''}> Hide Explore</label><br>
  50. <label><input type="checkbox" id="hideNotificationsCheckbox" ${settings.hideNotifications ? 'checked' : ''}> Hide Notifications</label><br>
  51. <label><input type="checkbox" id="hideMessagesCheckbox" ${settings.hideMessages ? 'checked' : ''}> Hide Messages</label><br>
  52. <label><input type="checkbox" id="hideBookmarksCheckbox" ${settings.hideBookmarks ? 'checked' : ''}> Hide Bookmarks</label><br>
  53. <button id="saveSettingsButton">Save & refresh</button>
  54. <button id="closeSettingsButton">Close</button>
  55. </div>
  56. `;
  57. document.body.appendChild(panel);
  58.  
  59. document.getElementById('saveSettingsButton').addEventListener('click', saveSettings);
  60.  
  61. document.getElementById('closeSettingsButton').addEventListener('click', () => {
  62. document.getElementById('settingsPanel').style.display = 'none';
  63. });
  64. }
  65.  
  66.  
  67. function saveSettings() {
  68. settings.hideGrok = document.getElementById('hideGrokCheckbox').checked;
  69. settings.hidePremiumSignUp = document.getElementById('hidePremiumSignUpCheckbox').checked;
  70. settings.hideSelectors = document.getElementById('hideSelectorsCheckbox').checked;
  71. settings.hideExplore = document.getElementById('hideExploreCheckbox').checked;
  72. settings.hideNotifications = document.getElementById('hideNotificationsCheckbox').checked;
  73. settings.hideBookmarks = document.getElementById('hideBookmarksCheckbox').checked;
  74. settings.hideMessages = document.getElementById('hideMessagesCheckbox').checked;
  75.  
  76. GM_setValue('hideGrok', settings.hideGrok);
  77. GM_setValue('hidePremiumSignUp', settings.hidePremiumSignUp);
  78. GM_setValue('hideSelectors', settings.hideSelectors);
  79. GM_setValue('hideExplore', settings.hideExplore);
  80. GM_setValue('hideNotifications', settings.hideNotifications);
  81. GM_setValue('hideBookmarks', settings.hideBookmarks);
  82. GM_setValue('hideMessages', settings.hideMessages);
  83. location.reload();
  84. }
  85.  
  86.  
  87. GM_addStyle(`
  88. #settingsPanel {
  89. position: fixed;
  90. top: 50%;
  91. left: 50%;
  92. transform: translate(-50%, -50%);
  93. background-color: white;
  94. border: 1px solid #ccc;
  95. padding: 20px;
  96. z-index: 10000;
  97. display: none;
  98. box-shadow: 0 4px 8px rgba(0,0,0,0.1);
  99. border-radius: 8px;
  100. max-width: 300px;
  101. }
  102.  
  103. #settingsPanelContent {
  104. display: flex;
  105. flex-direction: column;
  106. align-items: flex-start;
  107. width: 100%;
  108. }
  109.  
  110. #settingsPanel h2 {
  111. margin: 0 0 15px 0;
  112. font-size: 18px;
  113. color: #333;
  114. text-align: center;
  115. width: 100%;
  116. }
  117.  
  118. #settingsPanel label {
  119. margin: 5px 0;
  120. font-size: 14px;
  121. color: #333;
  122. }
  123.  
  124. #settingsPanel button {
  125. margin-top: 10px;
  126. padding: 8px 15px;
  127. font-size: 14px;
  128. color: white;
  129. background-color: #007BFF;
  130. border: none;
  131. border-radius: 4px;
  132. cursor: pointer;
  133. width: 100%;
  134. }
  135.  
  136. #settingsPanel button#closeSettingsButton {
  137. background-color: #6c757d;
  138. }
  139. `);
  140.  
  141.  
  142. createSettingsPanel();
  143. GM_registerMenuCommand('Settings', () => {
  144. const panel = document.getElementById('settingsPanel');
  145. panel.style.display = 'block';
  146. });
  147.  
  148. function addGlobalStyle(css) {
  149. var head, style;
  150. head = document.getElementsByTagName('head')[0];
  151. if (!head) { return; }
  152. style = document.createElement('style');
  153. style.type = 'text/css';
  154. style.innerHTML = css;
  155. head.appendChild(style);
  156. }
  157.  
  158.  
  159. var phrases = [
  160. 'Premium\'a Abone Ol', // 土耳其文 - Türkçe
  161. 'Abonner på Premium', // 丹麥文 - dansk
  162. '', // 巴斯克文 (測試版) - euskara
  163. 'プレミアムにサブスクライブ', // 日文 - 日本語
  164. '', // 加利西亞文 (測試版) - galego
  165. 'Subscriu-te a Premium', // 加泰蘭文 - català
  166. 'પ્રીમિયમ પર સબ્સ્ક્રાઇબ કરો', // 古吉拉特文 - ગુજરાતી
  167. 'Fizess elő a Premiumra!', // 匈牙利文 - magyar
  168. 'Berlangganan Premium', // 印尼文 - Indonesia
  169. 'Premium को सब्सक्राइब करें', // 印地文 - हिन्दी
  170. 'Suscríbete a Premium', // 西班牙文 - español
  171. 'Pretplatite se na Premium', // 克羅埃西亞文 - hrvatski
  172. 'Premiumಗೆ ಸಬ್‌ಸ್ರೈಬ್ ಮಾಡಿ', // 坎那達文 - ಕನ್ನಡ
  173. 'הרשמה ל-Premium', // 希伯來文 - עברית
  174. 'Εγγραφή στο Premium', // 希臘文 - Ελληνικά
  175. 'Premium-க்குச் சப்ஸ்கிரைப் செய்', // 坦米爾文 - தமிழ்
  176. 'Premium-এ সাবস্ক্রাইব করুন', // 孟加拉文 - বাংলা
  177. 'Abonnez‑vous à Premium', // 法文 - français
  178. 'اشتراک در Premium', // 波斯文 - فارسی
  179. 'Zasubskrybuj usługę Premium', // 波蘭文 - polski
  180. 'Tilaa Premium', // 芬蘭文 - suomi
  181. 'الاشتراك في Premium', // 阿拉伯文 - العربية
  182. 'الاشتراك في Premium', // 阿拉伯文 (陰性) - العربية (مؤنث)
  183. 'Подпишитесь на Premium', // 俄文 - русский
  184. 'Абонирайте се за Premium', // 保加利亞文 - български
  185. 'Subscribe to Premium', // 英文 - English
  186. 'Subscribe to Premium', // 英文(英國) - British English
  187. '', // 挪威文 - norsk
  188. 'สมัครสมาชิก Premium', // 泰文 - ไทย
  189. 'Передплатити Premium', // 烏克蘭文 - українська
  190. '', // 烏都文 (測試版) - اردو
  191. 'Langgan Premium', // 馬來文 - Melayu
  192. 'Premium ची सदस्यता घ्या', // 馬拉地文 - मराठी
  193. 'Přihlaste se k odběru předplatného Premium', // 捷克文 - čeština X
  194. 'Abonneren op Premium', // 荷蘭文 - Nederlands
  195. 'Zaregistrujte sa do služby Premium', // 斯洛伐克文 - slovenčina
  196. 'Mag-subscribe sa Premium', // 菲律賓文 - Filipino
  197. 'Đăng ký gói Premium', // 越南文 - Tiếng Việt
  198. 'Претплати се на Premium', // 塞爾維亞文 - српски
  199. '', // 愛爾蘭文 (測試版) - Gaeilge
  200. 'Prenumerera på Premium', // 瑞典文 - svenska
  201. 'Abbonati a Premium', // 義大利文 - italiano
  202. 'Assine o Premium', // 葡萄牙文 - português
  203. 'Premium abonnieren', // 德文 - Deutsch
  204. '訂閱 Premium', // 繁體中文
  205. 'Premium 구독하기', // 韓文 - 한국어
  206. '订阅 Premium', // 简体中文
  207. 'Abonează-te la Premium', // 羅馬尼亞文 - română
  208. ];
  209.  
  210.  
  211. var selectors = phrases.map(function(phrase) {
  212. if (phrase !== '') {
  213. return 'aside[aria-label="' + phrase + '"]';
  214. } else {
  215. return '';
  216. }
  217. }).filter(selector => selector !== '').join(', ');
  218.  
  219. var cssRules = '';
  220. if (settings.hideSelectors) {
  221. cssRules += selectors + '{ display: none !important; }';
  222. }
  223. if (settings.hideGrok) {
  224. cssRules += 'a[href="/i/grok"] { display: none !important; }';
  225. }
  226. if (settings.hidePremiumSignUp) {
  227. cssRules += 'a[href="/i/premium_sign_up"] { display: none !important; }';
  228. }
  229. if (settings.hideExplore) {
  230. cssRules += 'a[href="/explore"] { display: none !important; }';
  231. }
  232. if (settings.hideNotifications) {
  233. cssRules += 'a[href="/notifications"] { display: none !important; }';
  234. }
  235. if (settings.hideBookmarks) {
  236. cssRules += 'a[href="/i/bookmarks"] { display: none !important; }';
  237. }
  238. if (settings.hideMessages) {
  239. cssRules += 'a[href="/messages"] { display: none !important; }';
  240. }
  241.  
  242. addGlobalStyle(cssRules);
  243. })();