Minimal ChatGPT Message Logger + Injector + Submitter

Listen for postMessage from parent, log to console, enter it into the chat input (preserving newlines), and submit

当前为 2025-05-13 提交的版本,查看 最新版本

// ==UserScript==
// @name         Minimal ChatGPT Message Logger + Injector + Submitter
// @description  Listen for postMessage from parent, log to console, enter it into the chat input (preserving newlines), and submit
// @match        https://chatgpt.com/*
// @version 0.0.1.20250513083706
// @namespace https://greasyfork.org/users/1435046
// ==/UserScript==

(function () {
    'use strict';

    window.addEventListener('message', function (event) {
        // 1) search-button clicks
        if (event.data && event.data.type === 'searchButtonClicked') {
            const searchBtn = document.querySelector('[data-testid="composer-button-search"]');
            if (searchBtn) searchBtn.click();
            return;
        }

        // 2) only strings from postMessage
        if (typeof event.data !== 'string') return;

        // 3) find the ProseMirror editor
        const composer = document.querySelector('.ProseMirror');
        if (!composer) return;

        console.log('Injecting message:', event.data);

        // 4) build HTML paragraphs for each line
        const lines = event.data.split('\n');
        const html = lines
            .map(line => `<p>${line
                .replace(/&/g, '&amp;')
                .replace(/</g, '&lt;')
                .replace(/>/g, '&gt;')}</p>`)
            .join('');

        // 5) inject and notify ProseMirror
        composer.focus();
        composer.innerHTML = html;
        composer.dispatchEvent(new InputEvent('input', { bubbles: true }));

        // 6) wait for the send button to enable, then click it
        const observer = new MutationObserver((mutations, obs) => {
            const sendBtn = document.querySelector('[data-testid="send-button"]');
            if (sendBtn && !sendBtn.disabled) {
                obs.disconnect();
                console.log('Submitting message');
                sendBtn.click();
            }
        });
        observer.observe(document, {
            childList: true,
            subtree: true,
            attributes: true,
            attributeFilter: ['disabled']
        });
    });
})();