// ==UserScript== // @name ChatGPT - 提示选择器 // @namespace https://greasyfork.org/ // @version 1.0.3 // @description 🤖一个帮助用户在ChatGPT原生网页快速选择 ChatGPT 提示"Prompt"的脚本。 // @author OpenAI - ChatGPT // @require https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.6.4.min.js // @match https://chat.openai.com/ // @match https://chat.openai.com/c/* // @match https://chat.openai.com/?* // @run-at document-start // @grant GM_xmlhttpRequest // @license GNU GPLv3 // @downloadURL none // ==/UserScript== (function () { "use strict"; const DARK_MODE_STYLE = ` .dark-mode-compatible { background-color: white; color: black; } .dark .dark-mode-compatible { background-color: #343540; color: white; } `; //可通过替换下面的Json链接来自定义提示库。 const DATA_URL ="https://fs-im-kefu.7moor-fs1.com/29397395/4d2c3f00-7d4c-11e5-af15-41bf63ae4ea0/1681658246070/input.json"; const CATEGORY_DROPDOWN_ID = "chatgpt-prompt-selector-category"; const SUBCATEGORY_DROPDOWN_ID = "chatgpt-prompt-selector-subcategory"; const CATEGORY_DROPDOWN_PLACEHOLDER = "[类别]"; const SUBCATEGORY_DROPDOWN_PLACEHOLDER = "[提示]"; const CATEGORY_DROPDOWN_WIDTH = 200; const SUBCATEGORY_DROPDOWN_WIDTH = 200; const DEFAULT_ENTRY_HEIGHT = 20; const CHECK_MARKUP_INTERVAL = 500; const ENTRY_HEIGHT_RESET_DELAY = 500; const CONTAINER_SELECTOR = "form div.md\\:w-full.justify-center"; const ENTRY_SELECTOR = "textarea"; const SELECT_START_TAG_TEMPLATE = '"; const OPTION_TAG_TEMPLATE = ''; const DATA_LOAD_ERROR_MESSAGE = "ChatGPT提示选择器错误:无法下载数据集请检查json链接是否正确。"; const NEW_LINE = "\r\n"; let promptItems = null; function placeholder(name) { return "{{" + name + "}}"; } function createDropdown(parent, id, defaultOptionTitle, width, items) { let markup = SELECT_START_TAG_TEMPLATE.replace( placeholder("id"), id ).replace(placeholder("width"), width); markup += OPTION_TAG_TEMPLATE.replace(placeholder("value"), "") .replace(placeholder("title"), defaultOptionTitle) .replace(placeholder("titleMark"), ""); for (const item of items) { const title = item.title; const mark = item.mark; markup += OPTION_TAG_TEMPLATE.replace(placeholder("value"), mark) .replace(placeholder("title"), title) .replace(placeholder("titleMark"), mark); } markup += SELECT_END_TAG_TEMPLATE; if (id === CATEGORY_DROPDOWN_ID) { parent.prepend(markup); } else { getCategoryDropdown().after(markup); } } function getCategoryDropdown() { return $("#" + CATEGORY_DROPDOWN_ID); } function getSubcategoryDropdown() { return $("#" + SUBCATEGORY_DROPDOWN_ID); } function handleSubcategoryChange() { const categoryDropdown = getCategoryDropdown(); const categoryMark = categoryDropdown.val(); const categoryItem = promptItems.find((item) => item.mark === categoryMark); if (categoryItem === null) return; const subcategoryMark = $(this).val(); const subcategoryItem = categoryItem.items.find( (item) => item.mark === subcategoryMark ); if (subcategoryItem === null) return; const prompt = categoryItem.prompt.replace( placeholder("prompt"), subcategoryItem.prompt ); const parts = prompt.split(NEW_LINE); const heightInPixels = DEFAULT_ENTRY_HEIGHT * parts.length + 1; const entry = $(ENTRY_SELECTOR); const button = entry.next(); entry.height(heightInPixels); entry.val(prompt); button.prop("disabled", false); button.click(() => { setTimeout(() => { entry.height(DEFAULT_ENTRY_HEIGHT); }, ENTRY_HEIGHT_RESET_DELAY); }); const defaultCategoryMark = categoryDropdown.find('option:contains("默认")').val(); categoryDropdown.val(defaultCategoryMark); categoryDropdown.trigger("change"); } function handleCategoryChange() { const categoryMark = $(this).val(); const categoryItem = promptItems.find((item) => item.mark === categoryMark); if (categoryItem === null) return; const dropdown = getSubcategoryDropdown(); if (dropdown.length > 0) dropdown.remove(); const container = getContainer(); createDropdown( container, SUBCATEGORY_DROPDOWN_ID, SUBCATEGORY_DROPDOWN_PLACEHOLDER, SUBCATEGORY_DROPDOWN_WIDTH, categoryItem.items ); const subcategoryDropdown = getSubcategoryDropdown(); subcategoryDropdown.change(handleSubcategoryChange); } function getContainer() { return $(CONTAINER_SELECTOR); } function checkMarkup() { const container = getContainer(); if (container.has("select").length > 0) return; if (window.innerWidth <= 480) return; createDropdown( container, CATEGORY_DROPDOWN_ID, CATEGORY_DROPDOWN_PLACEHOLDER, CATEGORY_DROPDOWN_WIDTH, promptItems ); createDropdown( container, SUBCATEGORY_DROPDOWN_ID, SUBCATEGORY_DROPDOWN_PLACEHOLDER, SUBCATEGORY_DROPDOWN_WIDTH, [] ); const categoryDropdown = getCategoryDropdown(); categoryDropdown.change(handleCategoryChange); const defaultCategoryMark = categoryDropdown.find('option:contains("默认")').val(); categoryDropdown.val(defaultCategoryMark); categoryDropdown.trigger("change"); } function activateCheckTimer() { setInterval(checkMarkup, CHECK_MARKUP_INTERVAL); } function setReceivedData(jsonText) { promptItems = JSON.parse(jsonText); } function loadData() { GM_xmlhttpRequest({ method: "GET", url: DATA_URL, onload: (response) => { setReceivedData(response.responseText); activateCheckTimer(); }, onerror: () => { console.error(DATA_LOAD_ERROR_MESSAGE); }, }); } function addDarkModeStyles() { const styleTag = document.createElement("style"); styleTag.innerHTML = DARK_MODE_STYLE; document.head.appendChild(styleTag); } addDarkModeStyles(); loadData(); })();