Crear backup en pdf de los hilos del foro

Una
Sí, me lo genera completo

Qué raro... ¿Estás en Windows?
¿Me podéis pasar la configuración que tenéis en preferencia del foro? Eso del número de mensajes por página y demás, porque a mí me salen los ficheros mucho más feos que el ejemplo que ha puesto el OP, y creo que puede estar ahí el tema.

Por ejemplo me lo genera con menos anchura que el que ha puesto clorhídrico en mega, y al final de cada página deja una zona grande en blanco, cuando el suyo está bastante bien ajustado.

Agradecido
 
Última edición:
Una

¿Me podéis pasar la configuración que tenéis en preferencia del foro? Eso del número de mensajes por página y demás, porque a mí me salen los ficheros mucho más feos que el ejemplo que ha puesto el OP, y creo que puede estar ahí el tema.

Por ejemplo me lo genera con menos anchura que el que ha puesto clorhídrico en mega, y al final de cada página deja una zona grande en blanco, cuando el suyo está bastante bien ajustado.

Agradecido

Yo el foro lo tengo por defecto (inherit from system), pero lo de los huecos blancos es un poco random porque es culpa de PhantomJS y no se puede hacer mucho (probé muchas cosas).

Por cierto, aprovechando he actualizado para que añada a las citas el #ID del mensaje citado y facilitar la lectura.

Salu2 ;)
 
Una

¿Me podéis pasar la configuración que tenéis en preferencia del foro? Eso del número de mensajes por página y demás, porque a mí me salen los ficheros mucho más feos que el ejemplo que ha puesto el OP, y creo que puede estar ahí el tema.

Por ejemplo me lo genera con menos anchura que el que ha puesto clorhídrico en mega, y al final de cada página deja una zona grande en blanco, cuando el suyo está bastante bien ajustado.

Agradecido

He modificado el script para que meta un pequeño retardo (se puede aumentar) para darle tiempo a PhantomJS a renderizar correctamente la web antes de guardarla en el PDF y así evitar los espacios en blanco (el retardo es configurable por si en tu equipo hiciera falta más se puede ir aumentando). A ver si hay suerte. A mi me ha funcionado.

Salu2 ;)
 
Buenas amigos preparacionistas. No sabía bien dónde colocar esto, pero creo que dada la naturaleza del programa, éste me parece el foro más apropiado.

Ver archivo adjunto 862086
Versión script: 0.14 Versión GUI: 0.8

Nota: el usuario y el pass son OPCIONALES para descargar de foros "ocultos". (Sólo hace falta ponerlos la primera vez mientras uséis siempre la misma carpeta de salida).

PhantomJS -> Download PhantomJS

El script (copiar y pegar en un block de notas y guardarlo junto al ejecutable de PhantomJS como burbudump.js):

