Tumblr Message Archiver

Archives the messages

// ==UserScript==
// @name         Tumblr Message Archiver
// @namespace    https://github.com/chris-pie/tumblr-message-archiver
// @version      2.2
// @description  Archives the messages
// @author       Chris Pie
// @match        https://www.tumblr.com/message_archiver
// @grant        GM_xmlhttpRequest
// @grant        GM_log
// @require      https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js

// ==/UserScript==

(function() {
    'use strict';
    function timeConverter(UNIX_timestamp){
        var a = new Date(UNIX_timestamp * 1000);
        var months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
        var year = a.getFullYear();
        var month = months[a.getMonth()];
        var date = a.getDate();
        var hour = a.getHours() < 10 ? '0' + a.getHours() : a.getHours();
        var min = a.getMinutes() < 10 ? '0' + a.getMinutes() : a.getMinutes();
        var sec = a.getSeconds() < 10 ? '0' + a.getSeconds() : a.getSeconds();
        var time = date + ' ' + month + ' ' + year + ' ' + hour + ':' + min + ':' + sec ;
        return time;
    }
    $("head").text("");
    $("body").text("").append('<p id="error"></p>').append('<p id="counter"></p>');
    var tumblog_mine = prompt("Enter YOUR blog name (without .tumblr.com)");
    var tumblog_other = prompt("Enter THE OTHER BLOG'S name (without .tumblr.com)");

    var convo_id ="";
    var messages_list = [];
    var done_gathering_messages = false;
    function get_messages(convo_id)
    {
        var waiting = false;
        var url = "/svc/conversations/messages?conversation_id="+convo_id;
        var repeater;
        var repeat_counter = 0;
        var message_counter = 0;
        function get_messages_http()
        {
            if(waiting && repeat_counter < 300)
            {
                if(repeat_counter == 150)
                    $("#error").text("Tumblr seems to not be responding. Retrying in few seconds. (onrepeat)");
                repeat_counter++;
                return;
            }
            waiting = true;
            repeat_counter = 0;
            GM_xmlhttpRequest({
                method: "GET",
                url: "https://www.tumblr.com"+url,
                headers: {
                    "Connection": "keep-alive",
                    "Accept": "application/json, text/javascript, */*; q=0.01",
                    "X-Requested-With": "XMLHttpRequest",
                    "Referer": "https://www.tumblr.com/dashboard",
                    "Accept-Encoding": "gzip, deflate, br",
                },
                onerror: function()
                {
                    $("#error").text("Tumblr seems to not be responding. Retrying in few seconds. (onerror)");
                    waiting = false;
                    return;
                },
                timeout: 5000,
                ontimeout: function()
                {
                    $("#error").text("Tumblr seems to not be responding. Retrying in few seconds. (ontimeout)");
                    waiting = false;
                    return;
                },
                onload: function(response)
                {
                    $("#error").text("");
                    try
                    {
                        if (response.status !== 200)
                        {
                            waiting = false;
                            return;
                        }
                        var parsed_response = JSON.parse(response.responseText);
                        var messages = parsed_response.response.messages;
                        for (var i = messages.data.length - 1; i>=0;i--)
                        {
                            var currmessage;
                            if(messages.data[i].type === "TEXT")
                            {
                                currmessage = timeConverter(messages.data[i].ts.substr(0,10)) + ' ' + messages.data[i].participant + ': ' + messages.data[i].message;
                            }
                            else if (messages.data[i].type === "POSTREF")
                            {
                                currmessage = timeConverter(messages.data[i].ts.substr(0,10)) + ' ' + messages.data[i].participant + ': ' + messages.data[i].post.post_url;
                            }
                            else if (messages.data[i].type === "IMAGE")
                            {
                                var image_links = "";
                                for (var j = 0; j < messages.data[i].images.length; j++)
                                {
                                    image_links = image_links + ' ' + messages.data[i].images[j].original_size.url;
                                }
                                currmessage = timeConverter(messages.data[i].ts.substr(0,10)) + ' ' + messages.data[i].participant + ': ' + image_links;
                            }
                            message_counter++;
                            $("#counter").text("Gathered " + message_counter + " messages.");
                            $("#counter").after(currmessage + "<br/>");
                        }
                        if (parsed_response.response.messages._links === undefined)
                        {
                            clearInterval(repeater);
                            waiting = false;
                            $("#counter").text($("#counter").text() + " Archiving complete. Press ctrl+a to select all, then ctrl+c to copy. Paste to notepad and save.");
                            return;
                        }
                        else url = parsed_response.response.messages._links.next.href;
                        waiting = false;
                    }
                    catch(e)
                    {
                        $("#error").text(e.name + e.message);
                    }
                }
            });
        }
        repeater = setInterval(get_messages_http, 20);
    }
    function begin_archiving(tumblog_this, tumblog_remote)
    {
        var waiting = false;
        var url = "/svc/conversations?participant="+tumblog_this+".tumblr.com";
        var repeater;

        function get_conversations()
        {
            if(waiting) return;
            waiting = true;
            GM_xmlhttpRequest({
                method: "GET",
                url: "https://www.tumblr.com"+url,
                headers: {
                    "Connection": "keep-alive",
                    "Accept": "application/json, text/javascript, */*; q=0.01",
                    "X-Requested-With": "XMLHttpRequest",
                    "Referer": "https://www.tumblr.com/dashboard",
                    "Accept-Encoding": "gzip, deflate, br",
                },
                onload: function(response)
                {
                    var parsed_response = JSON.parse(response.responseText);
                    for(var i = 0; i < parsed_response.response.conversations.length; i++)
                    {
                        for(var j = 0; j < parsed_response.response.conversations[i].participants.length; j++)
                        {
                            if (parsed_response.response.conversations[i].participants[j].name === tumblog_remote)
                            {
                                convo_id =  parsed_response.response.conversations[i].id;
                                waiting = false;
                                clearInterval(repeater);
                                return;
                            }

                        }
                    }
                    if (parsed_response.response._links === undefined)
                    {
                        convo_id = "error";
                        clearInterval(repeater);
                        waiting = false;
                        return;
                    }
                    else url = parsed_response.response._links.next.href;
                    waiting = false;
                }
            });
        }
        repeater = setInterval(get_conversations, 200);
    }
    begin_archiving(tumblog_mine, tumblog_other);
    var repeater;
    repeater = setInterval(function() {
        if (convo_id !== "")
        {
            clearInterval(repeater);
            get_messages(convo_id);
        }
    }, 200);

})();