您需要先安装一个扩展,例如 篡改猴、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.20250318094033
- // @namespace https://greasyfork.org/users/1435046
- // ==/UserScript==
- (function() {
- 'use strict';
- let messageQueue = [];
- let queueIndicator = null;
- 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 processQueue() {
- if (messageQueue.length === 0) return;
- const textarea = document.getElementById('prompt-textarea');
- if (!textarea) return;
- // Wait until ChatGPT is not composing
- if (document.querySelector('[data-testid="stop-button"]')) return;
- const message = messageQueue.shift();
- 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
- const sendButton = document.querySelector('[data-testid="send-button"]');
- if (sendButton) {
- sendButton.click();
- }
- updateQueueDisplay();
- }
- // Set up a mutation observer to detect when the textarea is added to the DOM
- 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) {
- // Check if ChatGPT is composing (stop button exists)
- if (document.querySelector('[data-testid="stop-button"]')) {
- e.preventDefault();
- e.stopPropagation();
- // Add message to queue
- messageQueue.push(textarea.value);
- textarea.value = '';
- updateQueueDisplay();
- }
- }
- });
- }
- });
- // Observer to detect when ChatGPT finishes composing
- const composingObserver = new MutationObserver(() => {
- // Process queue when ChatGPT is not composing
- if (!document.querySelector('[data-testid="stop-button"]')) {
- processQueue();
- }
- });
- // Start observing
- setupObserver.observe(document.body, { childList: true, subtree: true });
- composingObserver.observe(document.body, { childList: true, subtree: true });
- })();