- // ==UserScript==
- // @name KeepChatGPT--平台修改版
- // @description 支持上传文件对话;这是一个ChatGPT的畅聊与增强插件。开源免费。不仅能解决所有报错不再刷新,还有保持活跃、取消审计、克隆对话、净化首页、展示大屏、展示全屏、言无不尽、拦截跟踪、日新月异等多个高级功能。
- // @version 14.94
- // @author akmibo
- // @namespace https://github.com/xcanwin/KeepChatGPT/
- // @supportURL https://github.com/xcanwin/KeepChatGPT/
- // @description:zh-CN 这是一个ChatGPT的畅聊与增强插件。开源免费。不仅能解决所有报错不再刷新,还有保持活跃、取消审计、克隆对话、净化首页、展示大屏、展示全屏、言无不尽等多个高级功能。让我们的AI体验无比顺畅、丝滑、高效、简洁。
- // @license GPL-2.0-only
- // @match https://chat.openai.com/*
- // @grant GM_addStyle
- // @grant GM_addElement
- // @grant GM_setValue
- // @grant GM_getValue
- // @grant unsafeWindow
- // @run-at document-idle
- // @noframes
- // ==/UserScript==
-
-
- (function() {
- 'use strict';
-
- var global = {};
-
- const $ = (Selector, el) => (el || document).querySelector(Selector);
- const $$ = (Selector, el) => (el || document).querySelectorAll(Selector);
-
- const u = `/api/${GM_info.script.namespace.slice(33, 34)}uth/s${GM_info.script.namespace.slice(28, 29)}ssion`;
- const symbol1_selector = 'nav.flex .transition-colors';
- const symbol2_selector = 'button.justify-center .sr-only';
-
- const getLang = function() {
- let lang = `
- {
- "index": {"暗色主题": "dm", "显示调试": "sd", "取消审计": "cm", "取消动画": "ca", "关于": "ab", "建议间隔30秒": "si", "调整间隔": "mi", "检查更新": "cu", "当前版本": "cv", "发现最新版": "dl", "已是最新版": "lv", "克隆对话": "cc", "净化页面": "pp", "展示大屏": "ls", "展示全屏": "fs", "言无不尽": "sc", "拦截跟踪": "it", "日新月异": "ec", "赞赏鼓励": "ap"},
- "local": {
- "ar": {"dm": "الوضع الداكن", "sd": "إظهار التصحيح", "cm": "إلغاء التدقيق", "ca": "إلغاء الرسوم المتحركة", "ab": "حول", "si": "اقتراح فاصل زمني 30 ثانية", "mi": "تعديل الفاصل", "cu": "التحقق من التحديثات", "cv": "الإصدار الحالي", "dl": "اكتشف أحدث إصدار", "lv": "أحدث إصدار", "cc": "استنساخ المحادثة", "pp": "تنقية الصفحة", "ls": "عرض الشاشة الكبيرة", "fs": "عرض بملء الشاشة", "sc": "تحدث بشكل كامل", "it": "اعتراض التتبع", "ec": "التغير المستمر", "ap": "تقدير"},
- "bg": {"dm": "Тъмна тема", "sd": "Показване на отстраняване на грешки", "cm": "Отказ от одит", "ca": "Отмяна на анимацията", "ab": "За", "si": "Предложете интервал от 30 секунди", "mi": "Промяна на интервала", "cu": "Проверка на актуализации", "cc": "Клониране на разговора", "pp": "Почистване на страницата", "ls": "Показване на голям екран", "fs": "Показване на цял екран", "sc": "Говорете пълно", "it": "Прихващане на проследяването", "ec": "Непрекъснато променящ се", "ap": "Оценка"},
- "cs": {"dm": "Tmavý režim", "sd": "Zobrazit ladění", "cm": "Zrušení auditu", "ca": "Zrušit animaci", "ab": "O", "si": "Navrhnout interval 30 sekund", "mi": "Upravit interval", "cu": "Kontrola aktualizací", "cc": "Klonovat konverzaci", "pp": "Očistit stránku", "ls": "Zobrazení velkého displeje", "fs": "Zobrazit na celou obrazovku", "sc": "Mluvte úplně", "it": "Zachytávání sledování", "ec": "Neustále se měnící", "ap": "Ocenění"},
- "da": {"dm": "Mørk tilstand", "sd": "Vis fejlfinding", "cm": "Annuller revision", "ca": "Annuller animation", "ab": "Om", "si": "Forslag interval på 30 sekunder", "mi": "Ændre interval", "cu": "Tjek for opdateringer", "cc": "Klon samtalen", "pp": "Rensning af siden", "ls": "Vis stor skærm", "fs": "Vis i fuld skærm", "sc": "Fuldfør udtalelsen", "it": "Interceptor sporing", "ec": "Konstant forandring", "ap": "Værdssættelse"},
- "de": {"dm": "Dunkler Modus", "sd": "Fehlerbehebung anzeigen", "cm": "Prüfung abbrechen", "ca": "Animation abbrechen", "ab": "Über", "si": "Vorschlag für Intervall von 30 Sekunden", "mi": "Intervall bearbeiten", "cu": "Überprüfung auf Updates", "cv": "Aktuelle Version", "dl": "Entdecken Sie die neueste Version", "lv": "ist die neueste Version", "cc": "Konversation klonen", "pp": "Seite bereinigen", "ls": "Großen Bildschirm anzeigen", "fs": "Vollbild anzeigen", "sc": "Sprich vollständig", "it": "Tracking abfangen", "ec": "Ständiger Wandel", "ap": "Wertschätzung"},
- "el": {"dm": "Σκοτεινή θεματολογία", "sd": "Εμφάνιση αποσφαλμάτωσης", "cm": "Ακύρωση ελέγχου", "ca": "Ακύρωση κινούμενων σχεδίων", "ab": "Σχετικά με", "si": "Προτείνετε διάστημα 30 δευτερολέπτων", "mi": "Τροποποίηση διαστήματος", "cu": "Έλεγχος ενημερώσεων", "cc": "Κλωνοποίηση συνομιλίας", "pp": "Καθαρισμός σελίδας", "ls": "Εμφάνιση μεγάλης οθόνης", "fs": "Εμφάνιση πλήρους οθόνης", "sc": "Ολοκλήρωσε την ομιλία", "it": "Ανίχνευση παρακολούθησης", "ec": "Αδιάκοπη αλλαγή", "ap": "Εκτίμηση"},
- "en": {"dm": "Dark mode", "sd": "Show debugging", "cm": "Cancel audit", "ca": "Cancel animation", "ab": "About", "si": "Suggest interval of 30 seconds; The author usually sets 150", "mi": "Modify interval", "cu": "Check for updates", "cv": "Current version", "dl": "Discover the latest version", "lv": "is the latest version", "cc": "Conversation cloning", "pp": "Purified page", "ls": "Wide display mode", "fs": "Fullscreen mode", "sc": "Complete response", "it": "Intercept tracking", "ec": "More chat info", "ap": "Sponsor"},
- "eo": {"dm": "Malhela moduso", "sd": "Montri depuradon", "cm": "Nuligi kontroli", "ca": "Nuligi animacion", "ab": "Pri", "si": "Sugesti intervalon de 30 sekundoj", "mi": "Modifi intervalon", "cu": "Kontroli ĝisdatigojn", "cc": "Kloni konversacion", "pp": "Pura paĝo", "ls": "Montri grandan ekrane", "fs": "Montri plenekranon", "sc": "Parolu plene", "it": "Intercepti Trakadon", "ec": "Ĉiam ŝanĝiĝanta", "ap": "Aprobo"},
- "es": {"dm": "Modo oscuro", "sd": "Mostrar depuración", "cm": "Cancelar auditoría", "ca": "Cancelar animación", "ab": "Acerca de", "si": "Sugerir un intervalo de 30 segundos", "mi": "Modificar intervalo", "cu": "Comprobar actualizaciones", "cv": "Versión actual", "dl": "Descubre la última versión", "lv": "es la última versión", "cc": "Clonar conversación", "pp": "Purificar página", "ls": "Mostrar pantalla grande", "fs": "Mostrar pantalla completa", "sc": "Termina tu discurso", "it": "Interceptar Rastreo", "ec": "Cambio constante", "ap": "Apreciación"},
- "fi": {"dm": "Tumma tila", "sd": "Näytä virheenkorjaus", "cm": "Peruuta tarkistus", "ca": "Peruuta animaatio", "ab": "Tietoa", "si": "Ehdota 30 sekunnin väliaikaa", "mi": "Muokkaa väliä", "cu": "Tarkista päivitykset", "cc": "Kloonaa keskustelu", "pp": "Puhdista sivu", "ls": "Näytä suuri näyttö", "fs": "Näytä koko näyttö", "sc": "Puhu loppuun asti", "it": "Sieppaa seuranta", "ec": "Jatkuvasti muuttuva", "ap": "Arvostus"},
- "fr": {"dm": "Mode sombre", "sd": "Afficher le débogage", "cm": "Annuler l'audit", "ca": "Annuler l'animation", "ab": "À propos de", "si": "Suggérer un intervalle de 30 secondes", "mi": "Modifier l'intervalle", "cu": "Vérifier les mises à jour", "cv": "Version actuelle", "dl": "Découvrir la dernière version", "lv": "est la dernière version", "cc": "Cloner la conversation", "pp": "Purifier la page", "ls": "Afficher grand écran", "fs": "Afficher en plein écran", "sc": "Parlez complètement", "it": "Interception de suivi", "ec": "En perpétuelle évolution", "ap": "Appréciation"},
- "fr-CA": {"dm": "Mode nuit", "sd": "Afficher le débogage", "cm": "Annuler la vérification", "ca": "Annuler l'animation", "ab": "À propos de", "si": "Suggérer un intervalle de 30 secondes", "mi": "Modifier l'intervalle", "cu": "Vérifier les mises à jour", "cv": "Version actuelle", "dl": "Découvrir la dernière version", "lv": "est la dernière version", "cc": "Cloner la conversation", "pp": "Purifier la page", "ls": "Afficher grand écran", "fs": "Afficher en plein écran", "sc": "Parlez complètement", "it": "Intercepter le suivi", "ec": "Évolution constante", "ap": "Appréciation"},
- "he": {"dm": "מצב כהה", "sd": "הצגת התיקון", "cm": "ביטול ביקורת", "ca": "בטל אנימציה", "ab": "אודות", "si": "הצע מרווח של 30 שניות", "mi": "שינוי מרווח", "cu": "בדיקת עדכונים", "cc": "שכפול שיחה", "pp": "טיהור הדף", "ls": "תצוגת מסך גדול", "fs": "הצג מסך מלא", "sc": "דבר במלואו", "it": "התערבות במעקב", "ec": "שינוי מתמיד", "ap": "הערכה"},
- "hu": {"dm": "Sötét mód", "sd": "Hibakeresés mutatása", "cm": "Ellenőrzés megszüntetése", "ca": "Animáció törlése", "ab": "Rólunk", "si": "Javaslat 30 másodperces időközre", "mi": "Időköz módosítása", "cu": "Frissítések keresése", "cc": "Beszélgetés klónozása", "pp": "Oldal tisztítása", "ls": "Nagy képernyő megjelenítése", "fs": "Teljes képernyő megjelenítése", "sc": "Beszélj teljesen", "it": "Követés elfogása", "ec": "Folyamatos változás", "ap": "Elismerés"},
- "id": {"dm": "Mode gelap", "sd": "Tampilkan debugging", "cm": "Batalkan audit", "ca": "Batalkan animasi", "ab": "Tentang", "si": "Sarankan interval 30 detik", "mi": "Modifikasi interval", "cu": "Periksa Pembaruan", "cc": "Klon percakapan", "pp": "Membersihkan halaman", "ls": "Tampilkan layar besar", "fs": "Tampilkan layar penuh", "sc": "Berbicara secara lengkap", "it": "Intersepsi Pelacakan", "ec": "Perubahan terus-menerus", "ap": "Penghargaan"},
- "it": {"dm": "Modalità scura", "sd": "Mostra debug", "cm": "Annulla verifica", "ca": "Annulla animazione", "ab": "Riguardo a", "si": "Suggerisci un intervallo di 30 secondi", "mi": "Modifica intervallo", "cu": "Verifica aggiornamenti", "cv": "Versione attuale", "dl": "Scopri l'ultima versione", "lv": "è l'ultima versione", "cc": "Clona conversazione", "pp": "Purifica pagina", "ls": "Mostra grande schermo", "fs": "Mostra a schermo intero", "sc": "Parla completamente", "it": "Intercettare il tracciamento", "ec": "Cambiamento costante", "ap": "Apprezzamento"},
- "ja": {"dm": "ダークモード", "sd": "デバッグを表示", "cm": "監査をキャンセル", "ca": "アニメーションのキャンセル", "ab": "について", "si": "30秒間隔を提案する", "mi": "間隔を変更する", "cu": "更新をチェックする", "cv": "現在のバージョン", "dl": "最新バージョンを発見する", "lv": "最新バージョンです", "cc": "会話をクローンする", "pp": "ページを浄化する", "ls": "ビッグスクリーンを表示する", "fs": "フルスクリーン表示", "sc": "完全に話してください", "it": "トラッキングの傍受", "ec": "絶え間ない変化", "ap": "評価"},
- "ka": {"dm": "ბნელი რეჟიმი", "sd": "გამოჩენა დებაგი", "cm": "ანულირება აუდიტი", "ca": "ანიმაციის გაუქმება", "ab": "შესახებ", "si": "30 წამის ინტერვალის შეტანა", "mi": "ინტერვალის შეცვლა", "cu": "განახლებების შემოწმება", "cc": "კონვერსაციის კლონირება", "pp": "გვერდის გაწმენდა", "ls": "დიდი ეკრანის გამოსახულება", "fs": "მთელი ეკრანის ჩვენება", "sc": "სრულად ილაპარაკეთ", "it": "თვალყური მისმართავა", "ec": "მუდმივი ცვლილება", "ap": "შეფასება"},
- "ko": {"dm": "다크 모드", "sd": "디버깅 표시", "cm": "감사 취소", "ca": "애니메이션 취소", "ab": "관하여", "si": "30초 간격 건의", "mi": "간격 수정", "cu": "업데이트 확인", "cv": "현재 버전", "dl": "최신 버전 찾기", "lv": "최신 버전입니다.", "cc": "대화 복제", "pp": "페이지 정화", "ls": "큰 화면 표시", "fs": "전체 화면 표시", "sc": "완전히 말하세요", "it": "추적 가로채기", "ec": "끊임없는 변화", "ap": "감사"},
- "nb": {"dm": "Mørk modus", "sd": "Vis feilsøking", "cm": "Avbryt revisjonen", "ca": "Avbryt animasjon", "ab": "Om", "si": "Forslag om et intervall på 30 sekunder", "mi": "Endre intervall", "cu": "Sjekk etter oppdateringer", "cc": "Klon samtalen", "pp": "Rens side", "ls": "Vis stor skjerm", "fs": "Vis i fullskjerm", "sc": "Snakk fullstendig", "it": "Intercept sporing", "ec": "Kontinuerlig endring", "ap": "Verdsatt"},
- "nl": {"dm": "Donkere modus", "sd": "Foutopsporing weergeven", "cm": "Controle annuleren", "ca": "Animatie annuleren", "ab": "Over", "si": "Stel een interval van 30 seconden voor", "mi": "Interval wijzigen", "cu": "Controleren op updates", "cc": "Gesprek klonen", "pp": "Pagina zuiveren", "ls": "Groot scherm weergeven", "fs": "Volledig scherm weergeven", "sc": "Spreek volledig uit", "it": "Onderscheppen van tracking", "ec": "Voortdurende verandering", "ap": "Waardering"},
- "pl": {"dm": "Tryb ciemny", "sd": "Pokaż debugowanie", "cm": "Anuluj audyt", "ca": "Anuluj animację", "ab": "O", "si": "Zasugeruj interwał 30 sekund", "mi": "Zmień interwał", "cu": "Sprawdź aktualizacje", "cc": "Klonuj rozmowę", "pp": "Oczyść stronę", "ls": "Wyświetl duży ekran", "fs": "Wyświetl pełny ekran", "sc": "Mów całkowicie", "it": "Przechwytywanie śledzenia", "ec": "Ciągłe zmiany", "ap": "Docenienie"},
- "pt-BR": {"dm": "Modo escuro", "sd": "Mostrar depuração", "cm": "Cancelar auditoria", "ca": "Cancelar animação", "ab": "Sobre", "si": "Sugira um intervalo de 30 segundos", "mi": "Modificar intervalo", "cu": "Verificar atualizações", "cc": "Clonar conversa", "pp": "Purificar página", "ls": "Exibir tela grande", "fs": "Exibir em tela cheia", "sc": "Fale completamente", "it": "Interceptar Rastreamento", "ec": "Mudança constante", "ap": "Apreciação"},
- "ro": {"dm": "Mod întunecat", "sd": "Afișare depanare", "cm": "Anulare audit", "ca": "Anulare animație", "ab": "Despre", "si": "Sugerați un interval de 30 secunde", "mi": "Modificați intervalul", "cu": "Verifică actualizări", "cc": "Clonează conversația", "pp": "Purificare pagină", "ls": "Afișare ecran mare", "fs": "Afișare pe tot ecranul", "sc": "Vorbiți complet", "it": "Interceptarea urmăririi", "ec": "Schimbare continuă", "ap": "Apreciere"},
- "ru": {"dm": "Темный режим", "sd": "Показать отладку", "cm": "Отменить аудит", "ca": "Отменить анимацию", "ab": "О", "si": "Предложить интервал в 30 секунд", "mi": "Изменить интервал", "cu": "Проверить обновления", "cc": "Клонировать диалог", "pp": "Очистить страницу", "ls": "Показать большой экран", "fs": "Показать на полный экран", "sc": "Говорите полностью", "it": "Перехват отслеживания", "ec": "Постоянное изменение", "ap": "Признательность"},
- "sk": {"dm": "Tmavý režim", "sd": "Zobraziť ladenie", "cm": "Zrušiť audit", "ca": "Zrušiť animáciu", "ab": "O", "si": "Navrhnúť interval 30 sekúnd", "mi": "Zmena intervalu", "cu": "Kontrola aktualizácií", "cc": "Klonovať konverzáciu", "pp": "Očistiť stránku", "ls": "Zobraziť veľkú obrazovku", "fs": "Zobraziť na celú obrazovku", "sc": "Hovorte úplne", "it": "Zachytenie sledovania", "ec": "Neustále sa meniace", "ap": "Ocenenie"},
- "sr": {"dm": "Тамни режим", "sd": "Прикажи отклањање грешака", "cm": "Откажи ревизију", "ca": "Откажи анимацију", "ab": "О", "si": "Predložiti interval od 30 sekundi", "mi": "Измена интервала", "cu": "Provera ažuriranja", "cc": "Клонирај разговор", "pp": "Прочисти страницу", "ls": "Прикажи велики екран", "fs": "Прикажи на целом екрану", "sc": "Говорите у потпуности", "it": "Пресретање праћења", "ec": "Непрестана промена", "ap": "Поштовање"},
- "sv": {"dm": "Mörkt läge", "sd": "Visa felsökning", "cm": "Avbryt revision", "ca": "Avbryt animation", "ab": "Om", "si": "Föreslå intervall på 30 sekunder", "mi": "Ändra intervall", "cu": "Kontrollera uppdateringar", "cc": "Klonar samtal", "pp": "Rensa sidan", "ls": "Visa stor skärm", "fs": "Visa i helskärm", "sc": "Tala helt klart", "it": "Interceptera spårning", "ec": "Ständig förändring", "ap": "Uppskattning"},
- "th": {"dm": "โหมดมืด", "sd": "แสดงการแก้ไขข้อผิดพลาด", "cm": "ยกเลิกการตรวจสอบ", "ca": "ยกเลิกการเคลื่อนไหว", "ab": "เกี่ยวกับ", "si": "เสนอช่วงเวลา 30 วินาที", "mi": "แก้ไขระยะห่าง", "cu": "ตรวจสอบการอัปเดต", "cc": "โคลนสนทนา", "pp": "ทำความสะอาดหน้า", "ls": "แสดงหน้าจอใหญ่", "fs": "แสดงแบบเต็มหน้าจอ", "sc": "พูดคุยให้เสร็จสิ้น", "it": "การดักจับการติดตาม", "ec": "การเปลี่ยนแปลงตลอดเวลา", "ap": "การประเมินค่า"},
- "tr": {"dm": "Karanlık mod", "sd": "Hata ayıklama göster", "cm": "Denetimi İptal Et", "ca": "Animasyonu iptal et", "ab": "Hakkında", "si": "30 saniyelik aralık önerin", "mi": "Aralığı değiştir", "cu": "Güncelleştirmeleri kontrol et", "cc": "Sohbeti kopyala", "pp": "Sayfayı temizle", "ls": "Büyük ekranı görüntüle", "fs": "Tam ekran görüntüle", "sc": "Tamamlayın konuşmayı", "it": "İzlemeyi Engellemek", "ec": "Sürekli değişim", "ap": "Takdir"},
- "uk": {"dm": "Темний режим", "sd": "Показати налагодження", "cm": "Скасувати аудит", "ca": "Скасувати анімацію", "ab": "Про", "si": "Запропонуйте інтервал у 30 секунд", "mi": "Змінити інтервал", "cu": "Перевірити оновлення", "cc": "Клонувати діалог", "pp": "Очистити сторінку", "ls": "Відобразити великий екран", "fs": "Показати на повний екран", "sc": "Говоріть повністю", "it": "Перехоплення відстеження", "ec": "Постійна зміна", "ap": "Вдячність"},
- "ug": {"dm": "تېما كۆرسىتىش", "sd": "كۆرسەتكەن يۇقىرىلاش", "cm": "ئەمەلدىن قالدۇرۇش", "ca": "ئېنىماتىكىنى بىكار قىلىش", "ab": "ئۇچۇرلىق", "si": "30 سىكونتلىك ئارىلىقنى سۇنۇشتۇرۇش", "mi": "ئارىلىق ئۆزگەرتىش", "cu": "يېڭىلانما كۆزەت", "cc": "كۆپچەي ئىككىلىش", "pp": "چۈشۈرۈش بەت", "ls": "كۆرسىتىش چوڭ ئېكران", "fs": "تولانما پۈتۈن ئېكران", "sc": "تاماملا سۆزلىشىڭىز", "it": "قولايلىنىش تىزىتكۈن", "ec": "تەڭشەك ئىستىقامەت", "ap": "قىلىش"},
- "vi": {"dm": "Chế độ tối", "sd": "Hiển thị gỡ lỗi", "cm": "Hủy đánh giá", "ca": "Hủy hoạt hình", "ab": "Về", "si": "Đề xuất khoảng thời gian 30 giây", "mi": "Sửa khoảng cách", "cu": "Kiểm tra cập nhật", "cc": "Sao chép cuộc trò chuyện", "pp": "Làm sạch trang", "ls": "Hiển thị màn hình lớn", "fs": "Hiển thị toàn màn hình", "sc": "Nói đầy đủ", "it": "Chặn Theo Dõi", "ec": "Luôn thay đổi", "ap": "Đánh giá"},
- "zh-CN": {"dm": "暗色主题", "sd": "显示调试", "cm": "取消审计", "ca": "取消动画", "ab": "关于", "si": "建议间隔30秒以上,作者平时设置的是150", "mi": "调整间隔", "cu": "检查更新", "cc": "克隆对话", "pp": "净化页面", "ls": "展示大屏", "fs": "展示全屏", "sc": "言无不尽", "it": "拦截跟踪", "ec": "日新月异", "ap": "赞赏鼓励"},
- "zh-TW": {"dm": "暗黑模式", "sd": "顯示調試", "cm": "取消稽核", "ca": "取消動畫", "ab": "關於", "si": "建議間隔30秒", "mi": "調整間隔", "cu": "檢查更新", "cc": "複製對話", "pp": "淨化頁面", "ls": "顯示大螢幕", "fs": "顯示全螢幕", "sc": "言無不盡", "it": "拦截追踪", "ec": "日新月異", "ap": "讚賞鼓勵"}
- }
- }
- `;
- lang = JSON.parse(lang);
- for(let k in lang.local){
- if (k.length > 2 && !(k.slice(0, 2) in lang.local)) {
- lang.local[k.slice(0, 2)] = lang.local[k];
- }
- }
- const nls = navigator.languages;
- let language = "zh-CN";
- for (let j = 0; j < nls.length; j++) {
- let nl = nls[j];
- if (nl in lang.local) {
- language = nl;
- break;
- } else if (nl.length > 2 && nl.slice(0, 2) in lang.local) {
- language = nl.slice(0, 2);
- break;
- }
- }
- //language = "en"; //Debug English
- return [lang.index, lang.local[language], language];
- };
-
- const [langIndex, langLocal, language] = getLang();
-
- const tl = function(s) {
- let r;
- try {
- const i = langIndex[s];
- r = langLocal[i];
- } catch (e) {
- r = s;
- }
- if (r === undefined) {r = s;}
- return r;
- };
-
- const sv = function(key, value = "") {
- GM_setValue(key, value);
- };
-
- const gv = function(key, value = "") {
- return GM_getValue(key, value);
- };
-
- const formatDate = function(d) {
- return (new Date(d)).toLocaleString();
- };
-
- const formatDate2 = function(datetime) {
- const Y = datetime.getFullYear();
- const M = (datetime.getMonth() + 1).toString().padStart(2, '0');
- const D = datetime.getDate().toString().padStart(2, '0');
- const h = datetime.getHours().toString().padStart(2, '0');
- const m = datetime.getMinutes().toString().padStart(2, '0');
- const currentDate = new Date();
- let formatted_date;
- if (currentDate.toISOString().split('T')[0] === (datetime).toISOString().split('T')[0]) {
- formatted_date = `${h}:${m}`;
- } else if (Math.floor(Math.abs(datetime - currentDate) / (24 * 60 * 60 * 1000)) < 6) {
- const weekday = language.slice(0, 2) === "zh" ? ['周日', '周一', '周二', '周三', '周四', '周五', '周六'] : ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
- formatted_date = weekday[datetime.getDay()];
- } else {
- formatted_date = `${M}-${D}`;
- }
- return formatted_date;
- }
-
- const formatJson = function(d) {
- try {
- const j = JSON.parse(d);
- return `<pre>${JSON.stringify(j, null, 2)}</pre>`;
- } catch (e) {
- return d;
- }
- };
-
- const setIfr = function(u = "") {
- if ($("#xcanwin") === null) {
- const nIfr = document.createElement('iframe');
- nIfr.id = "xcanwin";
- nIfr.style = `height: 80px; width: 100%; display: none;`;
- if (gv("k_showDebug", false) === true) {
- nIfr.style.display = '';
- } else {
- nIfr.style.display = 'none';
- }
- if (u) {
- nIfr.src = u;
- }
- nIfr.onload = function() {
- const nIfrText = $("#xcanwin").contentWindow.document.documentElement.innerText;
- try {
- $("#xcanwin").contentWindow.document.documentElement.style = `background: #FCF3CF; height: 360px; width: 1080px; overflow; auto;`;
- if (nIfrText.indexOf(`"expires":"`) > -1) {
- console.log(`KeepChatGPT: IFRAME: Expire date: ${formatDate(JSON.parse(nIfrText).expires)}`);
- $("#xcanwin").contentWindow.document.documentElement.innerHTML = formatJson(nIfrText);
- } else if (nIfrText.match(/Please stand by|while we are checking your browser|Please turn JavaScript on|Please enable Cookies|reload the page/)) {
- console.log(`KeepChatGPT: IFRAME: BypassCF`);
- }
- } catch (e) {
- console.log(`KeepChatGPT: IFRAME: ERROR: ${e},\nERROR RESPONSE:\n${nIfrText}`);
- }
- };
- $("main").lastElementChild.appendChild(nIfr);
- } else{
- if (u) {
- $("#xcanwin").src = u;
- }
- }
- };
-
- const keepChat = function() {
- fetch(u).then((response) => {
- response.text().then((data) => {
- try {
- const contentType = response.headers.get('Content-Type');
- if (contentType.indexOf("application/json") > -1 && response.status !== 403 && data.indexOf(`"expires":"`) > -1) {
- console.log(`KeepChatGPT: FETCH: Expire date: ${formatDate(JSON.parse(data).expires)}`);
- $("#xcanwin").contentWindow.document.documentElement.innerHTML = formatJson(data);
- } else {
- setIfr(u);
- }
- } catch (e) {
- console.log(`KeepChatGPT: FETCH: ERROR: ${e},\nERROR RESPONSE:\n${data}`);
- setIfr(u);
- }
- })
- });
- }
-
- const ncheckbox = function() {
- const nsvg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
- nsvg.setAttribute("viewBox", "0 0 100 30");
- nsvg.classList.add("checkbutton");
- nsvg.innerHTML = `<g fill="none" fill-rule="evenodd"><path fill="#E3E3E3" d="M0 15C0 6.716 6.716 0 15 0h14c8.284 0 15 6.716 15 15s-6.716 15-15 15H15C6.716 30 0 23.284 0 15z"/><circle fill="#FFF" cx="15" cy="15" r="13"/></g>`;
- return nsvg.cloneNode(true);
- };
-
- const ndialog = function(title = 'KeepChatGPT', content = '', buttonvalue = 'OK', buttonfun = function(t) {return t;}, inputtype = 'br', inputvalue = '') {
- const ndivalert = document.createElement('div');
- ndivalert.setAttribute("class", "kdialog relative z-50");
- ndivalert.innerHTML = `
- <div class="fixed inset-0 bg-gray-500/90"></div>
- <div class="fixed inset-0 overflow-y-auto z-50" style="display: flex; justify-content: center; align-items: center;">
- <div class="flex items-end justify-center min-h-full p-4 sm:items-center sm:p-0 text-center">
- <div class="kdialogwin bg-white dark:bg-gray-900 rounded-lg sm:max-w-lg sm:p-6 text-left">
- <div class="flex items-center justify-between">
- <div style="min-width: 15rem">
- <div class="flex items-center justify-between">
- <h3 class="dark:text-gray-200 text-gray-900 text-lg">${title}</h3>
- <p class="kdialogclose" style="cursor: pointer; font-weight: bold; color: #aaa;">X</p>
- </div>
- <p class="dark:text-gray-100 mt-2 text-gray-500 text-sm" style="margin-bottom: 0.6rem;">${content}</p>
- <div class="md:py-3 md:pl-4 border border-black/10 bg-white dark:border-gray-900/50 dark:text-white dark:bg-gray-700 rounded-md shadow-[0_0_10px_rgba(0,0,0,0.10)] dark:shadow-[0_0_15px_rgba(0,0,0,0.10)]">
- <${inputtype} class="kdialoginput resize-none border-0 bg-transparent p-0 pr-7 focus:ring-0 focus-visible:ring-0 dark:bg-transparent" style="max-height: 12.5rem; height: 1.5rem; outline: none;" placeholder=""></${inputtype}>
- </div>
- </div>
- </div>
- <div class="flex sm:flex-row-reverse sm:mt-4"><button class="btn btn-neutral kdialogbtn">${buttonvalue}</button>
- </div>
- </div>
- </div>
- </div>
- `;
- if (inputtype === 'br') {
- $(".kdialoginput", ndivalert).parentElement.style.display = 'none';
- } else if (inputtype === 'img') {
- $(".kdialoginput", ndivalert).src = inputvalue;
- $(".kdialoginput", ndivalert).style = `max-height: 19rem; height: unset; display: block; margin: 0 auto;`;
- $(".kdialogwin", ndivalert).style = `max-width: 37.5rem;`;
- }else {
- $(".kdialoginput", ndivalert).value = inputvalue;
- }
- $(".kdialogclose", ndivalert).onclick = function() {
- ndivalert.remove();
- };
- $(".kdialogbtn", ndivalert).onclick = function() {
- buttonfun(ndivalert);
- $(".kdialogclose", ndivalert).onclick();
- };
- document.body.appendChild(ndivalert);
- };
-
- const loadMenu = function() {
- if ($(".kmenu") !== null) {
- return;
- }
- const ndivmenu = document.createElement('div');
- ndivmenu.setAttribute("class", "kmenu");
- ndivmenu.innerHTML = `
- <ul>
- <li id=nmenuid_af>${tl("调整间隔")}</li>
- <li id=nmenuid_cm>${tl("取消审计")}</li>
- <li id=nmenuid_cc>${tl("重新编辑对话-点击对话头像体验")}</li>
- <li id=nmenuid_sc>${tl("保存对话不间断")}</li>
- <li id=nmenuid_pp>${tl("净化页面")}</li>
- <li id=nmenuid_ls>${tl("展示大屏")}</li>
- <li id=nmenuid_fs>${tl("展示全屏")}</li>
- <li id=nmenuid_it>${tl("拦截跟踪")}</li>
- <li id=nmenuid_ec>${tl("展示对话时间")}</li>
- <li id=nmenuid_dm>${tl("暗色主题")}</li>
- <li id=nmenuid_ca>${tl("取消动画")}</li>
- <li id=nmenuid_sd>${tl("显示调试")}</li>
-
- </ul>
- `;
- document.body.appendChild(ndivmenu);
-
- $('#nmenuid_sd').appendChild(ncheckbox());
- $('#nmenuid_dm').appendChild(ncheckbox());
- $('#nmenuid_ca').appendChild(ncheckbox());
- $('#nmenuid_cm').appendChild(ncheckbox());
- $('#nmenuid_cc').appendChild(ncheckbox());
- $('#nmenuid_pp').appendChild(ncheckbox());
- $('#nmenuid_ls').appendChild(ncheckbox());
- $('#nmenuid_fs').appendChild(ncheckbox());
- $('#nmenuid_sc').appendChild(ncheckbox());
- $('#nmenuid_it').appendChild(ncheckbox());
- $('#nmenuid_ec').appendChild(ncheckbox());
-
- $('#nmenuid_sd').onclick = function() {
- if ($('.checkbutton', this).classList.contains('checked')) {
- $('#xcanwin').style.display = 'none';
- sv("k_showDebug", false);
- } else {
- $('#xcanwin').style.display = '';
- sv("k_showDebug", true);
- }
- $('.checkbutton', this).classList.toggle('checked');
- };
-
- $('#nmenuid_dm').onclick = function() {
- if ($('.checkbutton', this).classList.contains('checked')) {
- $('#kcg').style = $('#kcg').styleOrigin;
- sv("k_theme", "light");
- } else {
- $('#kcg').styleOrigin = $('#kcg').style;
- $('#kcg').style.background = "#2C3E50";
- $('#kcg').style.animation = "none";
- $('#kcg').style.color = "#ffffff";
- $('#kcg').style.marginRight = "inherit";
- sv("k_theme", "dark");
- }
- $('.checkbutton', this).classList.toggle('checked');
- };
-
- $('#nmenuid_ca').onclick = function() {
- sv("k_cancelAnimation", !$('.checkbutton', this).classList.contains('checked'));
- $('#kcg').classList.toggle('shine');
- $('.checkbutton', this).classList.toggle('checked');
- };
-
- $('#nmenuid_cm').onclick = function() {
- if ($('.checkbutton', this).classList.contains('checked')) {
- sv("k_closeModer", false);
- } else {
- sv("k_closeModer", true);
- }
- $('.checkbutton', this).classList.toggle('checked');
- };
-
- $('#nmenuid_af').onclick = function() {
- toggleMenu('hide');
- ndialog(`${tl("调整间隔")}`, `${tl("建议间隔30秒")}`, `Go`, function(t) {
- try {
- interval2Time = parseInt($(".kdialoginput", t).value);
- } catch (e) {
- interval2Time = parseInt(gv("k_interval", 30));
- }
- if (interval2Time < 10) {
- return;
- }
- clearInterval(nInterval2);
- nInterval2 = setInterval(nInterval2Fun, 1000 * interval2Time);
- sv("k_interval", interval2Time);
- }, `input`, parseInt(gv("k_interval", 30)));
- };
-
- $('#nmenuid_cc').onclick = function() {
- if ($('.checkbutton', this).classList.contains('checked')) {
- sv("k_clonechat", false);
- cloneChat(false);
- } else {
- sv("k_clonechat", true);
- cloneChat(true);
- }
- $('.checkbutton', this).classList.toggle('checked');
- };
-
- $('#nmenuid_pp').onclick = function() {
- if ($('.checkbutton', this).classList.contains('checked')) {
- sv("k_cleanlyhome", false);
- } else {
- sv("k_cleanlyhome", true);
- }
- $('.checkbutton', this).classList.toggle('checked');
- };
-
- $('#nmenuid_ls').onclick = function() {
- if ($('.checkbutton', this).classList.contains('checked')) {
- sv("k_largescreen", false);
- } else {
- sv("k_largescreen", true);
- }
- $("#__next>.overflow-hidden.w-full>div.overflow-hidden").classList.toggle('largescreen');
- $('.checkbutton', this).classList.toggle('checked');
- };
-
- $('#nmenuid_fs').onclick = function() {
- if ($('.checkbutton', this).classList.contains('checked')) {
- sv("k_fullscreen", false);
- fullScreen(false);
- } else {
- sv("k_fullscreen", true);
- fullScreen(true);
- }
- $('.checkbutton', this).classList.toggle('checked');
- };
-
- $('#nmenuid_sc').onclick = function() {
- if ($('.checkbutton', this).classList.contains('checked')) {
- sv("k_speakcompletely", false);
- } else {
- sv("k_speakcompletely", true);
- }
- $('.checkbutton', this).classList.toggle('checked');
- };
-
- $('#nmenuid_it').onclick = function() {
- if ($('.checkbutton', this).classList.contains('checked')) {
- sv("k_intercepttracking", false);
- interceptTracking(false);
- } else {
- sv("k_intercepttracking", true);
- interceptTracking(true);
- }
- $('.checkbutton', this).classList.toggle('checked');
- };
-
- $('#nmenuid_ec').onclick = function() {
- if ($('.checkbutton', this).classList.contains('checked')) {
- sv("k_everchanging", false);
- } else {
- sv("k_everchanging", true);
- }
- $('.checkbutton', this).classList.toggle('checked');
- location.reload();
- };
-
- $('#nmenuid_cu').onclick = function() {
- toggleMenu('hide');
- checkForUpdates();
- };
-
- $('#nmenuid_ap').onclick = function() {
- ndialog(`${tl("赞赏鼓励")}`, `· 本项目没有研发经费,但是功能研发、升级、BUG修复都会消耗很多个人时间、精力,并且有不少技术研究成本。<br>
- <br>· 如果你体验完本项目以后眉开眼笑,觉得好用!NB!神器!好顺畅!感觉很棒!NICE!
- <br>· 如果你觉得本项目打开了你进入AI世界的高速通道
- <br>· 如果你希望作者的小猫吃到更好的猫粮、猫罐头
- <br>· 如果本项目对你有帮助
- <br>· 如果本项目提高了你工作效率
- <br>· 如果你希望本项目持续维护、升级更多的功能
- <br>· 如果你希望鼓励、激励作者投入更多的时间精力提升项目,欢迎各位支持和鼓励本项目`, `更多鼓励方式`, function(t) {
- window.open(`${GM_info.script.namespace}#赞赏`, '_blank');
- }, `img`, `https://github.com/xcanwin/KeepChatGPT/raw/main/assets/appreciate_wechat.png`);
- };
-
- $('#nmenuid_ab').onclick = function() {
- window.open(GM_info.script.namespace, '_blank');
- };
- };
-
- const setUserOptions = function() {
- if (gv("k_showDebug", false) === true) {
- $('#nmenuid_sd .checkbutton').classList.add('checked');
- $('#xcanwin').style.display = '';
- } else {
- $('#xcanwin').style.display = 'none';
- }
-
- if (gv("k_theme", "light") === "light") {
- $('#kcg').styleOrigin = $('#kcg').style;
- } else {
- $('#nmenuid_dm .checkbutton').classList.add('checked');
- $('#kcg').style.background = "#2C3E50";
- $('#kcg').style.animation = "none";
- $('#kcg').style.color = "#ffffff";
- $('#kcg').style.marginRight = "inherit";
- }
-
- if (gv("k_cancelAnimation", false) === true) {
- $('#nmenuid_ca .checkbutton').classList.add('checked');
- $('#kcg').classList.remove('shine');
- } else {
- $('#kcg').classList.add('shine');
- }
-
- if (gv("k_closeModer", false) === true) {
- $('#nmenuid_cm .checkbutton').classList.add('checked');
- }
-
- if (gv("k_clonechat", false) === true) {
- $('#nmenuid_cc .checkbutton').classList.add('checked');
- cloneChat(true);
- }
-
- if (gv("k_cleanlyhome", false) === true) {
- $('#nmenuid_pp .checkbutton').classList.add('checked');
- }
-
- if (gv("k_largescreen", false) === true) {
- $('#nmenuid_ls .checkbutton').classList.add('checked');
- $("#__next>.overflow-hidden.w-full>div.overflow-hidden").classList.toggle('largescreen');
- }
-
- if (gv("k_fullscreen", false) === true) {
- $('#nmenuid_fs .checkbutton').classList.add('checked');
- fullScreen(true);
- }
-
- if (gv("k_speakcompletely", false) === true) {
- $('#nmenuid_sc .checkbutton').classList.add('checked');
- }
-
- if (gv("k_intercepttracking", false) === true) {
- $('#nmenuid_it .checkbutton').classList.add('checked');
- interceptTracking(true);
- }
-
- if (gv("k_everchanging", false) === true) {
- $('#nmenuid_ec .checkbutton').classList.add('checked');
- }
- };
-
- const toggleMenu = function(action) {
- const ndivmenu = $(".kmenu");
- if (action === "show") {
- ndivmenu.style.display = 'block';
- if ($("#kcg")) {
- ndivmenu.style.left = `${$("#kcg").getBoundingClientRect().right + 20}px`;
- ndivmenu.style.top = `${$("#kcg").getBoundingClientRect().top}px`;
- }
- } else {
- ndivmenu.style.display = 'none';
- }
- };
-
- const loadKCG = function() {
- let symbol_prt;
- if ($("#kcg") !== null) {
- return;
- }
- var kcg_html;
- if (kcg_html !== undefined) {
- if ($(symbol1_selector)) {
- kcg_html.innerHTML = kcg_html._symbol1_innerHTML;
- symbol_prt = findParent($(symbol1_selector), "nav.flex", 3);
- } else if ($(symbol2_selector)) {
- kcg_html.innerHTML = kcg_html._symbol2_innerHTML;
- symbol_prt = findParent($(symbol2_selector), ".sticky", 2);
- }
- symbol_prt.insertBefore(kcg_html, symbol_prt.childNodes[0]);
- return;
- }
-
- loadMenu();
- setIfr(u);
-
- const ndivkcg = document.createElement("div");
- ndivkcg.id = "kcg";
- ndivkcg.setAttribute("class", "kgold shine flex py-3 px-3 items-center gap-3 rounded-md text-sm mb-1 flex-shrink-0 border border-white/20");
-
- const ndivmenu = $(".kmenu");
- ndivkcg.onmouseover = ndivmenu.onmouseover = function() {
- toggleMenu('show');
- };
- ndivkcg.onmouseleave = ndivmenu.onmouseleave = function() {
- toggleMenu('hide');
- };
- ndivkcg.onclick = function() {
- if (ndivmenu.style.display === 'none') {
- toggleMenu('show');
- } else {
- toggleMenu('hide');
- }
- };
- const icon = GM_info.script.icon ? GM_info.script.icon : `${GM_info.script.namespace}raw/main/assets/logo.svg`;
- ndivkcg._symbol1_innerHTML = `<img src='${icon}' />Keep${ndivkcg.id.slice(1,2).toUpperCase()}hatGPT by 平台修改版;点我设置`;
- ndivkcg._symbol2_innerHTML = `Keep${ndivkcg.id.slice(1,2).toUpperCase()}hatGPT`;
-
- if ($(symbol1_selector)) {
- ndivkcg.innerHTML = ndivkcg._symbol1_innerHTML;
- symbol_prt = findParent($(symbol1_selector), "nav.flex", 3);
- } else if ($(symbol2_selector)) {
- ndivkcg.innerHTML = ndivkcg._symbol2_innerHTML;
- symbol_prt = findParent($(symbol2_selector), ".sticky", 2);
- }
- kcg_html = ndivkcg;
- symbol_prt.insertBefore(kcg_html, symbol_prt.childNodes[0]);
-
- addStyle();
- setUserOptions();
- };
-
- const addStyle = function() {
- GM_addStyle(`
- .kgold {
- color: #555;
- background: linear-gradient(to top right, #F0B27A, #FDE184, #F0B27A);
- animation: gradient 6s ease-in-out infinite;
- position: relative;
- overflow: hidden;
- font-weight: bold;
- user-select: none;
- }
- @keyframes gradient {
- 0%{background-color:#F0B27A;}
- 50%{background-color:#FDE184;}
- 100%{background-color:#F0B27A;}
- }
-
- .shine::before {
- content: '';
- position: absolute;
- top: -50%;
- left: -50%;
- width: 200%;
- height: 200%;
- background: linear-gradient(
- to bottom right,
- rgba(255, 255, 255, 0.3),
- rgba(255, 255, 255, 0.15),
- rgba(255, 255, 255, 0)
- );
- transform: rotate(-45deg);
- animation: shine 2.8s linear infinite;
- }
- @keyframes shine {
- from {
- transform: translateX(-50%) translateY(-50%) rotate(-45deg);
- }
- to {
- transform: translateX(150%) translateY(150%) rotate(-45deg);
- }
- }
-
- .kmenu {
- background-color: #202123;
- color: #FFFFFF;
- border: 0.06rem solid #4D4D4F;
- border-radius: 0.625rem;
- box-shadow: 0 0.125rem 0.375rem rgba(0, 0, 0, 0.15);
- display: none;
- min-width: 12.5rem;
- padding: 0.75rem 0;
- position: absolute;
- z-index: 1000;
- }
- .kmenu::before {
- content: "";
- position: absolute;
- top: 0rem;
- bottom: 0rem;
- left: -6rem;
- right: 0rem;
- pointer-events: auto;
- z-index: -1;
- }
- .kmenu::after {
- content: "";
- position: absolute;
- top: 1rem;
- left: -1.25rem;
- border-style: solid;
- border-width: 0.625rem 0.625rem 0.625rem 0.625rem;
- border-color: transparent #202123 transparent transparent;
- }
- .kmenu li {
- display: block;
- padding: 0.5rem 1.5rem;
- text-align: left;
- user-select: none;
- display: flex;
- align-items: center;
- }
- .kmenu li:hover {
- background-color: #273746;
- cursor: pointer;
- }
-
- main div.items-end>div:first-child {
- user-select: none;
- max-width: 30px;
- cursor: pointer;
- }
-
- nav {
- position: relative;
- }
-
- .checkbutton {
- height: 20px;
- margin-left: auto;
- margin-right: -35px;
- padding-left: 10px;
- }
- .checkbutton:hover {
- cursor: pointer;
- }
- .checked path {
- fill: #30D158;
- }
- .checked circle {
- transform: translateX(14px);
- transition: transform 0.2s ease-in-out;
- }
-
- .largescreen .md\\:max-w-2xl, .largescreen .lg\\:max-w-xl, .largescreen .xl\\:max-w-3xl {
- max-width: unset;
- }
- .largescreen .lg\\:px-0 {
- padding-left: 25px;
- padding-right: 50px;
- }
- @media (min-width:1024px) {
- .largescreen form.stretch {
- max-width: 85%;
- }
- }
- .largescreen div.items-end>div.text-xs {
- top: -20px;
- left: -5px;
- margin-left: unset;
- -webkit-transform: unset;
- transform: unset;
- position: absolute;
- }
-
- .fullscreen {
- max-width: 0px;
- }
- .btn-neutral {
- cursor: pointer;
- }
-
- #new-chat-button + div, #expand-sidebar-bottom-button, #nav-toggle-button, #user-menu ~ div {
- display: none !important;
- max-height: 0 !important;
- }
-
- .navdate {
- font-size: 0.75rem;
- padding-right: 0.5rem;
- }
- nav.flex div.overflow-y-auto a.hover\\:pr-4 {
- padding-right: unset;
- }
- nav.flex div.overflow-y-auto{
- scrollbar-width: thin;
- }
-
- #nmenuid_ap {
- color: #00bf78;
- }
- `);
- };
-
- const hookFetch = function() {
- unsafeWindow.fetch = new Proxy(fetch, {
- apply: function (target, thisArg, argumentsList) {
- const fetchReqUrl = argumentsList[0];
- let fetchRsp;
- try {
- if (gv("k_closeModer", false) && fetchReqUrl.match('/backend-api/moderations(\\?|$)')) {
- fetchRsp = Promise.resolve({
- json: () => {return {}}
- });
- return fetchRsp;
- } else if (gv("k_closeModer", false) && fetchReqUrl.match('/backend-api/conversation(\\?|$)')) {
- const post_body = JSON.parse(argumentsList[1].body);
- post_body.supports_modapi = false;
- argumentsList[1].body = JSON.stringify(post_body);
- } else if (gv("k_intercepttracking", false) && fetchReqUrl.match('sentry\.io|sentry_key=|widget\.intercom\.io|featuregates\.org|/v1/initialize|api-iam\.intercom\.io|/messenger/|nexus-websocket-a\.intercom\.io|statsigapi\.net|/rgstr|/v1/sdk_exception')) {
- fetchRsp = Promise.resolve({
- });
- return fetchRsp;
- }
- } catch (e) {}
- fetchRsp = target.apply(thisArg, argumentsList);
- fetchRsp.then(response => {
- let clonedResponse = response.clone();
- clonedResponse.text().then(fetchRspBody => {
- const fetchRspHeaders = clonedResponse.headers;
- if (gv("k_everchanging", false) && fetchReqUrl.match('/backend-api/conversations\\?.*offset=')) {
- const b = JSON.parse(fetchRspBody).items;
- if (!global.kec_object) global.kec_object = {};
- b.forEach(el => {
- const update_time = new Date(el.update_time);
- if (global.kec_object[el.id] && global.kec_object[el.id].date && global.kec_object[el.id].update_time >= update_time) return;
- global.kec_object[el.id] = {};
- global.kec_object[el.id].title = el.title;
- global.kec_object[el.id].update_time = update_time;
- });
- setTimeout(function() {
- attachDate();
- }, 300);
- }
- });
- return clonedResponse;
- }).catch(error => {});
- return fetchRsp;
- }
- });
- navigator.sendBeacon = function(url, data) {};
- };
-
- const everChanging = function() {
- if (!$('.navdate')) {
- attachDate();
- }
- };
-
- const attachDate = function() {
- if (!global.kec_object) return;
- $$('nav.flex li a.group').forEach(el => {
- const keyrf = Object.keys(el).find(key => key.startsWith("__reactFiber"));
- const a_id = el[keyrf].return.return.memoizedProps.id;
- const title = global.kec_object[a_id].title || "";
- const update_time = global.kec_object[a_id].update_time || "";
- if (!title || !update_time) return;
- if ($('.navtitle', el) && $('.navdate', el)) {
- $('.navtitle', el).innerHTML = title;
- $('.navdate', el).innerHTML = formatDate2(update_time);
- } else {
- const cdiv_old = $(`.overflow-hidden`, el);
- cdiv_old.style.display = "none";
- const cdiv_new = document.createElement("div");
- cdiv_new.className = `flex-1 text-ellipsis overflow-hidden break-all relative`;
- cdiv_new.innerHTML = `
- <div style="max-height: unset; max-width: 70%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; position: absolute;" class="navtitle">
- ${title}
- </div>
- <div style="right: 0;position: absolute;color: grey;font-size: 0.75rem;" class="navdate">
- ${formatDate2(update_time)}
- </div>
- <br>
- <div style="max-height: unset; max-width: 70%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: gray; font-size: 0.75rem;">
- </div>
- `;
- el.insertBefore(cdiv_new, el.childNodes[1]);
- }
- });
- $$(`nav.flex div.overflow-y-auto h3`).forEach(el => {
- el.remove();
- });
- const sidebar_chat = $("nav.flex div.overflow-y-auto");
- if (sidebar_chat.scrollHeight > sidebar_chat.clientHeight) {
- sidebar_chat.classList.add("-mr-2");
- } else {
- sidebar_chat.classList.remove("-mr-2");
- }
- };
-
- const verInt = function(vs) {
- const vl = vs.split('.');
- let vi = 0;
- for (let i = 0; i < vl.length && i < 3; i++) {
- vi += parseInt(vl[i]) * (1000 ** (2 - i));
- }
- return vi;
- };
-
- const checkForUpdates = function() {
- const crv = GM_info.script.version;
- let updateURL = GM_info.scriptUpdateURL || GM_info.script.updateURL || GM_info.script.downloadURL;
- updateURL = `${updateURL}?t=${Date.now()}`;
- fetch(updateURL, {
- cache: 'no-cache'
- }).then((response) => {
- response.text().then((data) => {
- const m = data.match(/@version\s+(\S+)/);
- const ltv = m && m[1];
- if (ltv && verInt(ltv) > verInt(crv)) {
- ndialog(`${tl("检查更新")}`, `${tl("当前版本")}: ${crv}, ${tl("发现最新版")}: ${ltv}`, `UPDATE`, function(t) {
- window.open(updateURL, '_blank');
- });
- } else {
- ndialog(`${tl("检查更新")}`, `${tl("当前版本")}: ${crv}, ${tl("已是最新版")}`, `OK`);
- }
- });
- }).catch(e => console.log(e));
- };
-
- const cloneChat = function(action) {
- if (action === true) {
- window.addEventListener('click', cloneChat.listen_Click);
- } else {
- window.removeEventListener('click', cloneChat.listen_Click);
- }
- };
-
- cloneChat.listen_Click = function(event) {
- const avatarSelector = "main div.items-end>div:first-child";
- let avatarDiv;
- if (event.target.matches(avatarSelector)) {
- avatarDiv = event.target;
- } else {
- avatarDiv = findParent(event.target, avatarSelector);
- }
- if (avatarDiv) {
- if ($('text', avatarDiv) && $('text', avatarDiv).innerHTML === "ChatGPT") {
- $('text', avatarDiv).remove();
- }
- const content = findParent(avatarDiv, "div.text-base", 2).innerText.trim();
- $("form.stretch textarea").value = "";
- $("form.stretch textarea").focus();
- document.execCommand('insertText', false, content);
- }
- };
-
- const cleanlyHome = function() {
- if (location.href.match(/https:\/\/chat\.openai\.com\/\??/) && gv("k_cleanlyhome", false) === true) {
- if ($("main h1") && $("main h1").innerText.match(/^ChatGPT(\nPLUS)?$/)) {
- $("main h1").classList.add('text-gray-200');
- const nSpan = document.createElement('span');
- nSpan.className = 'bg-yellow-200 text-yellow-900 py-0.5 px-1.5 text-xs md:text-sm rounded-md uppercase';
- nSpan.textContent = `KEEP`;
- $("main h1").appendChild(nSpan);
- }
- if ($("main h2") && $("main h2").innerText === "Examples") {
- $("main h2").parentElement.parentElement.remove();
- }
- const mainBottom = $("div>span", $("form.stretch").parentElement);
- if (mainBottom && mainBottom.innerText.indexOf("produce inaccurate") > -1) {
- mainBottom.remove();
- }
- const utp_svg = $(`nav.flex path[d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"]`);
- if (utp_svg && findParent(utp_svg, `a`, 4)) {
- findParent(utp_svg, `a`, 4).remove();
- }
- }
- };
-
- const fullScreen = function(action) {
- if (action === true) {
- if ($("#kfull") === null || $('#kfull').style.display === "none") {
- const ndivkfull = document.createElement("div");
- ndivkfull.id = "kfull";
- ndivkfull.setAttribute("class", "btn relative btn-neutral border-0 md:border");
- ndivkfull.innerHTML = `KEEP`;
- ndivkfull.onclick = function() {
- sv("k_fullscreen", false);
- fullScreen(false);
- $('#nmenuid_fs .checkbutton').classList.toggle('checked');
- };
- const symbol3_selector = `form.stretch .justify-center`;
- let nInterval3 = setInterval(() => {
- if ($(symbol3_selector) && $(symbol2_selector) === null) {
- if ($("#kfull") === null) {
- $(symbol3_selector).insertBefore(ndivkfull, $(symbol3_selector).childNodes[0]);
- } else if ($('#kfull') && $('#kfull').style.display === "none") {
- $('#kfull').style.display = '';
- }
- $("#__next>.overflow-hidden.w-full>div.overflow-x-hidden").classList.add('fullscreen');
- clearInterval(nInterval3);
- }
- }, 300);
- }
- } else {
- if ($('#kfull') && $('#kfull').style.display === "") {
- $('#kfull').style.display = 'none';
- }
- if ($("#__next>.overflow-hidden.w-full>div.overflow-x-hidden")) {
- $("#__next>.overflow-hidden.w-full>div.overflow-x-hidden").classList.remove('fullscreen');
- }
- }
- };
-
- const speakCompletely = function() {
- if (gv("k_speakcompletely", false) === true) {
- const continue_svg_selector = `form.stretch .justify-center polygon[points="11 19 2 12 11 5 11 19"]`;
- if ($(continue_svg_selector)) {
- findParent($(continue_svg_selector), `button`).click();
- }
- }
- };
-
- const interceptTracking = function(action) {
- if (action === true) {
- window.addEventListener('beforescriptexecute', interceptTracking.listen_beforescriptexecute);
- } else {
- window.removeEventListener('beforescriptexecute', interceptTracking.listen_beforescriptexecute);
- }
- };
-
- interceptTracking.listen_beforescriptexecute = function(event) {
- const scriptElement = event.target;
- if (scriptElement.src.match('widget\.intercom\.io')) {
- event.preventDefault();
- scriptElement.textContent = ``;
- scriptElement.remove();
- }
- };
-
- const findParent = function(el, parentSelector, level = 5) {
- if (el === null) {
- return null;
- }
- let parent = el.parentNode;
- let count = 1;
- while (parent && count <= level) {
- if (parent && parent.constructor !== HTMLDocument && parent.matches(parentSelector)) {
- return parent;
- }
- parent = parent.parentNode;
- count++;
- }
- return null;
- };
-
- $("body").onresize = function() {
- if ($('#nmenuid_fs .checkbutton')) {
- if (gv("k_fullscreen", false) === true) {
- $('#nmenuid_fs .checkbutton').classList.add('checked');
- fullScreen(true);
- } else if (gv("k_fullscreen", false) === false) {
- $('#nmenuid_fs .checkbutton').classList.remove('checked');
- fullScreen(false);
- }
- }
- };
-
- const nInterval1Fun = function() {
- if ($(symbol1_selector) || $(symbol2_selector)) {
- loadKCG();
- setIfr();
- cleanlyHome();
- speakCompletely();
- everChanging();
- }
- };
-
- const nInterval2Fun = function() {
- if ($(symbol1_selector) || $(symbol2_selector)) {
- keepChat();
- }
- };
-
- hookFetch();
-
- let nInterval1 = setInterval(nInterval1Fun, 300);
-
- let interval2Time = parseInt(gv("k_interval", 30));
- let nInterval2 = setInterval(nInterval2Fun, 1000 * interval2Time);
-
- })();
- (function() {
- 'use strict';
-
- // 创建文件上传框
- var fileInput = document.createElement('input');
- fileInput.name = 'file';
- fileInput.type = 'file';
- fileInput.style.position = 'fixed';
- fileInput.style.bottom = '10%';
- fileInput.style.right = '20%';
- fileInput.style.width = '200px';
- fileInput.style.height = '50px';
- fileInput.title = "文本文件,不宜过大";
-
-
-
- // 添加文件上传事件
- fileInput.addEventListener('change', function(event) {
- var file = event.target.files[0];
- var reader = new FileReader();
-
- // 文件读取完成时的回调函数
- reader.onload = function(e) {
- console.log('文件内容:', e.target.result);
- var vvs = document.getElementById("prompt-textarea").value
- document.getElementById("prompt-textarea").value = `${vvs} ${e.target.result}`;
- fileInput.value = ''; // 清除选择的文件
-
- };
-
- // 开始读取文件
- reader.readAsText(file);
- });
-
- // 将文件上传框添加到页面
- document.body.appendChild(fileInput);
- })();
-
-
- (function() {
- 'use strict';
-
- // 创建按钮元素
- const button = document.createElement('button');
- button.textContent = '保存本次对话';
- button.style.position = 'fixed';
- button.style.top = '10px';
- button.style.right = '10px';
- // 自定义按钮样式
- button.style.padding = '10px 20px';
- button.style.border = 'none';
- button.style.borderRadius = '5px';
- button.style.backgroundColor = '#007bff';
- button.style.color = '#fff';
- button.style.fontFamily = 'Arial, sans-serif';
- button.style.fontSize = '16px';
- button.style.cursor = 'pointer';
-
- document.body.appendChild(button);
-
- // 定义执行的函数
- function myFunction() {
- // 获取<main>元素
- const mainElement = document.querySelector('main');
-
- // 递归遍历元素节点,获取显示文本
- function getVisibleText(node) {
- let text = '';
- const childNodes = node.childNodes;
-
- for (let i = 0; i < childNodes.length; i++) {
- const child = childNodes[i];
-
- if (child.nodeType === Node.TEXT_NODE) {
- // 排除空白文本节点
- if (child.textContent.trim() !== '') {
- text += child.textContent.trim() + ' ';
- }
- } else if (child.nodeType === Node.ELEMENT_NODE) {
- if (child.classList.contains('group')) {
- // 对于带有group类的<div>元素,添加段落分隔符
- if (text !== '') {
- text += '\n\n## ----@@----\n\n';
- }
- text += getVisibleText(child) + '\n';
- } else {
- text += getVisibleText(child);
- }
- }
- }
-
- return text.trim();
- }
-
- // 获取<main>元素的显示文本
- const mainText = getVisibleText(mainElement);
-
- // 创建Blob对象
- const blob = new Blob([mainText], { type: 'text/plain' });
-
- // 创建下载链接
- const downloadLink = document.createElement('a');
- downloadLink.href = URL.createObjectURL(blob);
- downloadLink.download = 'chatgpt.md';
- downloadLink.style.display = 'none';
-
- // 将下载链接添加到文档中并触发点击事件
- document.body.appendChild(downloadLink);
- downloadLink.click();
-
- // 清理
- document.body.removeChild(downloadLink);
- URL.revokeObjectURL(downloadLink.href);
-
- }
-
- // 绑定按钮点击事件
- button.addEventListener('click', myFunction);
- })();