🌺 Clean ChatGPT

Cleaner and better ChatGPT 3.5

  1. // ==UserScript==
  2. // @name 🌺 Clean ChatGPT
  3. // @name:pl 🌺 Clean ChatGPT
  4. // @namespace https://gf.qytechs.cn/pl/users/1081704-nameniok
  5. // @version 1.2.5
  6. // @author Nameniok
  7. // @description Cleaner and better ChatGPT 3.5
  8. // @description:pl Czystszy i lepszy ChatGPT 3.5
  9. // @run-at document-start
  10. // @match https://chatgpt.com/*
  11. // @grant none
  12. // @license MIT
  13. // ==/UserScript==
  14.  
  15. // Cleaner ui //
  16. function removeElements() {
  17. var elementsToRemove = [
  18. ".to-gray-900.from-gray-900\\/0.bg-gradient-to-t.h-24",
  19. ".uppercase.rounded-md.md\\:text-sm.text-xs.px-1\\.5.py-0\\.5.text-yellow-900.bg-yellow-200",
  20. ".border-white\\/20.border.flex-shrink-0.mb-1.text-sm.rounded-md.gap-3.items-center.px-3.py-3.flex.kgold",
  21. ".py-3.px-4.bg-gray-900",
  22. "span.uppercase.rounded-md.md\\:text-sm.text-xs.px-1\\.5.py-0\\.5.text-yellow-900.bg-yellow-200",
  23. "#kcg",
  24. ".pt-2.pb-3",
  25. ".space-y-2.flex-col.flex",
  26. ".w-\\[72px\\].h-\\[72px\\].mb-3",
  27. ".font-medium.text-2xl.mb-5",
  28. // Upgrade button
  29. ".px-2.rounded-lg.m-0.hover\\:bg-token-sidebar-surface-secondary.radix-disabled\\:opacity-50.radix-disabled\\:pointer-events-none.focus\\:ring-0.cursor-pointer.text-sm.p-2\\.5.gap-2.flex.group",
  30. // Upgrade button on smaller width
  31. "div.\\!pr-3.group.radix-disabled\\:opacity-50.radix-disabled\\:pointer-events-none.hover\\:bg-token-main-surface-secondary.focus\\:ring-0.cursor-pointer.text-sm.p-2\\.5.rounded.m-1\\.5.gap-2.flex:nth-of-type(2)",
  32. ".justify-center.md\\:gap-2.gap-0.md\\:mb-4.md\\:m-auto.md\\:w-full.ml-1.flex.h-full > .grow",
  33.  
  34. ".text-token-text-tertiary > .mt-2",
  35. ".md\\:mt-14.relative",
  36. ".w-12.h-12.mb-6",
  37. ".w-12.h-12",
  38. ".pr-1.gap-2.flex",
  39. // Invite members button
  40. ".rounded-lg.hover\\:bg-token-sidebar-surface-secondary.radix-disabled\\:opacity-50.radix-disabled\\:pointer-events-none.focus\\:ring-0.cursor-pointer.text-sm.p-2\\.5.gap-2.flex.group",
  41. //
  42. // Archive small button (new update - 3 dots next to saved chat)
  43. //".flex.pr-2.gap-1\\.5.items-center.top-0.right-0.bottom-0.absolute > span > .radix-state-open\\:text-token-text-secondary.hover\\:text-token-text-secondary.transition.text-token-text-primary.justify-center.items-center.flex",
  44. //".flex.items-center.justify-center.text-token-text-primary.transition.hover\\:text-token-text-secondary.radix-state-open\\:text-token-text-secondary > svg",
  45. //
  46.  
  47. /*
  48. // CLEANER - Chat history not visible with this
  49. //".justify-center.items-center.flex-col.h-full.flex",
  50. //".text-token-text-primary.justify-center.items-center.flex-col.h-full.flex",
  51. */
  52.  
  53. /*
  54. // MEGA CLEAN
  55. ".ml-2.focus\\:ring-0.border-token-border-medium.border.rounded-lg.whitespace-nowrap.justify-center.items-center.w-9.h-9.flex.btn-small.btn-neutral.relative.btn",
  56. ".bg-token-sidebar-surface-primary.overflow-x-hidden.flex-shrink-0",
  57. ".justify-center.items-center.w-8.h-\\[72px\\].flex",
  58. ".z-40.top-1\\/2.left-0.fixed",
  59. "#headlessui-portal-root > div > div > .relative",
  60. ".active\\:opacity-50.focus\\:ring-white.focus\\:ring-inset.focus\\:ring-2.focus\\:outline-none.hover\\:text-token-text-primary.rounded-md.justify-center.items-center.w-10.h-10.inline-flex.-mt-0\\.5.-ml-0\\.5.left-0.absolute",
  61. */
  62.  
  63. ".md\\:px-\\[60px\\].text-token-text-secondary.text-xs.text-center.py-2.px-2.relative > span"
  64. ];
  65. elementsToRemove.forEach(function(selector) {
  66. var elements = document.querySelectorAll(selector);
  67. elements.forEach(function(element) {
  68. element.remove();
  69. });
  70. });
  71. setTimeout(function() {
  72. observer.disconnect();
  73. }, 5000);
  74. }
  75. function observeDOMChanges() {
  76. var observer = new MutationObserver(function(mutationsList, observer) {
  77. removeElements();
  78. });
  79. observer.observe(document.documentElement, { childList: true, subtree: true });
  80. return observer;
  81. }
  82. var observer = observeDOMChanges();
  83. window.addEventListener('load', function() {
  84. removeElements();
  85. });
  86.  
  87. function removeElements2() {
  88. var elementsToRemove = [
  89. ".to-gray-900.from-gray-900\\/0.bg-gradient-to-t.h-24",
  90. ".pr-1.gap-2.flex",
  91. // Hide upgrade button
  92. ".px-2.rounded-lg.m-0.hover\\:bg-token-sidebar-surface-secondary.radix-disabled\\:opacity-50.radix-disabled\\:pointer-events-none.focus\\:ring-0.cursor-pointer.text-sm.p-2\\.5.gap-2.flex.group",
  93. //
  94. // Hide upgrade button on smaller width
  95. "div.\\!pr-3.group.radix-disabled\\:opacity-50.radix-disabled\\:pointer-events-none.hover\\:bg-token-main-surface-secondary.focus\\:ring-0.cursor-pointer.text-sm.p-2\\.5.rounded.m-1\\.5.gap-2.flex:nth-of-type(2)",
  96. //
  97. ".text-token-text-tertiary > .mt-2",
  98. ".justify-center.md\\:gap-2.gap-0.md\\:mb-4.md\\:m-auto.md\\:w-full.ml-1.flex.h-full > .grow",
  99. ".md\\:px-\\[60px\\].text-token-text-secondary.text-xs.text-center.py-2.px-2.relative > span",
  100. ".font-medium.text-2xl.mb-5",
  101. "gizmo-shadow-stroke relative.flex h-full.items-center.justify-center.rounded-full.bg-white text-black",
  102. ".py-3.px-4.bg-gray-900",
  103. // Invite members button
  104. ".rounded-lg.hover\\:bg-token-sidebar-surface-secondary.radix-disabled\\:opacity-50.radix-disabled\\:pointer-events-none.focus\\:ring-0.cursor-pointer.text-sm.p-2\\.5.gap-2.flex.group",
  105. //
  106. // Share chat button
  107. ".my-1-5.border-b.border-token-border-light",
  108. ".border-token-border-light.border-b.my-1\\.5",
  109. //
  110. // Archive small button (new update - 3 dots next to saved chat)
  111. //".flex.pr-2.gap-1\\.5.items-center.top-0.right-0.bottom-0.absolute > span > .radix-state-open\\:text-token-text-secondary.hover\\:text-token-text-secondary.transition.text-token-text-primary.justify-center.items-center.flex",
  112. //".flex.items-center.justify-center.text-token-text-primary.transition.hover\\:text-token-text-secondary.radix-state-open\\:text-token-text-secondary > svg",
  113. //
  114.  
  115. ".pt-2.pb-3\\.5.gap-3\\.5.flex-col.flex",
  116. ".text-token-text-tertiary.font-normal.text-sm.text-center.max-w-sm",
  117. ".opacity-70.font-medium.text-sm.gap-1.items-center.flex > span",
  118. ".w-12.h-12.mb-6",
  119. ".w-12.h-12",
  120.  
  121. /*
  122. // CLEANER - Chat history not visible with this (remember - disable Chat history & training and Delete all chats)
  123. "div.group.radix-disabled\\:opacity-50.radix-disabled\\:pointer-events-none.hover\\:bg-token-main-surface-secondary.focus\\:ring-0.cursor-pointer.text-sm.p-2\\.5.rounded.m-1\\.5.gap-2.flex:nth-of-type(2)",
  124. "div.group.radix-disabled\\:opacity-50.radix-disabled\\:pointer-events-none.hover\\:bg-token-main-surface-secondary.focus\\:ring-0.cursor-pointer.text-sm.p-2\\.5.rounded.m-1\\.5.gap-2.flex:nth-of-type(3)",
  125. ".justify-center.items-center.flex-col.h-full.flex",
  126. ".text-token-text-primary.justify-center.items-center.flex-col.h-full.flex",
  127. */
  128.  
  129. /*
  130. // MEGA CLEAN
  131. ".ml-2.focus\\:ring-0.border-token-border-medium.border.rounded-lg.whitespace-nowrap.justify-center.items-center.w-9.h-9.flex.btn-small.btn-neutral.relative.btn",
  132. ".bg-token-sidebar-surface-primary.overflow-x-hidden.flex-shrink-0",
  133. ".justify-center.items-center.w-8.h-\\[72px\\].flex",
  134. ".z-40.top-1\\/2.left-0.fixed",
  135. "#headlessui-dialog-\\:r1p\\: > .flex.inset-0.fixed",
  136. "#headlessui-portal-root > div > div > .relative",
  137. ".active\\:opacity-50.focus\\:ring-white.focus\\:ring-inset.focus\\:ring-2.focus\\:outline-none.hover\\:text-token-text-primary.rounded-md.justify-center.items-center.w-10.h-10.inline-flex.-mt-0\\.5.-ml-0\\.5.left-0.absolute",
  138. */
  139.  
  140. // Gradient bar on button when clicked more
  141. ".absolute.bottom-0.right-0.top-0.bg-gradient-to-l"
  142. //
  143. ];
  144. elementsToRemove.forEach(function(selector) {
  145. var elements = document.querySelectorAll(selector);
  146. elements.forEach(function(element) {
  147. element.remove();
  148. });
  149. });
  150. }
  151.  
  152. function observeDOMChanges2() {
  153. var observer2 = new MutationObserver(function(mutationsList2, observer2) {
  154. mutationsList2.forEach(function(mutation) {
  155. if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
  156. var hasTextNodes = Array.from(mutation.addedNodes).some(function(node) {
  157. if (node.nodeType === 3 && node.textContent.trim().length > 0) {
  158. return true;
  159. } else if (node.nodeType === 1 && node.tagName.toLowerCase() === 'p') {
  160. return true;
  161. } else if (node.nodeType === 1 && node.classList) {
  162. var ignoredClasses = ['m-auto', 'md:gap-6', 'text-base', 'justify-center', 'py-2', 'px-4'];
  163. return ignoredClasses.some(function(ignoredClass) {
  164. return node.classList.contains(ignoredClass);
  165. });
  166. }
  167. return false;
  168. });
  169. if (!hasTextNodes) {
  170. removeElements2();
  171. }
  172. }
  173. });
  174. });
  175. observer2.observe(document.documentElement, { childList: true, subtree: true }); // subtree: false - for better optimization but inaccurate
  176. return observer2;
  177. }
  178. var observer2 = observeDOMChanges2();
  179. window.addEventListener('load', function() {
  180. removeElements2();
  181. });
  182.  
  183. // Auto Try again and continue generating (may not work) //
  184. function tryagain_autocontinue() {
  185. const divs = document.querySelectorAll('div');
  186. divs.forEach(div => {
  187. if (div.textContent.includes('Try again')) {
  188. div.click();
  189. } else if (div.textContent.includes('Continue generating')) {
  190. setTimeout(() => {
  191. div.click();
  192. }, 300);
  193. }
  194. });
  195. }
  196.  
  197. function observeDOMChanges3() {
  198. const observer3 = new MutationObserver((mutationsList3, observer3) => {
  199. for(const mutation of mutationsList3) {
  200. if (mutation.type === 'childList') {
  201. tryagain_autocontinue();
  202. }
  203. }
  204. });
  205. const config = { childList: true, subtree: true };
  206. observer3.observe(document.documentElement, config);
  207. }
  208.  
  209. observeDOMChanges3();

QingJ © 2025

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