JavaScript:
/*
██████╗ ██╗   ██╗██████╗ ██████╗ ██╗   ██╗██████╗ ██╗   ██╗███╗   ███╗██████╗
██╔══██╗██║   ██║██╔══██╗██╔══██╗██║   ██║██╔══██╗██║   ██║████╗ ████║██╔══██╗
██████╔╝██║   ██║██████╔╝██████╔╝██║   ██║██║  ██║██║   ██║██╔████╔██║██████╔╝
██╔══██╗██║   ██║██╔══██╗██╔══██╗██║   ██║██║  ██║██║   ██║██║╚██╔╝██║██╔═══╝
██████╔╝╚██████╔╝██║  ██║██████╔╝╚██████╔╝██████╔╝╚██████╔╝██║ ╚═╝ ██║██║    
╚═════╝  ╚═════╝ ╚═╝  ╚═╝╚═════╝  ╚═════╝ ╚═════╝  ╚═════╝ ╚═╝     ╚═╝╚═╝    
                                                                             
by Clorhidrico https://www.burbuja.info/inmobiliaria/members/clorhidrico.132035

CHANGELOG:

v0.14
-Añadido un pequeño retardo antes de guardar el PDF para darle tiempo a PhantomJS a renderizar la página correctamente y MINIMZAR HUECOS EN BLANCO AL FINAL.


v0.13
-El ID del mensaje citado sólo se añade si se descarga el hilo COMPLETO con todas las páginas desde el principio.


v0.12
-Se añade a las citas el número del mensaje concreto dentro del hilo al cual hace referencia.


v0.11
-Intentar mejorar los reintentos de descarga en caso de código de error HTTP


v0.10
-Ocultadas barra de navegación de arriba y footer para ganar algo de espacio.


v0.9
-Los spoilers se muestran abiertos pero con un aviso antes.
-statuscode retry message fix


v0.8
-Bug fix


v0.7
-Output dir (es obligatorio poner antes el usuario y el pass. Si no se quiere hacer login o no estás registrado
se puede poner como usuario un espacio " " y password la que sea y luego el directorio de salida).
Por defecto el directorio de salida es el mismo donde está este script.
-StatusCode check


v0.6
-Login error fix


v0.5
-Opción de descargar a partir de una página en adelante (ejemplo descarga página 3 hasta el final):
https://www.burbuja.info/inmobiliaria/threads/te-tocan-los-130-000-000-euros-del-euromillon-que-haces.1658681/page-3

-Opción de descargar una única página (ejemplo descargar página 4):
https://www.burbuja.info/inmobiliaria/threads/te-tocan-los-130-000-000-euros-del-euromillon-que-haces.1658681/page-4!


v0.4
-Bug arreglado


v0.3
-Soporte para enlaces de hilos en formato antiguo


v0.2
-Limpieza

*/
"use strict";

var VERSION = "0.14";

var WAIT_PAGE_RENDER = 500; //Tiempo para que PhantomJS pueda renderizar la página bien antes de guardar a PDF. (Si salen huecos en blanco IR AUMENTANDO de 500 en 500)

var WAITFOR_TIMEOUT = 10000;

var PAGE_TIMEOUT = 15000;

var fs = require('fs');

var system = require('system');

print_banner();

if (system.args.length < 2) {

    console.log('ERROR: faltan argumentos');
    console.log(system.args[0] + ' url_hilo [<usuario> <pass> [<output_dir>]]');
    phantom.exit(1);
}

if (system.args.length >= 5) {

    var OUTPUT_DIR = system.args[4];

} else {

    var OUTPUT_DIR = "";
}

var posts = [];

var msg_ref = true;

var statusCode = null;

var threads_list = null;

var conta_threads = 0;

if (fs.exists(system.args[1])) {

    //Es una lista de enlaces

    var file_h = fs.open(system.args[1], 'r');

    var line;

    threads_list = [];

    while (!file_h.atEnd()) {

        line = file_h.readLine();

        if (/^https:\/\/www\.burbuja\.info\/inmobiliaria\/threads\//.test(line)) {

            console.log(line);

            threads_list.push(line);

        } else if (/^https:\/\/www\.burbuja\.info\/inmobiliaria\/burbuja-inmobiliaria\//.test(line)) {

            //Enlace en formato antiguo: lo cambiamos

            var matches = line.match(/^https:\/\/www\.burbuja\.info\/inmobiliaria\/burbuja-inmobiliaria\/([0-9]+)-(.*?)\.html/);

            var thread = 'https://www.burbuja.info/inmobiliaria/threads/' + matches[2] + '.' + matches[1];

            console.log(thread);

            threads_list.push(thread);
        }
    }

    file_h.close();

    if (threads_list.length > 0) {

        save_thread(threads_list[conta_threads]);

    } else {

        phantom.exit();
    }

} else if (/^https:\/\/www\.burbuja\.info\/inmobiliaria\/threads\//.test(system.args[1])) {

    console.log(system.args[1]);

    save_thread(system.args[1]);

} else if (/^https:\/\/www\.burbuja\.info\/inmobiliaria\/burbuja-inmobiliaria\//.test(system.args[1])) {

    //Enlace en formato antiguo: lo cambiamos

    var matches = system.args[1].match(/^https:\/\/www\.burbuja\.info\/inmobiliaria\/burbuja-inmobiliaria\/([0-9]+)-(.*?)\.html/);

    var thread = 'https://www.burbuja.info/inmobiliaria/threads/' + matches[2] + '.' + matches[1];

    console.log(thread);

    save_thread(thread);

} else {

    phantom.exit();
}


