Descargar imágenes de Comic Earthstar

Detecta y descarga todas las imágenes cargadas como blobs en Comic Earthstar

// ==UserScript==
// @name         Descargar imágenes de Comic Earthstar
// @namespace    https://comic-earthstar.com/
// @version      1.1
// @description  Detecta y descarga todas las imágenes cargadas como blobs en Comic Earthstar
// @author       TuNombre
// @match        https://comic-earthstar.com/*
// @grant        none
// ==/UserScript==

(function () {
    'use strict';

    // Crear un contenedor para almacenar las URLs detectadas
    const detectedURLs = new Set();

    // Crear un botón para iniciar la descarga
    const downloadButton = document.createElement('button');
    downloadButton.innerText = 'Descargar imágenes';
    downloadButton.style.position = 'fixed';
    downloadButton.style.top = '10px';
    downloadButton.style.right = '10px';
    downloadButton.style.zIndex = '9999';
    downloadButton.style.padding = '10px';
    downloadButton.style.backgroundColor = '#007bff';
    downloadButton.style.color = 'white';
    downloadButton.style.border = 'none';
    downloadButton.style.borderRadius = '5px';
    downloadButton.style.cursor = 'pointer';
    document.body.appendChild(downloadButton);

    // Función para interceptar peticiones de red
    const observeNetworkRequests = () => {
        const originalOpen = XMLHttpRequest.prototype.open;
        XMLHttpRequest.prototype.open = function (...args) {
            this.addEventListener('load', function () {
                if (this.responseURL.startsWith('blob:https://comic-earthstar.com')) {
                    detectedURLs.add(this.responseURL);
                }
            });
            originalOpen.apply(this, args);
        };

        const originalFetch = window.fetch;
        window.fetch = async function (...args) {
            const response = await originalFetch(...args);
            if (response.url.startsWith('blob:https://comic-earthstar.com')) {
                detectedURLs.add(response.url);
            }
            return response;
        };
    };

    // Función para observar cambios en el DOM y detectar blobs
    const observeDOMChanges = () => {
        const observer = new MutationObserver((mutations) => {
            mutations.forEach((mutation) => {
                if (mutation.type === 'childList') {
                    const images = Array.from(document.querySelectorAll('img[src^="blob:https://comic-earthstar.com"]'));
                    images.forEach((img) => detectedURLs.add(img.src));
                }
            });
        });

        observer.observe(document.body, {
            childList: true,
            subtree: true,
        });
    };

    // Función para descargar las imágenes
    async function downloadImages() {
        if (detectedURLs.size === 0) {
            alert('No se detectaron imágenes para descargar.');
            return;
        }

        let counter = 1;
        for (const blobUrl of detectedURLs) {
            try {
                const blob = await fetch(blobUrl).then((res) => res.blob());
                const link = document.createElement('a');
                const url = URL.createObjectURL(blob);

                link.href = url;
                link.download = `imagen_${String(counter).padStart(3, '0')}.png`;
                link.click();

                // Liberar el objeto URL temporal
                URL.revokeObjectURL(url);
                counter++;
            } catch (error) {
                console.error('Error descargando la imagen:', blobUrl, error);
            }
        }

        alert('Descarga completa.');
    }

    // Asignar la función de descarga al botón
    downloadButton.addEventListener('click', downloadImages);

    // Iniciar la observación de peticiones de red y cambios en el DOM
    observeNetworkRequests();
    observeDOMChanges();
})();