ChatGPT Condenser

精简chatGPT 里面的对话,只剩下最新的4个对话

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey, Greasemonkey alebo Violentmonkey.

Na inštaláciu tohto skriptu je potrebné nainštalovať rozšírenie, ako napríklad Tampermonkey.

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey, % alebo Violentmonkey.

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey alebo Userscripts.

Na inštaláciu tohto skriptu je potrebné nainštalovať rozšírenie, ako napríklad Tampermonkey.

Na inštaláciu tohto skriptu je potrebné nainštalovať rozšírenie správcu používateľských skriptov.

(Už mám správcu používateľských skriptov, nechajte ma ho nainštalovať!)

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

(Už mám správcu používateľských štýlov, nechajte ma ho nainštalovať!)

// ==UserScript==
// @name         ChatGPT Condenser
// @namespace    http://tampermonkey.net/
// @version      2026-02-27
// @description  精简chatGPT 里面的对话,只剩下最新的4个对话
// @author       You
// @match        https://chatgpt.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=chatgpt.com
// @license All Rights Reserved
// @run-at       document-end
// ==/UserScript==
(function () {
  'use strict';

  // 插入样式
  const style = document.createElement('style');
  style.textContent = `
    #tm-float-btn {
      position: fixed;
      right: 20px;
      bottom: 90px; /* 右下角往上一点:数值越大越靠上 */
      z-index: 2147483647;

      padding: 10px 14px;
      border: 0;
      border-radius: 999px;
      background: #57c7ff; /* 天蓝色 */
      color: #0b2a3a;
      font-size: 14px;
      line-height: 1;
      cursor: pointer;
      box-shadow: 0 6px 18px rgba(0,0,0,.25);
      user-select: none;
    }
    #tm-float-btn:hover { filter: brightness(0.95); }
    #tm-float-btn:active { transform: scale(.98); }
  `;
  (document.head || document.documentElement).appendChild(style);

  // 创建按钮
  const btn = document.createElement('button');
  btn.id = 'tm-float-btn';
  btn.type = 'button';
  btn.textContent = '点击触发';

  btn.addEventListener('click', () => {
     // 这里就有两个严重逻辑漏洞
      /*
         1. 删除element时候 循环里面判断变量用的是ele.length 删一个少一个。所以像删只剩下4个,但是删除的更少
         2. 换个变量存储总大小,在删除。此时删除的是ele[i] 此时因为ele少了,所以删到最后 i越来越大 ele数组大小越来越少 就越界了
      */
    var ele = document.getElementsByClassName("text-token-text-primary w-full");
    console.log(ele.length);
    var ele_length = ele.length - 4;
    for(var i = 0; i < ele_length; i++){
       ele[0].remove();
    }
  });

  (document.body || document.documentElement).appendChild(btn);
})();

(function () {
  'use strict';

  // ====== Styles ======
  const style = document.createElement('style');
  style.textContent = `
    #tm-float-btn {
      position: fixed;
      right: 20px;
      bottom: 20%; /* 越大越靠上 */
      z-index: 2147483647;

      padding: 10px 14px;
      border: 0;
      border-radius: 999px;
      background: #57c7ff; /* 天蓝色 */
      color: #0b2a3a;
      font-size: 14px;
      line-height: 1;
      cursor: pointer;
      box-shadow: 0 6px 18px rgba(0,0,0,.25);
      user-select: none;
    }
    #tm-float-btn:hover { filter: brightness(0.95); }
    #tm-float-btn:active { transform: scale(.98); }

    /* Toast */
    .tm-toast {
      position: fixed;
      top: 18%;
      left: 50%;
      transform: translateX(-50%);
      z-index: 2147483647;

      padding: 12px 16px;
      border-radius: 12px;
      background: rgba(0, 0, 0, 0.78);
      color: #fff;
      font-size: 40px;
      line-height: 1.4;
      box-shadow: 0 10px 28px rgba(0,0,0,.28);

      opacity: 0;
      transition: opacity 240ms ease, transform 240ms ease;
      pointer-events: none;
      white-space: nowrap;
    }
    .tm-toast.tm-toast-show {
      opacity: 1;
      transform: translateX(-50%) translateY(0);
    }
    .tm-toast.tm-toast-hide {
      opacity: 0;
      transform: translateX(-50%) translateY(-8px);
    }
  `;
  (document.head || document.documentElement).appendChild(style);

  // ====== Toast helper ======
  let toastEl = null;
  let toastTimer1 = null;
  let toastTimer2 = null;

  function showToast(message, waitMs = 2000, fadeMs = 600) {
    // 若已有 toast,先清理
    if (toastEl) {
      toastEl.remove();
      toastEl = null;
    }
    if (toastTimer1) clearTimeout(toastTimer1);
    if (toastTimer2) clearTimeout(toastTimer2);

    toastEl = document.createElement('div');
    toastEl.className = 'tm-toast';
    toastEl.textContent = message;

    (document.body || document.documentElement).appendChild(toastEl);

    // 触发进入动画
    requestAnimationFrame(() => {
      toastEl.classList.add('tm-toast-show');
    });

    // 2秒后开始淡出
    toastTimer1 = setTimeout(() => {
      if (!toastEl) return;
      toastEl.classList.add('tm-toast-hide');

      // 淡出结束后移除
      toastTimer2 = setTimeout(() => {
        toastEl?.remove();
        toastEl = null;
      }, fadeMs);
    }, waitMs);
  }

  // ====== Button ======
  const btn = document.createElement('button');
  btn.id = 'tm-float-btn';
  btn.type = 'button';
  btn.textContent = '点击触发';

  btn.addEventListener('click', async () => {

    var ele = document.getElementsByClassName("text-token-text-primary w-full");
    console.log(ele.length);
    var ele_length = ele.length;
    for(var i = 0; i < ele_length-8; i++){
       ele[0].remove();
    }
    showToast("原大小:  " + (ele_length) + "      删除后:  " + ele.length, 1000, 500);
  });

  (document.body || document.documentElement).appendChild(btn);
})();