function print_banner() {

    console.log('██████╗ ██╗   ██╗██████╗ ██████╗ ██╗   ██╗██████╗ ██╗   ██╗███╗   ███╗██████╗ ');
    console.log('██╔══██╗██║   ██║██╔══██╗██╔══██╗██║   ██║██╔══██╗██║   ██║████╗ ████║██╔══██╗');
    console.log('██████╔╝██║   ██║██████╔╝██████╔╝██║   ██║██║  ██║██║   ██║██╔████╔██║██████╔╝');
    console.log('██╔══██╗██║   ██║██╔══██╗██╔══██╗██║   ██║██║  ██║██║   ██║██║╚██╔╝██║██╔═══╝ ');
    console.log('██████╔╝╚██████╔╝██║  ██║██████╔╝╚██████╔╝██████╔╝╚██████╔╝██║ ╚═╝ ██║██║     ');
    console.log('╚═════╝  ╚═════╝ ╚═╝  ╚═╝╚═════╝  ╚═════╝ ╚═════╝  ╚═════╝ ╚═╝     ╚═╝╚═╝     ');
    console.log('v' + VERSION + ' by clorhidrico');
    console.log('');
}

function create_page() {

    var page = require('webpage').create();

    page.customHeaders = {
        'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:94.0) Gecko/20100101 Firefox/94.0'
    };

    page.onResourceReceived = function(response) {
        statusCode = response.status;
    };

    page.onConsoleMessage = function(msg) {

        if (/^\/inmobiliaria\/threads\/[^/]+\/post-/.test(msg)) {

            posts.push(msg);
        }

    };

    page.onError = function(msg, trace) {
        return;
    }

    page.viewportSize = {
        width: 1080,
        height: 1080
    };

    page.settings.resourceTimeout = PAGE_TIMEOUT;

    return page;

}

