您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Listen for postMessage from parent, log to console, enter it into the chat input, and submit
当前为
- // ==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.20250526031102
- // @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();
- console.log
- return;
- }
- if (searchButton2) {
- searchButton2.focus(); // Sometimes needed to simulate a real user
- searchButton2.dispatchEvent(new PointerEvent('pointerdown', { bubbles: true }));
- for (const div of document.querySelectorAll('[id^="radix-"] > div > div')) {
- if (div.textContent.trim() === 'Search the web') {
- div.click();
- break;
- }
- }
- };
- return;
- }
- if (event.data && event.data.type === 'reasonButtonClicked') {
- const reasonBtn1 = document.querySelector('[data-testid="composer-button-reason"]');
- const reasonButton2 = document.getElementById('system-hint-button');
- if (reasonBtn1) reasonBtn1.click();
- if (reasonButton2) {
- reasonButton2.focus(); // Sometimes needed to simulate a real user
- reasonButton2.dispatchEvent(new PointerEvent('pointerdown', { bubbles: true }));
- document.querySelector('[id^="radix-"] > div > div:nth-of-type(5)').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, '&')
- .replace(/</g, '<')
- .replace(/>/g, '>')}</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']
- });
- });
- })();