// ==UserScript== // @name 图片快捷下载与查看工具 // @namespace https://scriptcat.org/ // @version 1.2 // @description 按住快捷键并点击图片即可下载或查看原图,智能识别B站等网站的原图链接 // @icon data:image/png;base64,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 // @author Developer // @match *://*/* // @grant GM_download // @grant GM_registerMenuCommand // @grant GM_setValue // @grant GM_getValue // @grant GM_addStyle // @grant GM_notification // @grant GM_xmlhttpRequest // @grant GM_setClipboard // @connect * // ==/UserScript== (function() { 'use strict'; // 配置 let config = { hotkey: 'Alt', showPreview: true, defaultAction: 'download', showHint: true, downloadMethod: 'auto', // auto, blob, direct, clipboard // 原图识别规则 originalImageRules: { 'bilibili.com': [ { pattern: /(.+\.(jpg|jpeg|png|gif|webp))@[^?]+(?:\?.*)?$/i, replacement: '$1' }, { pattern: /(.+\.(jpg|jpeg|png|gif|webp))[?].*$/i, replacement: '$1' } ], 'weibo.com': [ { pattern: /\/thumbnail$/, replacement: '' }, { pattern: /\/small$/, replacement: '/large' } ], 'zhihu.com': [ { pattern: /_([sm]|xs|md|lg)$/, replacement: '' } ], // 通用规则 'default': [ { pattern: /(.+\.(jpg|jpeg|png|gif|webp))@[^?]+(?:\?.*)?$/i, replacement: '$1' }, { pattern: /(.+\.(jpg|jpeg|png|gif|webp))[?].*$/i, replacement: '$1' }, { pattern: /[?&](width|height|size|format|quality)=\d+/g, replacement: '' }, { pattern: /[?&]thumb(nail)?=/g, replacement: '' } ] } }; // 状态变量 let isHotkeyPressed = false; let currentSelectedImg = null; // 添加CSS样式 GM_addStyle(` :root { --primary-color: #4299e1; --success-color: #48bb78; --neutral-color: #718096; --dark-bg: #2d3748; --darker-bg: #1a202c; --header-bg: #4a5568; --text-light: #ffffff; --text-muted: #a0aec0; --border-radius: 8px; --shadow: 0 10px 25px rgba(0, 0, 0, 0.5); --transition: all 0.3s ease; } .img-selector-overlay { position: fixed !important; top: 0 !important; left: 0 !important; width: 100% !important; height: 100% !important; background: rgba(0, 0, 0, 0.5) !important; display: flex !important; justify-content: center !important; align-items: center !important; z-index: 2147483647 !important; backdrop-filter: blur(2px) !important; padding: 16px !important; box-sizing: border-box !important; } .img-selector-modal { background: var(--dark-bg) !important; border-radius: var(--border-radius) !important; box-shadow: var(--shadow) !important; width: 100% !important; max-width: 420px !important; overflow: hidden !important; color: var(--text-light) !important; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif !important; animation: modalFadeIn 0.3s ease !important; display: flex !important; flex-direction: column !important; max-height: 90vh !important; } @keyframes modalFadeIn { from { opacity: 0; transform: translateY(-20px) scale(0.95); } to { opacity: 1; transform: translateY(0) scale(1); } } .img-selector-header { background: var(--header-bg) !important; padding: 16px !important; display: flex !important; justify-content: space-between !important; align-items: center !important; flex-shrink: 0 !important; } .img-selector-title { font-size: 18px !important; font-weight: 600 !important; margin: 0 !important; } .img-selector-close { background: none !important; border: none !important; color: var(--text-light) !important; font-size: 24px !important; cursor: pointer !important; padding: 0 !important; width: 32px !important; height: 32px !important; display: flex !important; align-items: center !important; justify-content: center !important; border-radius: 50% !important; transition: var(--transition) !important; } .img-selector-close:hover { background: rgba(255, 255, 255, 0.1) !important; } .img-selector-body { padding: 20px !important; display: flex !important; flex-direction: column !important; gap: 16px !important; overflow-y: auto !important; flex: 1 !important; } .img-preview-container { position: relative !important; width: 100% !important; background: var(--header-bg) !important; border-radius: var(--border-radius) !important; overflow: hidden !important; display: flex !important; justify-content: center !important; align-items: center !important; min-height: 150px !important; } .img-preview { width: 100% !important; max-height: 200px !important; object-fit: contain !important; border-radius: var(--border-radius) !important; } .img-info { display: flex !important; flex-direction: column !important; gap: 8px !important; font-size: 14px !important; } .img-info-row { display: flex !important; justify-content: space-between !important; align-items: center !important; flex-wrap: wrap !important; } .img-info-label { color: var(--text-muted) !important; font-weight: 500 !important; } .img-info-value { font-weight: 500 !important; text-align: right !important; max-width: 60% !important; overflow: hidden !important; text-overflow: ellipsis !important; } .img-selector-actions { display: flex !important; gap: 12px !important; justify-content: flex-end !important; margin-top: 10px !important; flex-wrap: wrap !important; } .img-selector-btn { padding: 10px 16px !important; border: none !important; border-radius: var(--border-radius) !important; font-weight: 600 !important; cursor: pointer !important; transition: var(--transition) !important; display: flex !important; align-items: center !important; gap: 8px !important; font-size: 14px !important; flex: 1 !important; min-width: 120px !important; justify-content: center !important; } .btn-download { background: var(--primary-color) !important; color: var(--text-light) !important; } .btn-download:hover { background: #3182ce !important; transform: translateY(-2px) !important; } .btn-view { background: var(--success-color) !important; color: var(--text-light) !important; } .btn-view:hover { background: #38a169 !important; transform: translateY(-2px) !important; } .btn-cancel { background: var(--neutral-color) !important; color: var(--text-light) !important; } .btn-cancel:hover { background: #4a5568 !important; transform: translateY(-2px) !important; } .img-selector-highlight { outline: 3px solid var(--primary-color) !important; outline-offset: -3px !important; transition: var(--transition) !important; position: relative !important; z-index: 2147483646 !important; } .img-selector-highlight::after { content: '' !important; position: absolute !important; top: 0 !important; left: 0 !important; right: 0 !important; bottom: 0 !important; background: rgba(66, 153, 225, 0.1) !important; pointer-events: none !important; z-index: 2147483646 !important; } .settings-panel { position: fixed !important; top: 50% !important; left: 50% !important; transform: translate(-50%, -50%) !important; background: var(--dark-bg) !important; border-radius: var(--border-radius) !important; box-shadow: var(--shadow) !important; width: 90% !important; max-width: 500px !important; max-height: 90vh !important; overflow-y: auto !important; z-index: 2147483647 !important; color: var(--text-light) !important; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif !important; padding: 24px !important; display: flex !important; flex-direction: column !important; } .settings-header { display: flex !important; justify-content: space-between !important; align-items: center !important; margin-bottom: 20px !important; padding-bottom: 16px !important; border-bottom: 1px solid var(--header-bg) !important; } .settings-title { font-size: 20px !important; font-weight: 600 !important; margin: 0 !important; } .settings-close { background: none !important; border: none !important; color: var(--text-light) !important; font-size: 24px !important; cursor: pointer !important; padding: 4px !important; border-radius: 4px !important; transition: var(--transition) !important; } .settings-close:hover { background: rgba(255, 255, 255, 0.1) !important; } .settings-group { margin-bottom: 20px !important; } .settings-label { display: block !important; margin-bottom: 8px !important; font-weight: 500 !important; } .settings-input { width: 100% !important; padding: 12px !important; border-radius: var(--border-radius) !important; border: 1px solid var(--header-bg) !important; background: var(--darker-bg) !important; color: var(--text-light) !important; font-family: inherit !important; font-size: 14px !important; box-sizing: border-box !important; transition: var(--transition) !important; } .settings-input:focus { outline: none !important; border-color: var(--primary-color) !important; box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.2) !important; } .settings-hint { font-size: 12px !important; color: var(--text-muted) !important; margin-top: 5px !important; } .settings-footer { display: flex !important; justify-content: flex-end !important; gap: 12px !important; margin-top: 24px !important; flex-wrap: wrap !important; } .settings-footer .img-selector-btn { min-width: 100px !important; flex: none !important; } .hotkey-hint { position: fixed !important; bottom: 20px !important; right: 20px !important; background: rgba(45, 55, 72, 0.9) !important; color: var(--text-light) !important; padding: 12px 16px !important; border-radius: var(--border-radius) !important; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif !important; font-size: 14px !important; z-index: 2147483646 !important; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2) !important; transition: var(--transition) !important; max-width: 300px !important; backdrop-filter: blur(4px) !important; } .hotkey-hint.fade { opacity: 0.5 !important; } .url-debug { font-size: 12px !important; color: var(--text-muted) !important; margin-top: 5px !important; word-break: break-all !important; background: var(--darker-bg) !important; padding: 8px !important; border-radius: var(--border-radius) !important; } .url-debug-original { text-decoration: line-through !important; opacity: 0.7 !important; margin-bottom: 4px !important; } .url-debug-new { color: var(--success-color) !important; font-weight: 500 !important; } .download-status { position: fixed; top: 20px; right: 20px; background: rgba(45, 55, 72, 0.95); color: white; padding: 12px 16px; border-radius: 8px; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; z-index: 2147483647; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); max-width: 300px; backdrop-filter: blur(4px); animation: slideIn 0.3s ease; } .download-status.success { border-left: 4px solid #48bb78; } .download-status.error { border-left: 4px solid #e53e3e; } .download-status.warning { border-left: 4px solid #d69e2e; } @keyframes slideIn { from { transform: translateX(100%); opacity: 0; } to { transform: translateX(0); opacity: 1; } } .download-options { display: flex; flex-direction: column; gap: 8px; margin-top: 10px; padding: 10px; background: rgba(255, 255, 255, 0.1); border-radius: 6px; } .download-option { display: flex; align-items: center; gap: 8px; cursor: pointer; padding: 6px; border-radius: 4px; transition: background 0.2s; } .download-option:hover { background: rgba(255, 255, 255, 0.1); } .download-option input[type="radio"] { margin: 0; } /* 响应式设计 */ @media (max-width: 480px) { .img-selector-modal { max-width: 100% !important; margin: 0 10px !important; } .img-selector-body { padding: 16px !important; } .img-selector-actions { flex-direction: column !important; } .img-selector-btn { width: 100% !important; } .settings-panel { width: 95% !important; padding: 16px !important; } .settings-footer { flex-direction: column !important; } .hotkey-hint { bottom: 10px !important; right: 10px !important; left: 10px !important; max-width: none !important; } } @media (max-width: 768px) { .img-info-row { flex-direction: column !important; align-items: flex-start !important; gap: 4px !important; } .img-info-value { max-width: 100% !important; text-align: left !important; } } /* 加载动画 */ .loading-spinner { display: inline-block !important; width: 20px !important; height: 20px !important; border: 3px solid rgba(255,255,255,.3) !important; border-radius: 50% !important; border-top-color: var(--text-light) !important; animation: spin 1s ease-in-out infinite !important; } @keyframes spin { to { transform: rotate(360deg); } } .preview-loading { position: absolute !important; top: 50% !important; left: 50% !important; transform: translate(-50%, -50%) !important; } `); // 初始化 function init() { loadConfig(); setupEventListeners(); // 只在首次使用时显示提示 const hintShown = GM_getValue('hint_shown', false); if (!hintShown && config.showHint) { createHotkeyHint(); GM_setValue('hint_shown', true); } registerMenuCommands(); } // 加载配置 function loadConfig() { const savedConfig = GM_getValue('img_downloader_config'); if (savedConfig) { config = { ...config, ...savedConfig }; } } // 保存配置 function saveConfig() { GM_setValue('img_downloader_config', config); } // 设置事件监听 function setupEventListeners() { // 键盘按下事件 document.addEventListener('keydown', (e) => { if (e.key === config.hotkey) { isHotkeyPressed = true; document.body.style.cursor = 'crosshair'; } }); // 键盘释放事件 document.addEventListener('keyup', (e) => { if (e.key === config.hotkey) { isHotkeyPressed = false; document.body.style.cursor = ''; removeImageHighlight(); } }); // 图片点击事件 - 使用捕获阶段以阻止默认行为 document.addEventListener('click', handleImageClick, true); // 鼠标移动事件(图片高亮) document.addEventListener('mousemove', (e) => { if (!isHotkeyPressed) return; const imgElement = findImageElement(e.target); highlightImage(imgElement); }); } // 处理图片点击事件 function handleImageClick(e) { if (!isHotkeyPressed) return; // 查找被点击的图片元素 const imgElement = findImageElement(e.target); if (imgElement) { // 阻止默认行为和事件传播 e.preventDefault(); e.stopPropagation(); e.stopImmediatePropagation(); currentSelectedImg = imgElement; showImageOptions(imgElement); // 对于B站等网站,额外添加一次阻止默认行为 setTimeout(() => { if (e.cancelable) { e.preventDefault(); } }, 0); return false; } } // 查找图片元素 - 增强版,专门处理B站评论区表情包 function findImageElement(element) { if (!element) return null; // 检查元素本身是否是图片 if (isImageElement(element)) { return element; } // 向上遍历DOM树查找图片元素 let currentElement = element; while (currentElement && currentElement !== document.body) { if (isImageElement(currentElement)) { return currentElement; } // 检查是否是表情包元素(常见于评论区) if (isEmojiElement(currentElement)) { return currentElement; } // 专门处理B站评论区表情包 if (isBilibiliCommentEmoji(currentElement)) { return currentElement; } currentElement = currentElement.parentElement; } return null; } // 判断是否是图片元素 function isImageElement(element) { // 标准的img标签 if (element.tagName === 'IMG') { return true; } // 带有背景图片的元素 const style = window.getComputedStyle(element); const backgroundImage = style.backgroundImage; if (backgroundImage && backgroundImage !== 'none') { return true; } // SVG图片 if (element.tagName === 'svg' || element.closest('svg')) { return true; } // Canvas元素 if (element.tagName === 'CANVAS') { return true; } // 排除文本元素 if (element.tagName === 'P' || element.tagName === 'SPAN' || element.tagName === 'DIV') { // 检查是否包含文本内容 const textContent = element.textContent || ''; if (textContent.trim().length > 0 && !element.querySelector('img')) { return false; } } return false; } // 判断是否是表情包元素 function isEmojiElement(element) { // 常见表情包类名和属性 const emojiClasses = ['emoji', 'face', 'biaoqing', 'expression', 'smiley', 'comment-emoji']; const emojiAttributes = ['data-emoji', 'data-face', 'data-src', 'data-url']; // 检查类名 for (const cls of emojiClasses) { if (element.classList.contains(cls)) { return true; } } // 检查属性 for (const attr of emojiAttributes) { if (element.hasAttribute(attr)) { return true; } } // 检查是否是图片但被其他元素包裹 if (element.querySelector('img')) { return true; } return false; } // 专门检测B站评论区表情包 function isBilibiliCommentEmoji(element) { // 检查是否在B站页面 if (!window.location.hostname.includes('bilibili.com')) { return false; } // 检查元素是否在评论区 const commentSection = element.closest('.bili-comment, [class*="comment"], [class*="Comment"]'); if (!commentSection) { return false; } // 检查元素特征 const isImg = element.tagName === 'IMG'; const hasEmojiClass = element.classList.contains('emoji') || element.classList.contains('face') || element.getAttribute('data-emoji') !== null; const hasEmojiSrc = element.src && ( element.src.includes('emoji') || element.src.includes('face') || element.src.includes('expression') || element.src.includes('hdslb.com/bfs/face') ); // 如果是图片且有表情包特征 if (isImg && (hasEmojiClass || hasEmojiSrc)) { return true; } // 如果元素包含表情包图片 const emojiImg = element.querySelector('img'); if (emojiImg && (emojiImg.classList.contains('emoji') || emojiImg.getAttribute('data-emoji') !== null || (emojiImg.src && emojiImg.src.includes('hdslb.com/bfs/face')))) { return true; } return false; } // 高亮图片 function highlightImage(imgElement) { removeImageHighlight(); if (imgElement) { // 使用更高优先级的类名 imgElement.classList.add('img-selector-highlight'); } } // 移除图片高亮 function removeImageHighlight() { const highlighted = document.querySelector('.img-selector-highlight'); if (highlighted) { highlighted.classList.remove('img-selector-highlight'); } } // 显示图片选项 function showImageOptions(imgElement) { // 如果已有模态框,先移除 const existingModal = document.querySelector('.img-selector-overlay'); if (existingModal) { document.body.removeChild(existingModal); } // 创建模态框 const overlay = document.createElement('div'); overlay.className = 'img-selector-overlay'; // 获取图片信息 const originalUrl = getBestImageUrl(imgElement); const processedUrl = getOriginalImageUrl(originalUrl); const imgName = getImageName(processedUrl); const imgSize = getImageSize(imgElement); overlay.innerHTML = `
图片操作
${config.showPreview ? `
预览
` : ''}
名称: ${imgName}
尺寸: ${imgSize}
类型: ${getImageType(processedUrl)}
${originalUrl !== processedUrl ? `
原始: ${truncateText(originalUrl, 50)}
处理后: ${truncateText(processedUrl, 50)}
` : ''}
`; document.body.appendChild(overlay); // 设置下载方法选择 const methodRadios = overlay.querySelectorAll('input[name="download-method"]'); methodRadios.forEach(radio => { radio.addEventListener('change', (e) => { config.downloadMethod = e.target.value; GM_setValue('img_downloader_config', config); }); }); // 添加事件监听 overlay.querySelector('.img-selector-close').addEventListener('click', () => { document.body.removeChild(overlay); }); overlay.querySelector('.btn-cancel').addEventListener('click', () => { document.body.removeChild(overlay); }); overlay.querySelector('.btn-download').addEventListener('click', async () => { const success = await downloadImage(processedUrl, imgName); if (success) { document.body.removeChild(overlay); } }); overlay.querySelector('.btn-view').addEventListener('click', () => { viewOriginalImage(processedUrl); document.body.removeChild(overlay); }); // 点击外部关闭 overlay.addEventListener('click', (e) => { if (e.target === overlay) { document.body.removeChild(overlay); } }); // ESC键关闭 const escHandler = (e) => { if (e.key === 'Escape') { document.body.removeChild(overlay); document.removeEventListener('keydown', escHandler); } }; document.addEventListener('keydown', escHandler); } // 截断文本 function truncateText(text, maxLength) { if (text.length <= maxLength) return text; return text.substring(0, maxLength) + '...'; } // 获取最佳图片URL - 增强版 function getBestImageUrl(imgElement) { // 尝试获取各种可能包含原图的属性 const attributes = [ 'data-src', 'data-original', 'data-url', 'data-src-original', 'data-original-src', 'data-source', 'data-original-url', 'src', 'href' ]; for (const attr of attributes) { const value = imgElement.getAttribute(attr); if (value && (value.startsWith('http') || value.startsWith('//'))) { return value.startsWith('//') ? 'https:' + value : value; } } // 检查背景图片 const style = window.getComputedStyle(imgElement); const backgroundImage = style.backgroundImage; if (backgroundImage && backgroundImage !== 'none') { const urlMatch = backgroundImage.match(/url\(["']?(.*?)["']?\)/); if (urlMatch && urlMatch[1]) { return urlMatch[1].startsWith('//') ? 'https:' + urlMatch[1] : urlMatch[1]; } } // 对于表情包元素,尝试从子元素获取 if (isEmojiElement(imgElement) || isBilibiliCommentEmoji(imgElement)) { const childImg = imgElement.querySelector('img'); if (childImg && childImg.src) { return childImg.src; } } // 默认返回src属性 return imgElement.src || ''; } // 获取原图URL(去除参数) function getOriginalImageUrl(url) { if (!url) return ''; const domain = getDomainFromUrl(url); let rules = config.originalImageRules.default; // 获取特定网站规则 for (const site in config.originalImageRules) { if (site !== 'default' && domain.includes(site)) { rules = config.originalImageRules[site]; break; } } let processedUrl = url; // 应用所有规则 for (const rule of rules) { // 修复:确保 pattern 是正则对象 let pattern = rule.pattern; if (typeof pattern === 'string') { try { // 默认全局和不区分大小写 pattern = new RegExp(pattern, 'gi'); } catch (e) { continue; } } if (pattern instanceof RegExp && pattern.test(processedUrl)) { processedUrl = processedUrl.replace(pattern, rule.replacement); } } // 特殊处理:B站@参数(确保移除所有@参数) if (domain.includes('bilibili') || domain.includes('hdslb')) { const atIndex = processedUrl.indexOf('@'); const questionMarkIndex = processedUrl.indexOf('?'); if (atIndex !== -1) { if (questionMarkIndex !== -1 && atIndex < questionMarkIndex) { processedUrl = processedUrl.substring(0, atIndex) + processedUrl.substring(questionMarkIndex); } else { processedUrl = processedUrl.substring(0, atIndex); } } } // 特殊处理:移除常见的尺寸和质量参数 const paramPatterns = [ /[?&](width|height|size|w|h|q|quality)=\d+/gi, /[?&](crop|resize|fit|scale)=[^&]*/gi, /[?&](format|fm)=[^&]*/gi, /[?&]thumb(nail)?=[^&]*/gi ]; for (const pattern of paramPatterns) { processedUrl = processedUrl.replace(pattern, ''); } // 处理可能产生的多余?或& processedUrl = processedUrl.replace(/(\?|&)+$/, ''); processedUrl = processedUrl.replace(/\?&/, '?'); // 如果处理后只剩下?,则移除它 if (processedUrl.endsWith('?')) { processedUrl = processedUrl.slice(0, -1); } return processedUrl || url; } // 从URL获取域名 function getDomainFromUrl(url) { try { const urlObj = new URL(url); return urlObj.hostname; } catch (e) { return ''; } } // 获取图片名称 function getImageName(url) { try { const urlObj = new URL(url); const pathname = urlObj.pathname; const filename = pathname.substring(pathname.lastIndexOf('/') + 1); // 移除可能存在的参数 const cleanFilename = filename.split('?')[0].split('#')[0]; // 如果文件名太长,截断 if (cleanFilename.length > 30) { return cleanFilename.substring(0, 27) + '...'; } return cleanFilename || 'image'; } catch (e) { return 'image'; } } // 获取图片尺寸 function getImageSize(imgElement) { if (imgElement.naturalWidth && imgElement.naturalHeight) { return `${imgElement.naturalWidth} × ${imgElement.naturalHeight}`; } if (imgElement.offsetWidth && imgElement.offsetHeight) { return `${imgElement.offsetWidth} × ${imgElement.offsetHeight}`; } return '未知'; } // 获取图片类型 function getImageType(url) { if (!url) return '未知'; // 移除参数和哈希 const cleanUrl = url.split('?')[0].split('#')[0]; const extension = cleanUrl.split('.').pop().toLowerCase(); if (extension && extension.length < 5) { return extension; } return '未知'; } // 显示下载状态提示 function showDownloadStatus(message, type = 'info', duration = 3000) { // 移除现有的状态提示 const existingStatus = document.querySelector('.download-status'); if (existingStatus) { document.body.removeChild(existingStatus); } const status = document.createElement('div'); status.className = `download-status ${type}`; status.textContent = message; document.body.appendChild(status); // 自动消失 if (duration > 0) { setTimeout(() => { if (document.body.contains(status)) { document.body.removeChild(status); } }, duration); } return status; } // 下载图片 - 增强版,包含多种方法 async function downloadImage(url, filename) { if (!url) { showDownloadStatus('无法获取图片地址', 'error'); return false; } // 根据配置选择下载方法 let success = false; switch (config.downloadMethod) { case 'blob': success = await downloadViaBlob(url, filename); break; case 'direct': success = downloadViaAnchor(url, filename); break; case 'clipboard': success = await copyToClipboard(url); break; case 'auto': default: // 自动选择:先尝试GM_download,失败后尝试其他方法 if (typeof GM_download !== 'undefined') { success = await downloadViaGm(url, filename); if (!success) { success = await downloadViaBlob(url, filename); if (!success) { success = downloadViaAnchor(url, filename); } } } else { success = await downloadViaBlob(url, filename); if (!success) { success = downloadViaAnchor(url, filename); } } break; } if (success) { showDownloadStatus(`已下载: ${filename}`, 'success'); } else { showDownloadStatus('下载失败,已复制图片链接到剪贴板', 'warning'); GM_setClipboard(url); } return success; } // 方法1: 使用GM_download async function downloadViaGm(url, filename) { return new Promise((resolve) => { try { const timestamp = new Date().getTime(); const downloadUrl = url.includes('?') ? `${url}&_=${timestamp}` : `${url}?_=${timestamp}`; GM_download({ url: downloadUrl, name: filename, onerror: function(e) { console.error('GM_download失败:', e.error); resolve(false); }, onload: function() { resolve(true); } }); } catch (e) { console.error('GM_download异常:', e); resolve(false); } }); } // 方法2: 使用Blob和对象URL async function downloadViaBlob(url, filename) { return new Promise((resolve) => { try { // 使用GM_xmlhttpRequest绕过CORS限制 GM_xmlhttpRequest({ method: "GET", url: url, responseType: "blob", onload: function(response) { try { const blob = response.response; const blobUrl = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = blobUrl; a.download = filename; a.style.display = 'none'; document.body.appendChild(a); a.click(); // 清理 setTimeout(() => { document.body.removeChild(a); URL.revokeObjectURL(blobUrl); }, 100); resolve(true); } catch (e) { console.error('Blob下载失败:', e); resolve(false); } }, onerror: function(error) { console.error('请求图片失败:', error); resolve(false); } }); } catch (e) { console.error('Blob下载异常:', e); resolve(false); } }); } // 方法3: 直接使用a标签下载 function downloadViaAnchor(url, filename) { try { const a = document.createElement('a'); a.href = url; a.download = filename; a.style.display = 'none'; document.body.appendChild(a); a.click(); document.body.removeChild(a); return true; } catch (e) { console.error('直接下载失败:', e); return false; } } // 方法4: 复制到剪贴板 async function copyToClipboard(url) { try { // 使用GM_xmlhttpRequest获取图片数据 const response = await new Promise((resolve) => { GM_xmlhttpRequest({ method: "GET", url: url, responseType: "blob", onload: resolve, onerror: () => resolve(null) }); }); if (!response) return false; // 将Blob转换为可以复制到剪贴板的数据 const blob = response.response; const items = [new ClipboardItem({ [blob.type]: blob })]; await navigator.clipboard.write(items); showDownloadStatus('图片已复制到剪贴板', 'success'); return true; } catch (e) { console.error('复制到剪贴板失败:', e); // 备用方案:只复制URL try { GM_setClipboard(url); showDownloadStatus('图片链接已复制到剪贴板', 'success'); return true; } catch (err) { console.error('复制URL失败:', err); return false; } } } // 查看原图 function viewOriginalImage(url) { if (!url) { showDownloadStatus('无法获取图片地址', 'error'); return; } window.open(url, '_blank'); } // 创建快捷键提示 function createHotkeyHint() { // 如果已有提示,先移除 const existingHint = document.querySelector('.hotkey-hint'); if (existingHint) { document.body.removeChild(existingHint); } const hint = document.createElement('div'); hint.className = 'hotkey-hint'; hint.textContent = `按住 ${config.hotkey} 并点击图片进行操作`; document.body.appendChild(hint); // 5秒后淡出提示 setTimeout(() => { hint.classList.add('fade'); }, 5000); // 点击提示可立即关闭 hint.addEventListener('click', () => { document.body.removeChild(hint); }); } // 注册菜单命令 function registerMenuCommands() { GM_registerMenuCommand('图片下载器设置', showSettingsPanel); GM_registerMenuCommand('重置提示', resetHint); GM_registerMenuCommand('测试原图识别', testOriginalImageRecognition); } // 显示设置面板 function showSettingsPanel() { const settingsPanel = document.createElement('div'); settingsPanel.className = 'settings-panel'; settingsPanel.innerHTML = `
图片下载器设置
按住此键并点击图片可进行操作
选择图片下载方式
在操作面板中显示图片预览
在页面上显示快捷键提示
`; document.body.appendChild(settingsPanel); // 添加事件监听 settingsPanel.querySelector('.settings-close').addEventListener('click', () => { document.body.removeChild(settingsPanel); }); settingsPanel.querySelector('#settings-cancel').addEventListener('click', () => { document.body.removeChild(settingsPanel); }); settingsPanel.querySelector('#settings-save').addEventListener('click', () => { // 保存设置 config.hotkey = settingsPanel.querySelector('#hotkey-select').value; config.downloadMethod = settingsPanel.querySelector('#download-method').value; config.showPreview = settingsPanel.querySelector('#show-preview').checked; config.showHint = settingsPanel.querySelector('#show-hint').checked; saveConfig(); // 更新提示 const hint = document.querySelector('.hotkey-hint'); if (hint && config.showHint) { hint.textContent = `按住 ${config.hotkey} 并点击图片进行操作`; } else if (hint && !config.showHint) { document.body.removeChild(hint); } document.body.removeChild(settingsPanel); }); // 点击外部关闭 settingsPanel.addEventListener('click', (e) => { if (e.target === settingsPanel) { document.body.removeChild(settingsPanel); } }); // ESC键关闭 const escHandler = (e) => { if (e.key === 'Escape') { document.body.removeChild(settingsPanel); document.removeEventListener('keydown', escHandler); } }; document.addEventListener('keydown', escHandler); } // 重置提示 function resetHint() { GM_setValue('hint_shown', false); createHotkeyHint(); GM_notification({ text: '提示已重置,将会再次显示', title: '重置成功', timeout: 2000 }); } // 测试原图识别功能 function testOriginalImageRecognition() { const testUrls = [ 'https://i1.hdslb.com/bfs/face/39a835c3d22e8e26a77fda9bb65ecab814128103.jpg@96w_96h_1c_1s_!web-avatar.avif', 'https://example.com/image.jpg@300w_200h_1e_1c', 'https://example.com/photo.png?width=300&height=200&quality=80', 'https://wx1.sinaimg.cn/large/002ABC.jpg', 'https://wx1.sinaimg.cn/small/002ABC.jpg', 'https://pic1.zhimg.com/50/v2-abc123_s.jpg', 'https://pic1.zhimg.com/80/v2-abc123_xs.jpg' ]; let result = '原图识别测试结果:\n\n'; testUrls.forEach(url => { const original = getOriginalImageUrl(url); result += `原始: ${url}\n处理后: ${original}\n\n`; }); // 显示结果 alert(result); } // 启动脚本 init(); })();