function save_thread(url) {

    console.log('');

    posts = [];

    var p = url.match(/page-([0-9]+)(!)?[^/]*$/);

    msg_ref = p ? false : true;

    url = url.replace(/\/[^/.]*$/, '');

    var page = create_page();

    var hilo = url.replace(/\//g, '_').replace(/https:__www\.burbuja\.info_inmobiliaria_threads_/, '');

    fs.makeDirectory(OUTPUT_DIR + "/" + hilo);

    page.includeJs('https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js', function() {

        if (system.args.length >= 4 && system.args[2].length > 0 && system.args[2] != " " && system.args[3].length > 0) {

            if (p) {
                login(url, page, p[1], p[2] ? true : false);
            } else {
                login(url, page);
            }


        } else {

            console.log("Guardando hilo...");

            if (p) {

                save_page(url, page, p[1], p[2] ? true : false);

            } else {

                save_page(url, page, 1);
            }

        }
    });

}

//Modificada para incluir un timeout callback
function waitFor(testFx, onReady, timeOutMillis, onTimeout) {
    var maxtimeOutMillis = timeOutMillis ? timeOutMillis : WAITFOR_TIMEOUT,
        start = new Date().getTime(),
        condition = false,
        interval = setInterval(function() {
            if ((new Date().getTime() - start < maxtimeOutMillis) && !condition) {
                // If not time-out yet and condition not yet fulfilled
                condition = (typeof(testFx) === "string" ? eval(testFx) : testFx()); //< defensive code
            } else {
                if (!condition) {
                    // If condition still not fulfilled (timeout but condition is 'false')

                    if (onTimeout) {
                        typeof(onTimeout) === "string" ? eval(onTimeout): onTimeout();
                        clearInterval(interval);
                    } else {
                        console.log("'waitFor()' timeout");
                        phantom.exit(1);
                    }
                } else {
                    // Condition fulfilled (timeout and/or condition is 'true')
                    //console.log("'waitFor()' finished in " + (new Date().getTime() - start) + "ms.");
                    typeof(onReady) === "string" ? eval(onReady): onReady(); //< Do what it's supposed to do once the condition is fulfilled
                    clearInterval(interval); //< Stop this interval
                }
            }
        }, 250); //< repeat check every 250ms
};



function login(url, page, p, one_page) {

    statusCode = null;

    console.log("Haciendo login...");

    page.open("https://www.burbuja.info/inmobiliaria/login", function(status) {


        waitFor(function() {

            return (statusCode != null && statusCode < 400);

        }, function() {


            waitFor(function() {

                return page.evaluate(function() {
                    return ('complete' === document.readyState);
                });

            }, function() {


                if (page.evaluate(function() {

                        return ($("input[name=login]").is(":visible") && $("input[name=password]").is(":visible"));

                    })) {

                    page.evaluate(function(user, pass) {

                        $("input[name=login]").attr("value", user);
                        $("input[name=password]").attr("value", pass);
                        $("button[type=submit]").click();

                    }, system.args[2], system.args[3]);

                    waitFor(function() {

                        return page.evaluate(function() {
                            return $('a[href="/inmobiliaria/account/"]').is(":visible");
                        });
                    }, function() {

                        console.log("Login OK!");

                        console.log("Guardando hilo...");

                        if (p) {

                            save_page(url, page, p, one_page);

                        } else {

                            save_page(url, page, 1);
                        }


                    }, WAITFOR_TIMEOUT, function() {
                        console.log("LOGIN ERROR");

                        console.log("Guardando hilo...");

                        if (p) {

                            save_page(url, page, p, one_page);

                        } else {

                            save_page(url, page, 1);
                        }
                    });

                } else {

                    console.log("Login OK!");

                    console.log("Guardando hilo...");

                    if (p) {

                        save_page(url, page, p, one_page);

                    } else {

                        save_page(url, page, 1);
                    }

                }

            }, WAITFOR_TIMEOUT, function() {
                console.log("LOGIN ERROR");

                console.log("Guardando hilo...");

                if (p) {

                    save_page(url, page, p, one_page);

                } else {

                    save_page(url, page, 1);
                }

            });




        }, PAGE_TIMEOUT, function() {

            console.log(statusCode + " Reintentando...");

            page.close();

            save_page(url, create_page(), conta_page);

        });


    });

}


function save_page(url, page, conta_page, one_page) {

    statusCode = null;

    page.open((url + "/page-" + conta_page.toString()), function(status) {


        waitFor(function() {

            return (statusCode != null && statusCode < 400);

        }, function() {


            waitFor(function() {

                return page.evaluate(function() {
                    return ('complete' === document.readyState);
                });

            }, function() {

                if (page.evaluate(function() {

                        return ($("input[name=login]").is(":visible") && $("input[name=password]").is(":visible"));

                    })) {

                    console.log("ERROR (Tienes que hacer login para acceder a ese contenido)");

                    phantom.exit();
                }

                page.evaluate(function(msg_ref) {

                    $('body').prepend('<a href="' + window.location.href + '"><b>' + window.location.href + '</b></a>');

                    $('.p-nav').hide();

                    $('.p-sectionLinks').hide();

                    $('.p-footer').hide();

                    $('.u-bottomFixer').hide();

                    $('.js-quickReply').hide();

                    $('.blockMessage--none').hide();

                    $('.fr-tooltip').hide();

                    $('.bbCodeSpoiler-button').prepend('<div style="display:block;font-size:3em;background-tonalidad:red;tonalidad:white"><b>CUIDADO: SPOILER ABIERTO A CONTINUACIÓN</b></div>');

                    $('.bbCodeBlock--spoiler').css("border", "10px solid red");

                    $('.bbCodeSpoiler-button').click();

                    $('iframe').replaceWith(function() {
                        return $('<a>', {
                            text: $(this).attr('src'),
                            href: $(this).attr('src')
                        });
                    });

                    if (msg_ref) {
                        //Nos guardamos una lista con los identificadores únicos de cada mensaje del hilo por si alguien cita a otro tener la referencia
                        $('a[href*="/post-"][data-xf-init="share-tooltip"]').each(function(index) {
                            console.log($(this).attr('href')); //Hack guarro, usamos el logger para pasar la url a PhantomJS
                        });
                    }

                }, msg_ref);

                if (msg_ref) {

                    //Ahora añadimos a cada cita el #ID del mensaje al que hace referencia para facilitar la lectura al no poder usar enlaces internos dentro del PDF
                    page.evaluate(function(posts) {

                        $('a[href*="/inmobiliaria/goto/post?id="]').each(function(index) {

                            var matches = $(this).attr('href').match(/[0-9]+$/);

                            var i;

                            var re = new RegExp(matches[0] + "$");

                            for (i = 0; i < posts.length; i++) {
                                if (re.test(posts[i])) {

                                    $(this).parent().prepend('<span><b>#' + (i + 1) + '</b></span>');
                                }
                            }
                        });


                    }, posts);
                }

                //Esperamos para darle tiempo a PhantomJS a renderizar la página correctamente y minimizar los huecos en blanco al final al pasar a PDF

                setTimeout(function() {
                    var hilo = url.replace(/\//g, '_').replace(/https:__www\.burbuja\.info_inmobiliaria_threads_/, '');

                    if (conta_page == 1 || page.url == (url + "/page-" + conta_page)) {

                        console.log(hilo + " (PAG " + conta_page.toString() + ")");

                        page.render(OUTPUT_DIR + "/" + hilo + "/" + hilo + "_" + conta_page + '.pdf');

                        if (!one_page) {

                            save_page(url, page, ++conta_page);

                        } else {

                            console.log("OK " + hilo + " " + conta_page + "!");

                            if (threads_list && conta_threads < threads_list.length - 1) {

                                save_thread(threads_list[++conta_threads]);

                            } else {

                                phantom.exit();
                            }
                        }

                    } else {

                        if (fs.exists(OUTPUT_DIR + "/" + hilo + "/" + hilo + "_" + (conta_page - 1) + '.pdf')) {
                            console.log("OK " + hilo + " " + (conta_page - 1));
                        }

                        if (threads_list && conta_threads < threads_list.length - 1) {

                            save_thread(threads_list[++conta_threads]);

                        } else {

                            phantom.exit();
                        }
                    }
                }, WAIT_PAGE_RENDER);


            }, WAITFOR_TIMEOUT, function() {
                console.log("Reintentando...");
                save_page(url, page, conta_page);
            });




        }, PAGE_TIMEOUT, function() {

            console.log(statusCode + " Reintentando...");

            page.close();

            save_page(url, create_page(), conta_page);

        });


    });
}

Instrucciones de uso:

Esta es una herramienta de línea de comandos. Para utilizarla, una vez tenéis descargado y descomprimido el ejecutable de PhantomJS:

Código:
phantomjs --cookies-file=cookies.txt --ignore-ssl-errors=true --web-security=false burbudump.js URL_HILO USUARIO PASSWORD

Los parámetros que nos interesan son los del final:

URL_HILO: la URL del hilo del que queremos hacer el backup (se le puede pasar una LISTA de URLs dentro de un fichero de texto en vez de una url sola).

Ejemplo de URL para descargar el hilo completo:
Código:
https://www.burbuja.info/inmobiliaria/threads/te-tocan-los-130-000-000-euros-del-euromillon-que-haces.1658681

Ejemplo de URL para descargar desde la página 3 hasta el final:
Código:
https://www.burbuja.info/inmobiliaria/threads/te-tocan-los-130-000-000-euros-del-euromillon-que-haces.1658681/page-3

Ejemplo de URL para descargar únicamente la página 4:
Código:
https://www.burbuja.info/inmobiliaria/threads/te-tocan-los-130-000-000-euros-del-euromillon-que-haces.1658681/page-4!

USUARIO y PASSWORD (son opcionales): para poder descargar hilos de foros restringidos.


Extra: ejemplo de uso pasándole una LISTA de HILOS dentro de un fichero de texto (enlaces.txt):
Código:
phantomjs --cookies-file=cookies.txt --ignore-ssl-errors=true --web-security=false burbudump.js enlaces.txt USUARIO PASSWORD

Para cada hilo se genera una carpeta nueva (en la carpeta donde esté el ejecutable de PhantomJS) y dentro de esa carpeta se meten los PDFs de cada página.

Los vídeos externos insertados en el foro lógicamente no pueden salir en el PDF, pero he hecho que al menos salga el link al vídeo (quedaría pendiente descargar los vídeos externos (y las imágenes externas), pero eso sí se me va de tiempo).

Espero que sea útil y recordad que un gran poder conlleva una gran responsabilidad.

Salu2 ;)

Para el banner de consola, como haces para dibujar las letras con caracteres ascii ??? tienes alguna herramienta ???. Mira que me cuesta hacer programas de consola chulos
 
Buenas amigos preparacionistas. No sabía bien dónde colocar esto, pero creo que dada la naturaleza del programa, éste me parece el foro más apropiado.

Ver archivo adjunto 862086
Versión script: 0.18 Versión GUI: 0.9

Nota: el usuario y el pass son OPCIONALES para descargar de foros "ocultos". (Sólo hace falta ponerlos la primera vez mientras uséis siempre la misma carpeta de salida).


PhantomJS -> Download PhantomJS

Instrucciones de uso:

Esta es una herramienta de línea de comandos. Para utilizarla, una vez tenéis descargado y descomprimido el ejecutable de PhantomJS:

Código:
phantomjs --cookies-file=cookies.txt --ignore-ssl-errors=true --web-security=false burbudump.js URL_HILO USUARIO PASSWORD

Los parámetros que nos interesan son los del final:

URL_HILO: la URL del hilo del que queremos hacer el backup (se le puede pasar una LISTA de URLs dentro de un fichero de texto en vez de una url sola).

Ejemplo de URL para descargar el hilo completo:
Código:
https://www.burbuja.info/inmobiliaria/threads/te-tocan-los-130-000-000-euros-del-euromillon-que-haces.1658681

Ejemplo de URL para descargar desde la página 3 hasta el final:
Código:
https://www.burbuja.info/inmobiliaria/threads/te-tocan-los-130-000-000-euros-del-euromillon-que-haces.1658681/page-3

Ejemplo de URL para descargar únicamente la página 4:
Código:
https://www.burbuja.info/inmobiliaria/threads/te-tocan-los-130-000-000-euros-del-euromillon-que-haces.1658681/page-4!

USUARIO y PASSWORD (son opcionales): para poder descargar hilos de foros restringidos.

Extra: ejemplo de uso pasándole una LISTA de HILOS dentro de un fichero de texto (enlaces.txt):
Código:
phantomjs --cookies-file=cookies.txt --ignore-ssl-errors=true --web-security=false burbudump.js enlaces.txt USUARIO PASSWORD

Para cada hilo se genera una carpeta nueva (en la carpeta donde esté el ejecutable de PhantomJS) y dentro de esa carpeta se meten los PDFs de cada página.

Los vídeos externos insertados en el foro lógicamente no pueden salir en el PDF, pero he hecho que al menos salga el link al vídeo (quedaría pendiente descargar los vídeos externos (y las imágenes externas), pero eso sí se me va de tiempo).

Espero que sea útil y recordad que un gran poder conlleva una gran responsabilidad.

Salu2 ;)
no estaría de más que alguien hiciero un backup de todo el foro y lo metiera en un torrent
 
