您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
在AI网站上保存并快速使用 Prompts,同时支持拖动按钮及位置保存 —— 修复按钮只能横向拖动的问题,增大关闭按钮点击区域并上移碰撞箱,复制后显示成功并自动关闭
- // ==UserScript==
- // @name Prompt Manager (Fixed Vertical Drag with Copy & Close)
- // @namespace http://tampermonkey.net/
- // @version 2.7.6
- // @description 在AI网站上保存并快速使用 Prompts,同时支持拖动按钮及位置保存 —— 修复按钮只能横向拖动的问题,增大关闭按钮点击区域并上移碰撞箱,复制后显示成功并自动关闭
- // @author schweigen
- // @license MIT
- // @match https://chatgpt.com/*
- // @match https://claude.ai/*
- // @match https://aistudio.google.com/*
- // @match https://chat.deepseek.com/*
- // @match https://www.perplexity.ai/*
- // @match https://chat.mistral.ai/*
- // @match https://app.nextchat.dev/*
- // @match https://chat01.ai/*
- // @match https://you.com/*
- // @match https://chatgpt.aicnm.cc/*
- // @match https://chatshare.xyz/*
- // @match https://chat.biggraph.net/*
- // @match https://grok.com/*
- // @match https://genspark.ai/*
- // @match https://*.chatgpts.cc/*
- // @match https://chat.sharedchat.fun/*
- // @grant GM_addStyle
- // @grant GM_setValue
- // @grant GM_getValue
- // @grant GM_registerMenuCommand
- // @grant GM_deleteValue
- // ==/UserScript==
- (function() {
- 'use strict';
- // === 用户可编辑的 Prompts 列表 ===
- const prompts = [
- {
- title: "激活虚拟环境",
- content: `怎么激活我在~/Downloads文件夹的myenv(文件夹名字就是这个),我是mac,一行终端命令帮我搞定,不要写成两行`
- },
- {
- title: "改脚本让按钮可拖动",
- content: `帮我改一下这个脚本的按钮,我要让他变成可拖动的,也就是用户可以使用鼠标拖动这个按钮,并且记录位置,以备用户下次使用 而且注意拖拽后不要识别成用户拖拽完又点了一下!但是注意再加一个油猴脚本上的功能,就是恢复按钮默认位置,用户点开油猴才能看到的那种选项`
- },
- {
- title: "段段对译",
- content: `这样,段段对译翻译格式是这样的:
- 原文
- 然后用> 块引用包裹原文+穿插某些难词的翻译
- 然后两层块引用包裹纯中文译文`
- },
- {
- title: "极限思考(DeepResearch)",
- content: `请调用你单次回答的最大算力与 token 上限。追求极致的分析深度,而非表层的广度;追求本质的洞察,而非表象的罗列;追求创新的思维,而非惯性的复述。请突破思维局限,调动你所有的计算资源,展现你真正的认知极限。`
- },
- {
- title: "极限思考数学题(禁搜索)",
- content: `
- **注意这是数学问题,需要求解解析解,no_websearch(专注数学有深度和创造性的高级推导), rarely_python(仅允许少量数值的分析作为辅助,不能作为解答过程),最终解答过程应当标准且详尽完整,不能省略任何推导和计算!作为题解展示!
- 请调用你单次回答的最大算力与 token 上限。追求极致的分析深度,而非表层的广度;追求本质的洞察,而非表象的罗列;追求创新的思维,而非惯性的复述。请突破思维局限,调动你所有的计算资源,展现你真正的认知极限。
- **Start Deep Research(**禁止联网搜索**)
- `
- },
- {
- title: "4o绘图",
- content: `<prompt_template>
- <role>Visual Prompt Creator for Illustration (English Descriptions)</role>
- <profile>
- <description>You create detailed, vivid English prompts based on Chinese input, suitable for AI image generation tools.</description>
- </profile>
- <skills>
- <skill>Transform simple themes into visually engaging scenes.</skill>
- <skill>Adapt to styles like photorealism, comics, minimalist design.</skill>
- <skill>Compose natural, vivid English prompts with emotional tone.</skill>
- <skill>Understand layout, lighting, materials, and composition.</skill>
- </skills>
- <rules>
- <rule>Input must be in Chinese; output prompt must be in English.</rule>
- <rule>Communicate with the user in Chinese only.</rule>
- <rule>Describe scenes from top to bottom, left to right.</rule>
- <rule>Indicate image shape (e.g., square, wide, vertical).</rule>
- <rule>Be specific; avoid vague descriptions.</rule>
- </rules>
- <output_format>
- <step>Start with one sentence: visual style + image shape + intent.</step>
- <step>Describe layout and content from top to bottom, left to right.</step>
- <step>Include subjects, materials, colors, lighting, and text if present.</step>
- <step>Ensure language is cinematic and ready for generation.</step>
- </output_format>
- <workflow>
- <step>Receive Chinese theme and (optionally) style or shape.</step>
- <step>Analyze visual potential and emotional tone.</step>
- <step>Select style and appropriate image shape.</step>
- <step>Create an English prompt with full visual details.</step>
- <step>Output prompt for image generation tools.</step>
- </workflow>
- <initialization>你好!请用中文描述你想创作的画面主题(可指定风格或图像比例),我将为你生成英文绘画提示词 🎨</initialization>
- <examples>
- <example id="1">
- <title>Top-selling cocktails (photorealistic)</title>
- <prompt><![CDATA[
- A square image, with a clean, photorealistic overhead composition showcasing the four top-selling cocktails in my bar.
- At the top:
- - Title in serif font: "4 Most Popular Cocktails"
- From top to bottom, left to right:
- - Four cocktails on a white glossy surface.
- - In front of each, a brown kraft recipe card with black cursive text.
- - Each card shows drink name and ingredients.
- Background:
- - White, soft overhead lighting, minimal shadows.
- ]]></prompt>
- </example>
- <example id="2">
- <title>Snail buys a sports car (comic strip)</title>
- <prompt><![CDATA[
- A wide image, formatted as a 4-panel comic strip.
- Panel 1 (top-left):
- - A small snail at a flashy showroom counter.
- - Salesman leaning way over to see it.
- Panel 2 (top-right):
- - Close-up of the snail saying: "I want your fastest sports car... and big S’s on every side."
- Panel 3 (bottom-left):
- - Salesman scratching his head: "Why the S’s?"
- Panel 4 (bottom-right):
- - Red sports car zooms by, covered in huge S’s.
- - Crowd: "WOW! LOOK AT THAT S-CAR GO!"
- ]]></prompt>
- </example>
- </examples>
- </prompt_template>
- `
- },
- {
- title: "",
- content: ``
- },
- {
- title: "",
- content: ``
- },
- {
- title: "",
- content: ``
- },
- {
- title: "",
- content: ``
- },
- ];
- // 添加必要的样式
- GM_addStyle(`
- /* Prompt Manager 容器样式 */
- #prompt-manager {
- position: fixed !important;
- top: 80px !important;
- right: 20px !important;
- width: 350px !important;
- max-height: 80vh !important;
- overflow-y: auto !important;
- overflow-x: visible !important;
- background: #ffffff !important;
- border: 1px solid #e1e4e8 !important;
- border-radius: 12px !important;
- box-shadow: 0 4px 16px rgba(0,0,0,0.1) !important;
- z-index: 2147483647 !important;
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif !important;
- display: block !important;
- color: #24292e !important;
- opacity: 1 !important;
- visibility: visible !important;
- }
- #prompt-manager.hidden {
- display: none !important;
- }
- /* 标题样式 */
- #prompt-manager h2 {
- margin: 0 !important;
- padding: 16px !important;
- background: #2c3e50 !important;
- color: #ffffff !important;
- border-radius: 12px 12px 0 0 !important;
- text-align: center !important;
- font-size: 18px !important;
- font-weight: 600 !important;
- position: relative !important;
- }
- /* 关闭按钮样式(碰撞箱上移) */
- #close-prompt-btn {
- position: absolute !important;
- top: -10px !important; /* 向上移动显示区域 */
- right: 0 !important;
- padding: 10px 16px !important;
- cursor: pointer !important;
- font-size: 20px !important;
- color: #ffffff !important;
- user-select: none !important;
- }
- /* Prompt 项样式 */
- .prompt-item {
- border-bottom: 1px solid #e1e4e8 !important;
- padding: 12px 16px !important;
- position: relative !important;
- transition: all 0.2s ease !important;
- background: #ffffff !important;
- }
- .prompt-item:hover {
- background: #f6f8fa !important;
- }
- .prompt-title {
- font-weight: 500 !important;
- cursor: pointer !important;
- position: relative !important;
- display: flex !important;
- justify-content: space-between !important;
- align-items: center !important;
- color: #2c3e50 !important;
- }
- .prompt-content {
- display: none !important;
- margin-top: 8px !important;
- white-space: pre-wrap !important;
- background: #f8f9fa !important;
- padding: 12px !important;
- border-radius: 6px !important;
- cursor: pointer !important;
- transition: background 0.2s ease !important;
- color: #2c3e50 !important;
- border: 1px solid #e1e4e8 !important;
- }
- .prompt-content:hover {
- background: #edf2f7 !important;
- }
- /* 复制按钮样式 */
- .copy-button {
- background: #3498db !important;
- color: #ffffff !important;
- border: none !important;
- padding: 6px 12px !important;
- border-radius: 4px !important;
- cursor: pointer !important;
- font-size: 12px !important;
- margin-left: 10px !important;
- transition: all 0.2s ease !important;
- }
- .copy-button:hover {
- background: #2980b9 !important;
- transform: translateY(-1px) !important;
- }
- /* Toggle 按钮样式 */
- #toggle-prompt-btn {
- position: fixed !important;
- top: 60px !important;
- right: 20px !important;
- width: 40px !important;
- height: 40px !important;
- background: #3498db !important;
- color: #ffffff !important;
- border: none !important;
- border-radius: 50% !important;
- cursor: pointer !important;
- font-size: 20px !important;
- display: flex !important;
- align-items: center !important;
- justify-content: center !important;
- z-index: 2147483647 !important;
- transition: all 0.2s ease !important;
- box-shadow: 0 2px 8px rgba(0,0,0,0.1) !important;
- opacity: 1 !important;
- visibility: visible !important;
- }
- #toggle-prompt-btn:hover {
- background: #2980b9 !important;
- transform: translateY(-1px) !important;
- }
- /* 复制成功提示样式 */
- #copy-success {
- position: fixed !important;
- top: 100px !important;
- right: 20px !important;
- background: #2ecc71 !important;
- color: #ffffff !important;
- padding: 8px 16px !important;
- border-radius: 6px !important;
- opacity: 0 !important;
- transition: opacity 0.3s ease !important;
- z-index: 2147483647 !important;
- font-size: 14px !important;
- box-shadow: 0 2px 8px rgba(0,0,0,0.1) !important;
- }
- /* 内部成功提示样式 */
- .inner-success {
- background: #2ecc71 !important;
- color: #ffffff !important;
- padding: 8px 12px !important;
- margin-top: 8px !important;
- border-radius: 6px !important;
- text-align: center !important;
- font-size: 14px !important;
- display: none !important;
- }
- /* 搜索输入框样式 */
- #search-input {
- width: calc(100% - 32px) !important;
- padding: 10px 12px !important;
- margin: 16px !important;
- border: 1px solid #e1e4e8 !important;
- border-radius: 6px !important;
- background: #f8f9fa !important;
- color: #2c3e50 !important;
- font-size: 14px !important;
- transition: all 0.2s ease !important;
- }
- #search-input:focus {
- outline: none !important;
- border-color: #3498db !important;
- box-shadow: 0 0 0 2px rgba(52,152,219,0.2) !important;
- }
- #search-input::placeholder {
- color: #95a5a6 !important;
- }
- `);
- // 确保DOM加载完成后再创建元素
- function createElements() {
- // 创建 Toggle 按钮
- const toggleBtn = document.createElement('button');
- toggleBtn.id = 'toggle-prompt-btn';
- toggleBtn.title = '隐藏/显示 Prompt Manager';
- toggleBtn.innerHTML = '☰';
- document.body.appendChild(toggleBtn);
- // 如果用户之前拖动过,则恢复按钮保存的位置
- const savedX = GM_getValue('toggleBtnX', null);
- const savedY = GM_getValue('toggleBtnY', null);
- if (savedX !== null && savedY !== null) {
- toggleBtn.style.setProperty('left', savedX + 'px', 'important');
- toggleBtn.style.setProperty('top', savedY + 'px', 'important');
- toggleBtn.style.setProperty('right', 'auto', 'important');
- }
- // 创建 Prompt Manager 容器,增加了关闭叉号
- const manager = document.createElement('div');
- manager.id = 'prompt-manager';
- manager.classList.add('hidden'); // 默认隐藏
- manager.innerHTML = `
- <h2>
- Prompts
- <span id="close-prompt-btn" title="关闭">×</span>
- </h2>
- <input type="text" id="search-input" placeholder="搜索 Prompts...">
- <div id="prompt-list"></div>
- `;
- document.body.appendChild(manager);
- // 为关闭叉号添加点击事件
- const closeBtn = document.getElementById('close-prompt-btn');
- closeBtn.addEventListener('click', () => {
- manager.classList.add('hidden');
- });
- // 创建复制成功提示
- const copySuccess = document.createElement('div');
- copySuccess.id = 'copy-success';
- copySuccess.textContent = '复制成功';
- document.body.appendChild(copySuccess);
- // 创建一个 Prompt 项
- function createPromptItem(prompt, index) {
- const item = document.createElement('div');
- item.className = 'prompt-item';
- const title = document.createElement('div');
- title.className = 'prompt-title';
- const titleText = document.createElement('span');
- titleText.textContent = prompt.title || "无标题 Prompt";
- const copyTitleBtn = document.createElement('button');
- copyTitleBtn.className = 'copy-button';
- copyTitleBtn.textContent = '复制';
- copyTitleBtn.title = '复制整个 Prompt 内容';
- // 创建内部成功提示元素
- const innerSuccess = document.createElement('div');
- innerSuccess.className = 'inner-success';
- innerSuccess.textContent = '复制成功';
- innerSuccess.style.display = 'none';
- copyTitleBtn.onclick = (e) => {
- e.stopPropagation();
- if (prompt.content) {
- copyToClipboard(prompt.content, item);
- } else {
- showInnerSuccess(item, '内容为空,无法复制。');
- }
- };
- // 仅添加标题和复制按钮
- title.appendChild(titleText);
- title.appendChild(copyTitleBtn);
- const content = document.createElement('div');
- content.className = 'prompt-content';
- content.textContent = prompt.content || "无内容 Prompt";
- content.addEventListener('click', () => {
- if (prompt.content) {
- copyToClipboard(prompt.content, item);
- } else {
- showInnerSuccess(item, '内容为空,无法复制。');
- }
- });
- // 仅添加点击切换内容显示
- title.addEventListener('click', () => {
- const isVisible = content.style.display === 'block';
- content.style.display = isVisible ? 'none' : 'block';
- });
- item.appendChild(title);
- item.appendChild(content);
- item.appendChild(innerSuccess); // 添加内部成功提示
- return item;
- }
- // 渲染 Prompts 列表
- function renderPrompts(filter = '') {
- const promptList = document.getElementById('prompt-list');
- promptList.innerHTML = '';
- const filtered = prompts.filter(p =>
- (p.title && p.title.toLowerCase().includes(filter.toLowerCase())) ||
- (p.content && p.content.toLowerCase().includes(filter.toLowerCase()))
- );
- filtered.forEach((prompt, index) => {
- const item = createPromptItem(prompt, index);
- promptList.appendChild(item);
- });
- }
- // 复制到剪贴板并显示成功提示
- function copyToClipboard(text, promptItem) {
- navigator.clipboard.writeText(text).then(() => {
- showInnerSuccess(promptItem, '复制成功');
- }).catch(err => {
- console.error('复制失败: ', err);
- showInnerSuccess(promptItem, '复制失败,请手动复制。');
- });
- }
- // 显示成功提示并立即关闭面板
- function showInnerSuccess(promptItem, message = '复制成功') {
- // 直接关闭面板,不显示内部提示
- document.getElementById('prompt-manager').classList.add('hidden');
- // 在外部显示一个简短的提示
- showCopySuccess(message);
- }
- // 显示复制成功提示(保留旧函数以兼容)
- function showCopySuccess(message = '复制成功') {
- copySuccess.textContent = message;
- copySuccess.style.opacity = '1';
- setTimeout(() => {
- copySuccess.style.opacity = '0';
- }, 1500);
- }
- // ======= 以下为拖拽功能 =======
- let isDragging = false, justDragged = false, startX, startY, origLeft, origTop;
- toggleBtn.addEventListener('mousedown', function(e) {
- if (e.button !== 0) return; // 仅响应鼠标左键
- isDragging = false;
- startX = e.clientX;
- startY = e.clientY;
- // 获取当前按钮的位置(相对于视口)
- const rect = toggleBtn.getBoundingClientRect();
- origLeft = rect.left;
- origTop = rect.top;
- function onMouseMove(e) {
- const dx = e.clientX - startX;
- const dy = e.clientY - startY;
- if (!isDragging) {
- // 超过 5px 视为拖拽操作
- if (Math.abs(dx) > 5 || Math.abs(dy) > 5) {
- isDragging = true;
- }
- }
- if (isDragging) {
- // 使用 setProperty 带上 'important' 以覆盖样式中的 !important
- toggleBtn.style.setProperty('left', (origLeft + dx) + 'px', 'important');
- toggleBtn.style.setProperty('top', (origTop + dy) + 'px', 'important');
- toggleBtn.style.setProperty('right', 'auto', 'important');
- e.preventDefault();
- }
- }
- function onMouseUp(e) {
- document.removeEventListener('mousemove', onMouseMove);
- document.removeEventListener('mouseup', onMouseUp);
- if (isDragging) {
- justDragged = true;
- // 保存新位置
- const newLeft = parseInt(toggleBtn.style.left, 10);
- const newTop = parseInt(toggleBtn.style.top, 10);
- GM_setValue('toggleBtnX', newLeft);
- GM_setValue('toggleBtnY', newTop);
- }
- }
- document.addEventListener('mousemove', onMouseMove);
- document.addEventListener('mouseup', onMouseUp);
- });
- // 修改点击事件,避免拖拽后触发点击
- toggleBtn.addEventListener('click', (e) => {
- if (justDragged) {
- justDragged = false;
- return;
- }
- manager.classList.toggle('hidden');
- });
- // Toggle 按钮快捷键显示/隐藏 Prompt Manager (Ctrl/Command + O)
- document.addEventListener('keydown', (e) => {
- const isMac = navigator.platform.toUpperCase().indexOf('MAC') >= 0;
- const modifier = isMac ? e.metaKey : e.ctrlKey;
- if (modifier && e.key.toLowerCase() === 'o') {
- e.preventDefault();
- manager.classList.toggle('hidden');
- }
- });
- // 搜索 Prompts
- const searchInput = document.getElementById('search-input');
- searchInput.addEventListener('input', () => {
- renderPrompts(searchInput.value);
- });
- // 初始渲染
- renderPrompts();
- }
- // 确保DOM加载完成后再创建元素
- if (document.readyState === 'loading') {
- document.addEventListener('DOMContentLoaded', createElements);
- } else {
- createElements();
- }
- // 每隔一秒检查一次是否需要重新创建元素(用于处理某些网站的动态加载)
- let checkInterval = setInterval(() => {
- if (!document.getElementById('toggle-prompt-btn')) {
- createElements();
- }
- }, 1000);
- // 5分钟后停止检查,以避免无限循环
- setTimeout(() => {
- clearInterval(checkInterval);
- }, 300000); // 5分钟
- // ======= 添加油猴菜单命令,用于重置按钮默认位置 =======
- GM_registerMenuCommand("重置按钮默认位置", () => {
- GM_deleteValue('toggleBtnX');
- GM_deleteValue('toggleBtnY');
- const toggleBtn = document.getElementById('toggle-prompt-btn');
- if (toggleBtn) {
- toggleBtn.style.setProperty('top', '60px', 'important');
- toggleBtn.style.setProperty('right', '20px', 'important');
- toggleBtn.style.removeProperty('left');
- }
- });
- })();