Crear backup en PDF de los hilos del foro

Clorhídrico

Madmaxista
Desde
1 Ene 2018
Mensajes
4.001
Reputación
13.838
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.
Screenshot_20220723_173210.png
909852786_1357508933.png
Versión script: 0.72 Versión GUI: 0.59

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

Para incluir en el PDF los frames (por ejemplo los tweets insertados) es necesario usar el FRAMESHOOTER. Para ello, hay que ejecutar previamente un contenedor de DOCKER y usarlo desde Burbudump

Instalar Docker:

(Los que uséis Linux doy por hecho que sabéis instalar y usar Docker)

Para lanzar el contenedor Docker:
Código:
docker run -d -p 4444:4444 -p 7900:7900 -e SE_NODE_SESSION_TIMEOUT=15 -e SE_SESSION_REQUEST_TIMEOUT=15 -e SE_SESSION_RETRY_INTERVAL=2 -e SE_NODE_MAX_SESSIONS=6 selenium/standalone-chrome

Nota: SE_NODE_MAX_SESSIONS poned como mucho el número de núcleos de la CPU menos 2

EXTRA: La IP del contenedor de Selenium viene ya metida en Burbudump, pero si por lo que fuera en tu equipo esa IP fuera diferente, para averiguarla y poder usarla en Burbudump:
Screenshot_20220301_193406.png


AVISO: si os descargáis algún tema utilizando vuestra cuenta del foro, recordad que las respuestas de vuestros ignorados no saldrán en el PDF.
(Un truco para evitar esto y poder ver foros ocultos es crearse una cuenta de palo en el foro para utilizar con el burbudump que no tenga ignorados).


--------------------------------
REPOSITORIO PRIVADO NO OFICIAL DE HILOS DE BURBUJA (TELEGRAM)
(Nota: yo no soy administrador)

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

Salu2 ;)
 
Última edición:
Lo estoy probando y funciona huevonudamente bién.
P.D.: P'a estas cosas no hace falta un puñetero gui

Gracias por el esfuerzo.
 
¡HOSTIES! Mis plegarias han sido descuchadas...

Llevo años buscando algo que funcione para guardar jilos completos.

Minolles de gracias, conflorero. A sus pieses. nosomosdignos:

¿ Si no es mucho pedir, podria hacerse para guardar los jilos completos en html y navegables?
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

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

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

                setTimeout(function(){
                    console.log(statusCode+" Reintentando (5s)...");
                    login(url, page, p, one_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) {

                setTimeout(function(){
                    console.log(statusCode+" Reintentando (5s)...");
                    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() {

                $('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 ;)
 
¡HOSTIES! Mis plegarias han sido descuchadas...

Llevo años buscando algo que funcione para guardar jilos completos.

Minolles de gracias, conflorero. A sus pieses. nosomosdignos:

¿ Si no es mucho pedir, podria hacerse para guardar los jilos completos en html y navegables?

Hola. Por poder se podría pero hay que añadir bastantes cosas y ya se me ha ido más tiempo del previsto con esto. Lo dejo en cosas pendientes.

Salu2 ;)
 
Con hilos tochos como los del randiano parece que no funciona:


¿Es algo que esté haciendo mal o tiene algún límite?

Muchas gracias por el currelo

Edito: Como sugerencia si se puede añadir la url de la página en el fichero generado podría estar bien.
 
Última edición:
Con hilos tochos como los del randiano parece que no funciona:


¿Es algo que esté haciendo mal o tiene algún límite?

Muchas gracias por el currelo

Edito: Como sugerencia si se puede añadir la url de la página en el fichero generado podría estar bien.

Hola. Pues acabo de probar y sin problema:
Screenshot_20211207_123828.png

¿Te da algún error?

Edito: Como sugerencia si se puede añadir la url de la página en el fichero generado podría estar bien.

Lo miraré, eso es sencillo.
 
Hola. Pues acabo de probar y sin problema:

¿Te da algún error?

Edito: Como sugerencia si se puede añadir la url de la página en el fichero generado podría estar bien.
Lo miraré, eso es sencillo.

Me genera el fichero, pero casi sin contenido y con zonas en blanco. He probado con varios de los grandes y lo mismo.
Y al abrirlos con el adobe reader (y con word) me dice que el tamaño de página excede el máximo.

¿A tí te genera un pdf completo por ejemplo de ese hilo de randiano?
 
Me genera el fichero, pero casi sin contenido y con zonas en blanco. He probado con varios de los grandes y lo mismo.
Y al abrirlos con el adobe reader (y con word) me dice que el tamaño de página excede el máximo.

¿A tí te genera un pdf completo por ejemplo de ese hilo de randiano?
Sí, me lo genera completo

Qué raro... ¿Estás en Windows?
 
Lo mismo tengo algún problema en mi pc, porque al abrir tu fichero me da el mismo aviso y no muestra bien la primera página:

1638878414822.png
 
Sí, me lo genera completo

Qué raro... ¿Estás en Windows?

Mira, la ejecución de ese mismo hilo de randiano se me corta en la primera página:

1638879508645.png
 
El Acrobat no abre bien ese fichero. He probado con el Edge y va bien.

Que sólo te guarde la primera página, qué raro, no lo entiendo la verdad. Debe de ser que detecta que ha llegado al final, podría ser algún tema de timeout por saturación. ¿Sólo te pasa en ese hilo?
 
Volver