¡Felicidades por el programa y el hilo! Yo soy el autor del hilo que han posteado más arriba. Quedo a tu disposición para coordinarnos y organizar un back up del foro, pero ahora mismo con el trabajo que tengo además de otras cosas no tengo mucho tiempo
 
Buenas.

Upeo el hilo para dar otra vez las gracias a Clorhidrico.

Llevo guardados como una docena de hilos en pdf de momento, y decir que funciona de querida progenitora el script. Guarda muy bien los hilos e incluso hace una captura de los videos junto con su enlace correspondiente. Un lujo.

De momento lo he probado en Windows y en Linux, y en ambos funca bien.

Tengo que hacerle una prueba de stress con algún hilo largo de esos de 100 páginas o así, a ver si se porta como un campeón, pero de momento he hecho copia de seguridad de hilos de 20 paginas sin problema.
 
He intentado pulirlo al máximo para que los PDFs queden lo más limpios posible, sin páginas en blanco y que coincida exactamente el número de páginas del PDF con las páginas del hilo. Además he hecho que los pdfs se fusionen mientras se descargan otros hilos.

 
Va genial, Clorhídrico. Goena herramienta.

Mis bendisiones a hustéc y a todos sus descendientes por los siglos de los siglos.

CarlosJesus.jpg


He intentado pulirlo al máximo para que los PDFs queden lo más limpios posible, sin páginas en blanco y que coincida exactamente el número de páginas del PDF con las páginas del hilo.

 
Gracias a Clorhídrico por el aporte. Lo he probado y funciona.

