Intenta descargar <img> o capturar con html2canvas, pero NO funcionará si el manga está en un iframe de otro dominio.
// ==UserScript== // @name KDS-T Viewer Downloader + Screenshot (Limitado por iframes) // @namespace kds-t-viewer-downloader // @version 0.5 // @description Intenta descargar <img> o capturar con html2canvas, pero NO funcionará si el manga está en un iframe de otro dominio. // @match https://kds-t.jp/viewer/* // @require https://cdn.jsdelivr.net/npm/jszip@3/dist/jszip.min.js // @require https://cdn.jsdelivr.net/npm/file-saver@2/dist/FileSaver.min.js // @require https://cdn.jsdelivr.net/npm/[email protected]/dist/html2canvas.min.js // @grant none // ==/UserScript== (function() { 'use strict'; // --- CREAR BOTONES --- const downloadBtn = document.createElement('button'); downloadBtn.textContent = 'Descargar Imágenes <img>'; styleButton(downloadBtn, 10); const screenshotBtn = document.createElement('button'); screenshotBtn.textContent = 'Captura de Pantalla (html2canvas)'; styleButton(screenshotBtn, 60); document.body.appendChild(downloadBtn); document.body.appendChild(screenshotBtn); // --- EVENTO: DESCARGAR IMÁGENES (DIRECTAS) --- downloadBtn.addEventListener('click', async () => { downloadBtn.disabled = true; downloadBtn.textContent = 'Descargando...'; try { // Buscar <img> en la página const imgElements = Array.from(document.querySelectorAll('img')); const imageUrls = imgElements.map(img => img.src).filter(src => src); if (!imageUrls.length) { alert('No se encontraron imágenes <img>. Probablemente el visor use <canvas> o un iframe distinto.'); resetDownloadBtn(); return; } console.log('Imágenes encontradas:', imageUrls); // Crear el ZIP const zip = new JSZip(); for (let i = 0; i < imageUrls.length; i++) { const url = imageUrls[i]; console.log(`Descargando imagen ${i+1}: ${url}`); const response = await fetch(url); const blob = await response.blob(); const fileName = String(i+1).padStart(3, '0') + '.jpg'; zip.file(fileName, blob); } // Generar el ZIP const zipContent = await zip.generateAsync({ type: 'blob' }); saveAs(zipContent, 'kds_t_imagenes.zip'); alert(`Descarga completa: ${imageUrls.length} imágenes.`); } catch (error) { console.error('Error al descargar imágenes:', error); alert('Ocurrió un error. Revisa la consola para más detalles.'); } resetDownloadBtn(); }); // --- EVENTO: CAPTURA DE PANTALLA (HTML2CANVAS) --- screenshotBtn.addEventListener('click', async () => { screenshotBtn.disabled = true; screenshotBtn.textContent = 'Capturando...'; try { // html2canvas NO puede ver dentro de iframes de otro dominio const canvas = await html2canvas(document.body, { useCORS: true }); canvas.toBlob(function(blob) { saveAs(blob, 'captura_kds_t.png'); }); alert('Captura finalizada. Imagen guardada como captura_kds_t.png'); } catch (error) { console.error('Error en la captura de pantalla:', error); alert('Ocurrió un error. Revisa la consola para más detalles.'); } resetScreenshotBtn(); }); // --- FUNCIONES DE ESTILO Y RESETEO --- function styleButton(btn, topPx) { btn.style.position = 'fixed'; btn.style.top = `${topPx}px`; btn.style.right = '10px'; btn.style.zIndex = '9999'; btn.style.background = '#6e8efb'; btn.style.color = '#fff'; btn.style.padding = '8px 12px'; btn.style.border = 'none'; btn.style.borderRadius = '4px'; btn.style.cursor = 'pointer'; } function resetDownloadBtn() { downloadBtn.disabled = false; downloadBtn.textContent = 'Descargar Imágenes <img>'; } function resetScreenshotBtn() { screenshotBtn.disabled = false; screenshotBtn.textContent = 'Captura de Pantalla (html2canvas)'; } })();