Minimal ChatGPT Message Logger + Injector + Submitter

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

2025-05-21 يوللانغان نەشرى. ئەڭ يېڭى نەشرىنى كۆرۈش.

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

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

(function () {
  'use strict';

  window.addEventListener('message', function (event) {

    // Handle search button clicks
    if (event.data && event.data.type === 'searchButtonClicked') {
      const searchBtn1 = document.querySelector('[data-testid="composer-button-search"]');

      const searchButton2 = document.getElementById('system-hint-button');

      if (searchBtn1) searchBtn1.click();
      return;

      if (searchButton2) {
        const button = document.getElementById('system-hint-button');
        button.focus(); // Sometimes needed to simulate a real user
        button.dispatchEvent(new PointerEvent('pointerdown', { bubbles: true }));

        document.querySelector("#radix-«R4pbcp4mafacth95j5H1» > div > div:nth-of-type(2)").click()

      };
      return;
    }

    if (event.data && event.data.type === 'reasonButtonClicked') {
      const reasonBtn = document.querySelector('[data-testid="composer-button-reason"]');
      if (reasonBtn) reasonBtn.click();
      return;
    }

    if (event.data && event.data.type === 'newChatButtonClicked') {
      // Click the "New chat" anchor link
      const newChatLink = document.querySelector('a[aria-label="New chat"][href="/"]');
      if (newChatLink) newChatLink.click();
      return;
    }

    if (event.data.type !== 'prompt') return;

    // Locate ProseMirror composer
    const composer = document.querySelector('.ProseMirror');
    if (!composer) return;

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

    // Focus and inject the text
    composer.focus();

    const lines = event.data.content.split('\n');
    const html = lines
      .map(line => `<p>${line
        .replace(/&/g, '&amp;')
        .replace(/</g, '&lt;')
        .replace(/>/g, '&gt;')}</p>`)
      .join('');
    composer.innerHTML = html;

    composer.dispatchEvent(new InputEvent('input', { bubbles: true }));

    // Observe DOM changes until the send button is enabled
    const observer = new MutationObserver(function (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']
    });
  });
})();