Otra manera de guardar hilos en formato mht (similar a HTML), sería la siguiente:

En un Excel se pegan las URLs que queremos guardar en la columna "E" desde la celda E11, tal como éstas URLs:

Código:
https://www.burbuja.info/inmobiliaria/threads/he-encontrado-el-pueblo-perfecto-donde-pasar-el-mad-max.1673847/
https://www.burbuja.info/inmobiliaria/threads/he-encontrado-el-pueblo-perfecto-donde-pasar-el-mad-max.1673847/page-2
https://www.burbuja.info/inmobiliaria/threads/he-encontrado-el-pueblo-perfecto-donde-pasar-el-mad-max.1673847/page-3
https://www.burbuja.info/inmobiliaria/threads/he-encontrado-el-pueblo-perfecto-donde-pasar-el-mad-max.1673847/page-4
https://www.burbuja.info/inmobiliaria/threads/he-encontrado-el-pueblo-perfecto-donde-pasar-el-mad-max.1673847/page-5

( Al arrastrar desde la celda donde está " /page-2 " salen consecutivamente el resto de URLs )


Y se ejecuta el siguiente código que pegaríamos en un módulo de Excel.

Código:
Sub GuardarHiloEn_MHT_01()

' Agregar Referencia...  Microsoft Winhttp Setvices 5.1  / quizá no sea necesario agregarla

