// ==UserScript== // @name AI 网页总结助手 Pro // @namespace https://github.com/cyx0118/ai_summary_helper-pro // @version 2.2.0 // @description 一键总结网页,侧栏显示,快捷输出,多语言,Q&A问答,导出,深色浅色模式 // @author 超级小忍者 // @match *://*/* // @grant GM_setValue // @grant GM_getValue // @grant GM_registerMenuCommand // @grant GM_addStyle // @grant GM_xmlhttpRequest // @connect api.openai.com // @connect api.deepseek.com // @connect * // @license MIT // @downloadURL https://update.greasyfork.icu/scripts/576238/AI%20%E7%BD%91%E9%A1%B5%E6%80%BB%E7%BB%93%E5%8A%A9%E6%89%8B%20Pro.user.js // @updateURL https://update.greasyfork.icu/scripts/576238/AI%20%E7%BD%91%E9%A1%B5%E6%80%BB%E7%BB%93%E5%8A%A9%E6%89%8B%20Pro.meta.js // ==/UserScript== (function () { 'use strict'; const DEFAULT_CONFIG = { shortcutKey: 'q', useCtrl: true, useShift: false, useAlt: false, apiKey: '', apiEndpoint: 'https://api.deepseek.com/v1/chat/completions', modelName: 'deepseek-chat', maxContentLength: 8000, summaryLanguage: 'zh-CN', summaryLength: 'medium', summaryTone: 'neutral', sidebarWidth: 440, enableStreaming: true, theme: 'system', systemPrompt: '你是一个网页内容分析助手。直接输出总结内容,不要添加任何客套话、问候语或引言。直接用 Markdown 格式输出结构化总结。', }; const LANG_OPTIONS = [ { value: 'zh-CN', label: '中文' }, { value: 'en', label: 'English' }, { value: 'ja', label: '日本語' }, { value: 'ko', label: '한국어' }, { value: 'fr', label: 'Français' }, { value: 'de', label: 'Deutsch' }, { value: 'es', label: 'Español' }, { value: 'ru', label: 'Русский' }, { value: 'auto', label: '与原文相同' }, ]; const LENGTH_OPTIONS = [ { value: 'brief', label: '简洁', tokens: 300 }, { value: 'medium', label: '中等', tokens: 800 }, { value: 'detailed', label: '详细', tokens: 2000 }, ]; const TONE_OPTIONS = [ { value: 'neutral', label: '中性客观' }, { value: 'professional', label: '专业严谨' }, { value: 'casual', label: '轻松通俗' }, { value: 'academic', label: '学术风格' }, { value: 'child', label: '小学生能懂' }, { value: 'humorous', label: '幽默风格' }, { value: 'bullet', label: '要点列举' }, ]; function getConfig() { const s = GM_getValue('ai_summary_config', null); if (!s) return { ...DEFAULT_CONFIG }; try { return { ...DEFAULT_CONFIG, ...JSON.parse(s) }; } catch { return { ...DEFAULT_CONFIG }; } } function saveConfig(c) { GM_setValue('ai_summary_config', JSON.stringify(c)); } function getLangLabel(c) { const f = LANG_OPTIONS.find(l => l.value === c); return f ? f.label : c; } function getLengthInfo(v) { return LENGTH_OPTIONS.find(l => l.value === v) || LENGTH_OPTIONS[1]; } function getToneLabel(v) { const f = TONE_OPTIONS.find(t => t.value === v); return f ? f.label : '中性客观'; } // ===================== 主题管理 ===================== function getEffectiveTheme() { const cfg = getConfig(); if (cfg.theme === 'system') { return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'; } return cfg.theme; } function applyTheme() { const t = getEffectiveTheme(); document.documentElement.setAttribute('ai-theme', t); } // 监听系统主题变化 window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => { if (getConfig().theme === 'system') applyTheme(); }); // ===================== 样式 ===================== GM_addStyle(` /* ===== 主题变量 ===== */ :root, [ai-theme="light"] { --ai-bg: rgba(255,255,255,.72); --ai-bg-solid: #fff; --ai-bg-card: rgba(248,249,250,.85); --ai-bg-input: rgba(255,255,255,.9); --ai-bg-header: rgba(250,251,252,.6); --ai-bg-hover: rgba(241,243,244,.9); --ai-bg-btn: rgba(241,243,244,.8); --ai-border: rgba(232,234,237,.8); --ai-border-light: rgba(255,255,255,.5); --ai-border-card: rgba(255,255,255,.4); --ai-border-input: rgba(218,220,224,.8); --ai-text: #202124; --ai-text-heading: #1a1a2e; --ai-text-secondary: #5f6368; --ai-text-muted: #80868b; --ai-text-label: #3c4043; --ai-overlay: rgba(0,0,0,.3); --ai-shadow: 0 20px 60px rgba(0,0,0,.25); --ai-shadow-sidebar: -4px 0 24px rgba(0,0,0,.15); --ai-error-bg: rgba(252,232,230,.9); --ai-error-border: rgba(245,198,203,.8); --ai-error-text: #c62828; --ai-privacy-bg: rgba(255,248,225,.8); --ai-privacy-border: rgba(255,224,130,.5); --ai-toast-bg: rgba(50,50,50,.9); --ai-chat-user-bg: rgba(102,126,234,.12); --ai-chat-user-border: rgba(102,126,234,.2); --ai-chat-ai-bg: rgba(248,249,250,.85); --ai-chat-ai-border: rgba(255,255,255,.4); --ai-scroll-thumb: rgba(0,0,0,.15); --ai-scroll-track: transparent; } [ai-theme="dark"] { --ai-bg: rgba(30,30,35,.82); --ai-bg-solid: #1e1e23; --ai-bg-card: rgba(40,42,50,.85); --ai-bg-input: rgba(45,47,55,.9); --ai-bg-header: rgba(35,37,45,.7); --ai-bg-hover: rgba(55,57,68,.9); --ai-bg-btn: rgba(50,52,62,.8); --ai-border: rgba(60,62,72,.8); --ai-border-light: rgba(50,52,60,.5); --ai-border-card: rgba(60,62,72,.6); --ai-border-input: rgba(70,72,82,.8); --ai-text: #e0e0e0; --ai-text-heading: #f0f0f0; --ai-text-secondary: #aaa; --ai-text-muted: #888; --ai-text-label: #ccc; --ai-overlay: rgba(0,0,0,.55); --ai-shadow: 0 20px 60px rgba(0,0,0,.5); --ai-shadow-sidebar: -4px 0 24px rgba(0,0,0,.4); --ai-error-bg: rgba(60,30,30,.85); --ai-error-border: rgba(100,50,50,.6); --ai-error-text: #ff8a80; --ai-privacy-bg: rgba(50,45,30,.7); --ai-privacy-border: rgba(100,80,40,.5); --ai-toast-bg: rgba(40,40,45,.95); --ai-chat-user-bg: rgba(102,126,234,.18); --ai-chat-user-border: rgba(102,126,234,.3); --ai-chat-ai-bg: rgba(40,42,50,.85); --ai-chat-ai-border: rgba(60,62,72,.5); --ai-scroll-thumb: rgba(255,255,255,.15); --ai-scroll-track: transparent; } /* 滚动条 */ #ai-summary-sidebar ::-webkit-scrollbar { width: 6px; } #ai-summary-sidebar ::-webkit-scrollbar-thumb { background: var(--ai-scroll-thumb); border-radius: 3px; } #ai-summary-sidebar ::-webkit-scrollbar-track { background: var(--ai-scroll-track); } /* ===== 浮动按钮 ===== */ #ai-summary-settings-btn{position:fixed;bottom:20px;right:20px;width:48px;height:48px;border-radius:50%;background:linear-gradient(135deg,#667eea 0%,#764ba2 100%);color:#fff;border:none;cursor:pointer;font-size:22px;display:flex;align-items:center;justify-content:center;box-shadow:0 4px 15px rgba(102,126,234,.4);z-index:999998;transition:transform .2s,box-shadow .2s,right .35s cubic-bezier(.4,0,.2,1);user-select:none} #ai-summary-settings-btn:hover{transform:scale(1.1);box-shadow:0 6px 20px rgba(102,126,234,.6)} #ai-summary-settings-btn.sidebar-open{right:460px} /* ===== 侧栏 ===== */ #ai-summary-sidebar{position:fixed;top:0;right:0;height:100vh;z-index:999999;display:flex;flex-direction:column;background:var(--ai-bg);backdrop-filter:blur(24px) saturate(180%);-webkit-backdrop-filter:blur(24px) saturate(180%);border-left:1px solid var(--ai-border-light);box-shadow:var(--ai-shadow-sidebar);font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Arial,sans-serif;transform:translateX(100%);transition:transform .35s cubic-bezier(.4,0,.2,1);color:var(--ai-text)} #ai-summary-sidebar.open{transform:translateX(0)} #ai-summary-sidebar-resize{position:absolute;top:0;left:-4px;width:8px;height:100%;cursor:col-resize;z-index:10} #ai-summary-sidebar-resize:hover,#ai-summary-sidebar-resize.dragging{background:rgba(102,126,234,.3)} .ai-sb-header{display:flex;align-items:center;justify-content:space-between;padding:14px 20px;border-bottom:1px solid var(--ai-border);flex-shrink:0;background:var(--ai-bg-header)} .ai-sb-header h2{margin:0;font-size:16px;font-weight:600;color:var(--ai-text-heading);display:flex;align-items:center;gap:8px} .ai-sb-header-actions{display:flex;align-items:center;gap:4px} .ai-sb-btn{width:30px;height:30px;border-radius:50%;border:none;background:var(--ai-bg-btn);cursor:pointer;font-size:14px;display:flex;align-items:center;justify-content:center;transition:background .2s;color:var(--ai-text-secondary)} .ai-sb-btn:hover{background:var(--ai-bg-hover)} .ai-sb-info{padding:10px 20px;border-bottom:1px solid var(--ai-border);flex-shrink:0} .ai-sb-info .pt{font-size:13px;font-weight:600;color:var(--ai-text-label);overflow:hidden;text-overflow:ellipsis;white-space:nowrap} .ai-sb-info .pu{font-size:10px;color:var(--ai-text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-top:2px} .ai-sb-tabs{display:flex;border-bottom:1px solid var(--ai-border);flex-shrink:0} .ai-sb-tab{flex:1;padding:10px 0;text-align:center;font-size:13px;font-weight:500;color:var(--ai-text-secondary);cursor:pointer;border-bottom:2px solid transparent;transition:all .2s;background:none;border-top:none;border-left:none;border-right:none} .ai-sb-tab:hover{color:var(--ai-text-heading);background:rgba(102,126,234,.04)} .ai-sb-tab.active{color:#667eea;border-bottom-color:#667eea;font-weight:600} .ai-sb-body{padding:16px 20px;overflow-y:auto;flex:1} .ai-sb-footer{padding:10px 20px;border-top:1px solid var(--ai-border);display:flex;gap:8px;justify-content:flex-end;flex-shrink:0;background:var(--ai-bg-header)} .ai-sb-content{background:var(--ai-bg-card);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);border:1px solid var(--ai-border-card);border-radius:10px;padding:16px;font-size:14px;line-height:1.8;color:var(--ai-text);word-break:break-word} .ai-sb-content strong,.ai-sb-content b{color:var(--ai-text-heading)} .ai-sb-content h1,.ai-sb-content h2,.ai-sb-content h3{margin:14px 0 6px 0;color:var(--ai-text-heading)} .ai-sb-content h1{font-size:18px}.ai-sb-content h2{font-size:16px}.ai-sb-content h3{font-size:15px} .ai-sb-content ul,.ai-sb-content ol{margin:6px 0;padding-left:18px} .ai-sb-content li{margin:3px 0} .ai-sb-content code{background:rgba(100,100,120,.2);padding:1px 5px;border-radius:4px;font-size:13px} .ai-sb-content blockquote{border-left:3px solid #667eea;margin:8px 0;padding:4px 14px;color:var(--ai-text-secondary)} .ai-stream-cursor::after{content:'\u2588';animation:ai-blink 1s step-end infinite;color:#667eea} @keyframes ai-blink{50%{opacity:0}} .ai-sb-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:80px 20px;gap:16px} .ai-sb-spinner{width:36px;height:36px;border:3px solid var(--ai-border);border-top-color:#667eea;border-radius:50%;animation:ai-spin .8s linear infinite} @keyframes ai-spin{to{transform:rotate(360deg)}} .ai-sb-loading-text{font-size:13px;color:var(--ai-text-secondary)} .ai-sb-error{background:var(--ai-error-bg);backdrop-filter:blur(8px);border:1px solid var(--ai-error-border);border-radius:10px;padding:14px 16px;color:var(--ai-error-text);font-size:13px;line-height:1.6} .ai-btn{padding:7px 14px;border-radius:6px;border:none;font-size:12px;font-weight:600;cursor:pointer;transition:all .2s} .ai-btn-primary{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;box-shadow:0 2px 8px rgba(102,126,234,.3)} .ai-btn-primary:hover{box-shadow:0 4px 12px rgba(102,126,234,.5);transform:translateY(-1px)} .ai-btn-secondary{background:var(--ai-bg-btn);color:var(--ai-text-secondary)} .ai-btn-ghost{background:var(--ai-bg);color:var(--ai-text-secondary);border:1px solid var(--ai-border-input)} .ai-btn-ghost:hover{background:var(--ai-bg-hover)} .ai-chat-msgs{display:flex;flex-direction:column;gap:12px} .ai-chat-msg{padding:12px 14px;border-radius:10px;font-size:13px;line-height:1.7;word-break:break-word} .ai-chat-msg.user{background:var(--ai-chat-user-bg);border:1px solid var(--ai-chat-user-border);align-self:flex-end;max-width:85%;color:var(--ai-text)} .ai-chat-msg.assistant{background:var(--ai-chat-ai-bg);border:1px solid var(--ai-chat-ai-border);align-self:flex-start;max-width:95%;color:var(--ai-text)} .ai-chat-input-area{display:flex;gap:8px;padding:10px 0 0;border-top:1px solid var(--ai-border);margin-top:12px} .ai-chat-input{flex:1;padding:8px 12px;border:1px solid var(--ai-border-input);border-radius:8px;font-size:13px;outline:none;background:var(--ai-bg-input);color:var(--ai-text);font-family:inherit;resize:none;min-height:36px;max-height:100px} .ai-chat-input:focus{border-color:#667eea;box-shadow:0 0 0 2px rgba(102,126,234,.1)} .ai-chat-send{padding:8px 14px;border-radius:8px;border:none;background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;font-size:13px;cursor:pointer;font-weight:600;align-self:flex-end} /* ===== 设置面板 ===== */ .ai-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:var(--ai-overlay);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);z-index:1000000;display:flex;align-items:center;justify-content:center;animation:ai-fi .2s ease} @keyframes ai-fi{from{opacity:0}to{opacity:1}} .ai-panel{background:var(--ai-bg);backdrop-filter:blur(24px) saturate(180%);-webkit-backdrop-filter:blur(24px) saturate(180%);border:1px solid var(--ai-border-light);border-radius:16px;box-shadow:var(--ai-shadow);max-width:600px;width:92vw;max-height:88vh;display:flex;flex-direction:column;animation:ai-su .3s ease;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Arial,sans-serif;color:var(--ai-text)} @keyframes ai-su{from{transform:translateY(30px);opacity:0}to{transform:translateY(0);opacity:1}} .ai-panel-header{display:flex;align-items:center;justify-content:space-between;padding:18px 24px;border-bottom:1px solid var(--ai-border)} .ai-panel-header h2{margin:0;font-size:18px;font-weight:600;color:var(--ai-text-heading);display:flex;align-items:center;gap:8px} .ai-panel-close{width:34px;height:34px;border-radius:50%;border:none;background:var(--ai-bg-btn);cursor:pointer;font-size:18px;display:flex;align-items:center;justify-content:center;color:var(--ai-text-secondary)} .ai-panel-close:hover{background:var(--ai-bg-hover)} .ai-panel-body{padding:22px 24px;overflow-y:auto;flex:1} .ai-fg{margin-bottom:16px} .ai-fg label{display:block;font-size:13px;font-weight:600;color:var(--ai-text-label);margin-bottom:5px} .ai-fg .desc{font-size:11px;color:var(--ai-text-muted);margin-bottom:6px} .ai-fg input[type="text"],.ai-fg input[type="password"],.ai-fg select,.ai-fg textarea{width:100%;padding:9px 12px;border:1px solid var(--ai-border-input);border-radius:8px;font-size:13px;color:var(--ai-text);outline:none;transition:border-color .2s,box-shadow .2s;box-sizing:border-box;background:var(--ai-bg-input);font-family:inherit} .ai-fg input:focus,.ai-fg select:focus,.ai-fg textarea:focus{border-color:#667eea;box-shadow:0 0 0 3px rgba(102,126,234,.15)} .ai-fg textarea{resize:vertical;min-height:70px;line-height:1.5} .ai-fg .shortcut-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap} .ai-fg .mod-check{display:flex;align-items:center;gap:4px;font-size:12px;color:var(--ai-text-secondary);cursor:pointer} .ai-fg .mod-check input{width:15px;height:15px;accent-color:#667eea} .ai-fg .key-input{width:70px!important;text-align:center;text-transform:uppercase;font-weight:600;font-size:15px;letter-spacing:2px} .ai-fg .shortcut-preview{font-size:12px;color:#667eea;font-weight:500;padding:3px 8px;background:rgba(102,126,234,.12);border-radius:6px} .ai-btn-group{display:flex;gap:10px;justify-content:flex-end;padding-top:6px} .ai-divider{height:1px;background:var(--ai-border);margin:14px 0} .ai-privacy{background:var(--ai-privacy-bg);border:1px solid var(--ai-privacy-border);border-radius:8px;padding:10px 14px;font-size:11px;color:var(--ai-text-secondary);line-height:1.5;margin-bottom:14px} .ai-privacy strong{color:#e65100} .ai-toast{position:fixed;top:20px;left:50%;transform:translateX(-50%);background:var(--ai-toast-bg);backdrop-filter:blur(12px);color:#fff;padding:10px 24px;border-radius:8px;font-size:13px;z-index:1000001;animation:ai-toast-in .3s ease;box-shadow:0 4px 12px rgba(0,0,0,.3)} @keyframes ai-toast-in{from{transform:translateX(-50%) translateY(-20px);opacity:0}to{transform:translateX(-50%) translateY(0);opacity:1}} /* 主题切换按钮 */ .ai-theme-btn{font-size:16px;line-height:1} .ai-theme-btn[data-theme="light"]::after{content:'\u2600\uFE0F'} .ai-theme-btn[data-theme="dark"]::after{content:'\uD83C\uDF19'} .ai-theme-btn[data-theme="system"]::after{content:'\uD83D\uDCA1'} `); function showToast(m,d){const e=document.querySelector('.ai-toast');if(e)e.remove();const t=document.createElement('div');t.className='ai-toast';t.textContent=m;document.body.appendChild(t);setTimeout(()=>t.remove(),d||2000)} function getShortcutText(c){const p=[];if(c.useCtrl)p.push('Ctrl');if(c.useShift)p.push('Shift');if(c.useAlt)p.push('Alt');p.push(c.shortcutKey.toUpperCase());return p.join(' + ')} function esc(s){return s.replace(/&/g,'&').replace(//g,'>').replace(/"/g,'"')} function md(text){let h=text.replace(/&/g,'&').replace(//g,'>');h=h.replace(/^### (.+)$/gm,'
$1').replace(/^> (.+)$/gm,'$1');h=h.replace(/^\- (.+)$/gm,'