// ==UserScript== // @name Gemini 对话提取器 (分类版) // @namespace http://tampermonkey.net/ // @version 1.3.1 // @description 支持分类导出用户、Gemini 或全部对话内容 // @author jjw // @license mit // @match https://gemini.google.com/* // @icon https://www.google.com/s2/favicons?sz=64&domain=google.com // @grant GM_registerMenuCommand // @grant GM_setClipboard // ==/UserScript== (function() { 'use strict'; // --- 核心提取逻辑 --- async function exportChat(mode) { // mode: 'user' | 'model' | 'both' const selectors = [ 'user-query', 'model-response', '.query-text', '.markdown', '[class*="message-content"]' ]; let rawElements = Array.from(document.querySelectorAll(selectors.join(','))); // 过滤嵌套,只保留叶子节点 let filteredElements = rawElements.filter(el => { return !rawElements.some(other => el !== other && el.contains(other)); }); let chatHistory = `=== Gemini 对话导出 (${mode}) ===\n导出时间: ${new Date().toLocaleString()}\n\n`; let lastText = ""; let count = 0; filteredElements.forEach((el) => { let text = el.innerText || el.textContent; text = text.trim(); if (!text || text === lastText) return; const isUser = el.closest('user-query') || el.className.includes('query') || el.closest('[class*="user"]'); // --- 分类过滤逻辑 --- if (mode === 'user' && !isUser) return; if (mode === 'model' && isUser) return; const role = isUser ? "🙎‍♂️ User:" : "✨ Gemini:"; chatHistory += `${role}\n${text}\n\n------------------------\n\n`; lastText = text; count++; }); if (count === 0) { // alert("❌ 未找到匹配的对话内容,请确保页面已加载完毕。"); console.log("❌ 未找到匹配的对话内容,请确保页面已加载完毕。"); return; } // 使用油猴自带的剪贴板 API GM_setClipboard(chatHistory); alert(`✅ 成功提取 ${count} 条记录!内容已复制到剪贴板。`); } // --- 注册油猴菜单 --- GM_registerMenuCommand("📥 导出全部对话", () => exportChat('both')); GM_registerMenuCommand("👤 只导出我的问题", () => exportChat('user')); GM_registerMenuCommand("🤖 只导出 Gemini 的回答", () => exportChat('model')); })();