Dim fila As Integer
Dim Url7 As String, Dest7 As String, nStr As String

fila = 11

Do While Cells(fila, "E") <> Empty
    Url7 = Cells(fila, "E").Value
    nStr = Format(fila - 10, "0000")
    Dest7 = "C:\Users\manuel\Documents\GuardarPaginas\Archivo00_" & nStr & ".mht"

    UrlToMht Url7, Dest7
 
    fila = fila + 1
Loop
Beep
 
End Sub



Sub UrlToMht(Url As String, Mht As String)
  With CreateObject("CDO.Message")
    .MimeFormatted = True
    .CreateMHTMLBody Url, 0, "", ""
    .GetStream.SaveToFile Mht, 2
  End With
End Sub


Funciona, pero en los Hilos restringidos falta introducir el usuario y la contraseña ... Si alguien sabe cómo se soluciona.
Salen tantos archivos mht como páginas tiene el hilo.
Hay que adaptar esto a la ruta donde cada uno lo quiera guardar:
Dest7 = "C:\Users\manuel\Documents\GuardarPaginas\Archivo00_" & nStr & ".mht"


Lo dejo por si alguien lo quiere mejorar o le sirve.
 
Última edición:
Actualizada la GUI para poder continuar descarga de hilos. Por ejemplo, supongamos que descargamos un hilo de 1000 páginas y dentro de un mes queremos descargar sólo las novedades. Habría que poner el enlace así:

Código:
https://www.burbuja.info/inmobiliaria/threads/xxxxxxxxxxx.xxxxxx/page-1000

Así descargará a partir de la página 1000 (incluida) hasta el final y al terminar preguntará si queremos empalmar las páginas nuevas con el documento antiguo (con PDFs grandes puede tardar un rato).

Nota: el PDF antiguo tiene que estar en la misma carpeta de salida.

Espero que sea útil.

Salu2 ;)
 
Última edición:
Volver