您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Queue messages when ChatGPT is still composing responses
当前为
// ==UserScript== // @name ChatGPT Message Queue // @match https://chat.openai.com/* // @match https://chatgpt.com/* // @description Queue messages when ChatGPT is still composing responses // @version 0.0.1.20250318094810 // @namespace https://gf.zukizuki.org/users/1435046 // ==/UserScript== (function() { 'use strict'; let messageQueue = []; let queueIndicator = null; let isProcessing = false; function createQueueIndicator() { if (queueIndicator) return; queueIndicator = document.createElement('div'); queueIndicator.style.position = 'absolute'; queueIndicator.style.bottom = '60px'; queueIndicator.style.right = '20px'; queueIndicator.style.backgroundColor = '#343541'; queueIndicator.style.color = 'white'; queueIndicator.style.padding = '8px 12px'; queueIndicator.style.borderRadius = '8px'; queueIndicator.style.fontSize = '14px'; queueIndicator.style.fontWeight = 'bold'; queueIndicator.style.zIndex = '1000'; queueIndicator.style.display = 'none'; queueIndicator.textContent = 'Queued: 0'; document.body.appendChild(queueIndicator); } function updateQueueDisplay() { if (!queueIndicator) createQueueIndicator(); if (messageQueue.length > 0) { queueIndicator.textContent = `Queued: ${messageQueue.length}`; queueIndicator.style.display = 'block'; } else { queueIndicator.style.display = 'none'; } } function isComposing() { return !!document.querySelector('[data-testid="stop-button"]'); } // Main observer to watch for ChatGPT's state changes const stateObserver = new MutationObserver(() => { // If not composing and we have messages, process the next one if (!isComposing() && messageQueue.length > 0 && !isProcessing) { processNextMessage(); } }); function processNextMessage() { if (messageQueue.length === 0 || isComposing()) return; isProcessing = true; const message = messageQueue.shift(); updateQueueDisplay(); const textarea = document.getElementById('prompt-textarea'); if (!textarea) { isProcessing = false; return; } // Set the message in the textarea textarea.value = message; // Trigger input event to ensure ChatGPT recognizes the value const inputEvent = new Event('input', { bubbles: true }); textarea.dispatchEvent(inputEvent); // Click the send button setTimeout(() => { const sendButton = document.querySelector('[data-testid="send-button"]'); if (sendButton) { sendButton.click(); } isProcessing = false; }, 10); } // Setup observer to initialize the textarea listener const setupObserver = new MutationObserver(() => { const textarea = document.getElementById('prompt-textarea'); if (textarea && !textarea.dataset.queueEnabled) { textarea.dataset.queueEnabled = 'true'; createQueueIndicator(); textarea.addEventListener('keydown', (e) => { // Check if Enter pressed without modifiers if (e.key === 'Enter' && !e.shiftKey && !e.ctrlKey && !e.altKey && !e.metaKey) { // Only queue if ChatGPT is composing if (isComposing()) { e.preventDefault(); e.stopPropagation(); // Add message to queue if (textarea.value.trim()) { messageQueue.push(textarea.value); textarea.value = ''; updateQueueDisplay(); } } } }); // Start observing state changes once we've set up the textarea stateObserver.observe(document.body, { childList: true, subtree: true }); } }); // Start the setup observer setupObserver.observe(document.body, { childList: true, subtree: true }); })();