您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Bypasses page errors like 'conversation not found' + popup tools + model switcher + resume support after reloads
// ==UserScript== // @name ChatGPT Assistant // @namespace http://tampermonkey.net/ // @version v1.1 // @description Bypasses page errors like 'conversation not found' + popup tools + model switcher + resume support after reloads // @author dylojestem // @license This script may be freely shared, but modification is not allowed. All rights reserved by dylojestem. // @match https://chatgpt.com/* // @icon https://static.vecteezy.com/system/resources/previews/021/608/790/non_2x/chatgpt-logo-chat-gpt-icon-on-black-background-free-vector.jpg // @grant none // ==/UserScript== (function () { const style = document.createElement('style'); style.textContent = ` #chatgpt-menu { position: fixed; top: 0; right: -240px; width: 240px; height: 100%; background-color: #111; color: white; z-index: 10000; padding: 20px 10px; box-shadow: -2px 0 6px rgba(0,0,0,0.3); transition: right 0.3s ease; font-family: sans-serif; overflow-y: auto; } #chatgpt-menu.open { right: 0; } #chatgpt-toggle { position: fixed; bottom: 30px; right: 30px; z-index: 10001; background-color: #000; color: white; border: none; border-radius: 50%; width: 42px; height: 42px; font-size: 20px; cursor: pointer; box-shadow: 0 2px 6px rgba(0,0,0,0.3); } #chatgpt-menu button { width: 100%; margin: 6px 0; padding: 8px; font-size: 14px; border: none; border-radius: 6px; background-color: #222; color: white; cursor: pointer; transition: background-color 0.2s; } #chatgpt-menu button:hover { background-color: #333; } #chatgpt-menu .section-title { margin: 10px 0 5px; font-size: 12px; color: #aaa; text-transform: uppercase; } #chatgpt-menu .model-card { background-color: #1a1a1a; border-radius: 8px; padding: 10px; margin-bottom: 8px; box-shadow: 0 1px 3px rgba(0,0,0,0.4); } #chatgpt-menu .model-title { font-weight: bold; color: #fff; margin-bottom: 4px; } #chatgpt-menu .model-desc { font-size: 12px; color: #ccc; } #chatgpt-menu .note { font-size: 11px; color: #999; margin-top: 10px; padding: 6px; border-top: 1px solid #333; } #chatgpt-header { text-align: center; font-size: 18px; font-weight: bold; margin-bottom: 2px; user-select: none; } #chatgpt-subheader { text-align: center; font-size: 11px; color: #888; margin-bottom: 12px; user-select: none; } #contact { text-decoration: none; color: #888; transition: color 0.2s ease; } #contact:hover { color: #aaa; } `; document.head.appendChild(style); // === ELEMENTY === const menu = document.createElement('div'); menu.id = 'chatgpt-menu'; const toggleBtn = document.createElement('button'); toggleBtn.id = 'chatgpt-toggle'; toggleBtn.textContent = '☰'; let popupWindow = null; let intervalId = null; let isRunning = false; let currentModel = '4o'; const mainButton = document.createElement('button'); mainButton.textContent = 'Open/Resume ChatGPT'; const models = ['4o', 'o3', 'o4-mini', 'o4-mini-high', '4.1', '4.1-mini']; const modelMap = { '4o': 'gpt-4o', 'o3': 'o3', 'o4-mini': 'o4-mini', 'o4-mini-high': 'o4-mini-high', '4.1': 'gpt-4-1', '4.1-mini': 'gpt-4-1-mini' }; const modelDescriptions = { '4o': 'Wspaniałe rozwiązanie do większości zadań', 'o3': 'Używa zaawansowanego rozumowania', 'o4-mini': 'Najszybszy w zaawansowanym rozumowaniu', 'o4-mini-high': 'Świetny w kodowaniu i rozumowaniu wizualnym', '4.1': 'Świetny do szybkiego kodowania i analiz', '4.1-mini': 'Szybszy przy realizacji codziennych zadań' }; // === HEADER === const header = document.createElement('div'); header.id = 'chatgpt-header'; header.textContent = 'ChatGPT Assistant'; const subheader = document.createElement('div'); subheader.id = 'chatgpt-subheader'; subheader.innerHTML = 'Created by <a id="contact" href="https://dylojestem.com/contact" target="_blank">dylojestem</a>'; menu.appendChild(header); menu.appendChild(subheader); const popupSectionTitle = document.createElement('div'); popupSectionTitle.className = 'section-title'; popupSectionTitle.textContent = 'Assistant'; menu.appendChild(popupSectionTitle); menu.appendChild(mainButton); const popupWarning = document.createElement('div'); popupWarning.className = 'note'; popupWarning.textContent = "Do not close the popup window – it must stay open for refreshing to work."; menu.appendChild(popupWarning); const sectionTitle = document.createElement('div'); sectionTitle.className = 'section-title'; sectionTitle.textContent = 'Models'; menu.appendChild(sectionTitle); models.forEach(model => { const btn = document.createElement('button'); btn.textContent = model; btn.addEventListener('click', () => { const urlModel = modelMap[model] || model; const baseUrl = window.location.origin + window.location.pathname; window.location.href = `${baseUrl}?model=${encodeURIComponent(urlModel)}`; }); menu.appendChild(btn); }); const note = document.createElement('div'); note.className = 'note'; note.textContent = "Note: After switching the model, you must click the 'Open/Resume ChatGPT' button again."; menu.appendChild(note); const descTitle = document.createElement('div'); descTitle.className = 'section-title'; descTitle.textContent = 'Model Descriptions'; menu.appendChild(descTitle); models.forEach(model => { const card = document.createElement('div'); card.className = 'model-card'; const title = document.createElement('div'); title.className = 'model-title'; title.textContent = model; const desc = document.createElement('div'); desc.className = 'model-desc'; desc.textContent = modelDescriptions[model] || 'Brak opisu'; card.appendChild(title); card.appendChild(desc); menu.appendChild(card); }); document.body.appendChild(toggleBtn); document.body.appendChild(menu); // === LOGIKA === toggleBtn.addEventListener('click', () => { menu.classList.toggle('open'); }); mainButton.addEventListener('click', () => { const urlModel = modelMap[currentModel] || currentModel; if (!isRunning) { const popupWidth = 400; const popupHeight = 300; const left = Math.floor((window.innerWidth - popupWidth) / 2 + window.screenX); const top = Math.floor((window.innerHeight - popupHeight) / 2 + window.screenY); popupWindow = window.open( `https://chatgpt.com/?model=${urlModel}`, 'chatgpt_popup', `width=${popupWidth},height=${popupHeight},left=${left},top=${top},resizable=no,scrollbars=yes,toolbar=no,menubar=no,status=no` ); intervalId = setInterval(() => { if (popupWindow && !popupWindow.closed) { popupWindow.location.reload(); } else { clearInterval(intervalId); intervalId = null; isRunning = false; mainButton.textContent = 'Open/Resume ChatGPT'; } }, 5000); isRunning = true; mainButton.textContent = 'STOP'; } else { if (popupWindow && !popupWindow.closed) popupWindow.close(); clearInterval(intervalId); intervalId = null; popupWindow = null; isRunning = false; mainButton.textContent = 'Open/Resume ChatGPT'; } }); })();