Crear backup en pdf de los hilos del foro

me falla en linux

Código:
Auto configuration failed

140215371532096:error:25066067:DSO support routines:DLFCN_LOAD:could not load the shared library:dso_dlfcn.c:185:filename(libssl_conf.so): libssl_conf.so: no se puede abrir el fichero del objeto compartido: No existe el fichero o el directorio

140215371532096:error:25070067:DSO support routines:DSO_load:could not load the shared library:dso_lib.c:244:

140215371532096:error:0E07506E:configuration file routines:MODULE_LOAD_DSO:error loading dso:conf_mod.c:285:module=ssl_conf, path=ssl_conf

140215371532096:error:0E076071:configuration file routines:MODULE_RUN:unknown module name:conf_mod.c:222:module=ssl_conf
Posiblemente le falten las librerias de SSL.

Mire si las tiene con:
Bash:
$ dpkg -l|grep libssl

Si no están:
Bash:
$ sudo apt install libssl1.1
 
me falla en linux

Código:
Auto configuration failed

140215371532096:error:25066067:DSO support routines:DLFCN_LOAD:could not load the shared library:dso_dlfcn.c:185:filename(libssl_conf.so): libssl_conf.so: no se puede abrir el fichero del objeto compartido: No existe el fichero o el directorio

140215371532096:error:25070067:DSO support routines:DSO_load:could not load the shared library:dso_lib.c:244:

140215371532096:error:0E07506E:configuration file routines:MODULE_LOAD_DSO:error loading dso:conf_mod.c:285:module=ssl_conf, path=ssl_conf

140215371532096:error:0E076071:configuration file routines:MODULE_RUN:unknown module name:conf_mod.c:222:module=ssl_conf

A ver si hay suerte:


Subida una versión nueva que abre todos los spoilers (pero mete un buen aviso antes en rojo y grande). También mete la URL de la página arriba del todo.

Y aqui lo dejo por falta de más tiempo. Creo que como herramienta de backup es suficiente.

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

Nota: el usuario y el pass son OPCIONALES para descargar de foros "ocultos". (Sólo hace falta ponerlos la primera vez).

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.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.9;

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 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 save_thread(url) {

    console.log('');

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

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

    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.onError = function(msg, trace) {
        return;
    }

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

    page.settings.resourceTimeout = PAGE_TIMEOUT;

    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) {

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

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

        if (statusCode >= 400) {

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

            setTimeout(function() {
                save_page(url, page, conta_page);
            }, 5000);

        } else {

            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);
                }

            });

        }

    });

}


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

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

        if (statusCode >= 400) {

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

            setTimeout(function() {
                save_page(url, page, conta_page);
            }, 5000);

        } else {

            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() {

                    $('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();

                    $('.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')
                        });
                    });

                });

                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();
                    }
                }


            }, WAITFOR_TIMEOUT, function() {
                console.log("Reintentando...");
                save_page(url, 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.

Salu2 ;)

Un super crack tu eres, no?? BRAVO MANNNN
 
A ver si hay suerte:


Subida una versión nueva que abre todos los spoilers (pero mete un buen aviso antes en rojo y grande). También mete la URL de la página arriba del todo.

Y aqui lo dejo por falta de más tiempo. Creo que como herramienta de backup es suficiente.

Salu2 ;)

Nuevamente, mis dies, o mejor mis siens.
 
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

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.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.9;

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 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 save_thread(url) {

    console.log('');

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

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

    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.onError = function(msg, trace) {
        return;
    }

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

    page.settings.resourceTimeout = PAGE_TIMEOUT;

    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) {

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

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

        if (statusCode >= 400) {

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

            setTimeout(function() {
                save_page(url, page, conta_page);
            }, 5000);

        } else {

            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);
                }

            });

        }

    });

}


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

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

        if (statusCode >= 400) {

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

            setTimeout(function() {
                save_page(url, page, conta_page);
            }, 5000);

        } else {

            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() {

                    $('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();

                    $('.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')
                        });
                    });

                });

                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();
                    }
                }


            }, WAITFOR_TIMEOUT, function() {
                console.log("Reintentando...");
                save_page(url, 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.

Salu2 ;)

Yo he descubierto hace poco The Printilimator, que es una extensión de Google Chrome para convertir una página en PDF. Es excelente, pero sólo funciona con páginas individuales:


Luego probaré tu herramienta. Gracias por hacerla.
 
A ver si hay suerte:


Subida una versión nueva que abre todos los spoilers (pero mete un buen aviso antes en rojo y grande). También mete la URL de la página arriba del todo.

Y aqui lo dejo por falta de más tiempo. Creo que como herramienta de backup es suficiente.

Salu2 ;)
funciona, muchas gracias, gran trabajo.
 
Muchas gracias por el aporte @Clorhídrico

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.11 Versión GUI: 0.7

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).

Nota2: la versión 0.4 de la GUI está bugueada y si se abre y no se descarga nada no se puede cerrar (actualizar y listo).

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.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.11";

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 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.onError = function(msg, trace) {
        return;
    }

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

    page.settings.resourceTimeout = PAGE_TIMEOUT;

    return page;

}

function save_thread(url) {

    console.log('');

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

    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() {

                    $('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();

                    $('.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')
                        });
                    });

                });

                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();
                    }
                }


            }, 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.

Salu2 ;)
 
Hay tambien un hilo sobre el particular, que se ha reactivado gracias al aporte de Clorhídrico.

Seria el sitio adecuado para colgar los backups en pdf de los jilos interesantes.

https://www.burbuja.info/inmobiliar...uerido líder-de-burbuja.1499481/post-38067669

Funciona genial...he hecho un grupo de Telegram dónde guardar los PDFs de los hilos más importantes...el que quiera enlace: MP
 
Volver