From cfe3db8de4bdda121f23a2a54b0489fbc8a23c2f Mon Sep 17 00:00:00 2001 From: jack Date: Wed, 17 Dec 2025 09:26:50 +0800 Subject: [PATCH] ++ --- hdk4_downloader.js | 158 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) diff --git a/hdk4_downloader.js b/hdk4_downloader.js index e69de29..77c8536 100644 --- a/hdk4_downloader.js +++ b/hdk4_downloader.js @@ -0,0 +1,158 @@ +// ==UserScript== +// @name hd4k_downloader +// @namespace http://tampermonkey.net/ +// @version 1.0 +// @description 提取页面图片并发送到后端 +// @author Jack +// @match *://*/* +// @grant GM_xmlhttpRequest +// ==/UserScript== + +(function() { + 'use strict'; + + // 创建按钮 + const createButton = () => { + const button = document.createElement('button'); + button.textContent = '提取图片'; + button.id = 'hd4k-extract-btn'; + + // 按钮样式 - 修改为蓝色系 + button.style.position = 'fixed'; + button.style.top = '12.5%'; + button.style.right = '1%'; + button.style.transform = 'translateY(-50%)'; + button.style.padding = '6px 12px'; + button.style.fontSize = '12px'; + button.style.fontWeight = 'bold'; + button.style.backgroundColor = '#2c80ff'; + button.style.color = '#fff'; + button.style.border = 'none'; + button.style.borderRadius = '8px'; + button.style.cursor = 'pointer'; + button.style.zIndex = '10000'; + button.style.boxShadow = '0 2px 5px rgba(0,0,0,0.2)'; + button.style.transition = 'all 0.3s ease'; + + // 悬停效果 + button.addEventListener('mouseenter', () => { + button.style.backgroundColor = '#1a6ee0'; + button.style.transform = 'translateY(-50%) scale(1.05)'; + }); + + button.addEventListener('mouseleave', () => { + button.style.backgroundColor = '#2c80ff'; + button.style.transform = 'translateY(-50%) scale(1)'; + }); + + // 点击事件 + button.addEventListener('click', extractAndSendImages); + + return button; + }; + + // 获取所有图片URL + const getAllImageUrls = () => { + const images = document.querySelectorAll('img'); + const imageUrls = {}; + let index = 1; + + images.forEach(img => { + let src = img.src || img.dataset.src || img.currentSrc; + + // 过滤掉空URL、base64和数据URL + if (src && !src.startsWith('data:') && !src.startsWith('blob:')) { + const key = String(index).padStart(4, '0'); + imageUrls[key] = src; + index++; + } + }); + + return imageUrls; + }; + + // 提取并发送数据 + const extractAndSendImages = () => { + try { + // 获取当前页面信息 + const title = document.title || '无标题'; + const url = window.location.href; + const imageUrls = getAllImageUrls(); + + // 准备数据 + const data = { + title: title, + url: url, + imgs: imageUrls + }; + + console.log('提取的数据:', data); + + // 显示加载状态 + const button = document.getElementById('hd4k-extract-btn'); + const originalText = button.textContent; + button.textContent = '处理中...'; + button.disabled = true; + + // 发送到后端 + GM_xmlhttpRequest({ + method: 'POST', + url: 'http://127.0.0.1:55830/api/save_imgs', + headers: { + 'Content-Type': 'application/json' + }, + data: JSON.stringify(data), + onload: function(response) { + console.log('发送成功:', response); + + // 恢复按钮状态并显示成功 + button.textContent = '成功!'; + button.style.backgroundColor = '#28a745'; + + setTimeout(() => { + button.textContent = originalText; + button.style.backgroundColor = '#2c80ff'; + button.disabled = false; + }, 1500); + }, + onerror: function(error) { + console.error('发送失败:', error); + + // 恢复按钮状态并显示错误 + button.textContent = '失败!'; + button.style.backgroundColor = '#dc3545'; + + setTimeout(() => { + button.textContent = originalText; + button.style.backgroundColor = '#2c80ff'; + button.disabled = false; + }, 1500); + + alert('发送失败,请检查后端服务是否运行: ' + error.statusText); + }, + timeout: 10000 + }); + + } catch (error) { + console.error('提取图片时出错:', error); + alert('提取图片时出错: ' + error.message); + } + }; + + // 初始化 - 添加按钮到页面 + const init = () => { + // 确保按钮不会重复添加 + if (!document.getElementById('hd4k-extract-btn')) { + const button = createButton(); + document.body.appendChild(button); + } + }; + + // 页面加载完成后初始化 + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', init); + } else { + init(); + } + +})(); \ No newline at end of file