使用JavaScript備份QQ空間的留言板數(shù)據(jù)

內(nèi)容轉(zhuǎn)載自我的博客

1. 目標網(wǎng)站

此代碼是專門為了備份本人的QQ空間留言板的數(shù)據(jù)而編寫的,前提是自己在瀏覽器登錄Qzone賬號玫芦,且代碼只能運行在此鏈接https://user.qzone.qq.com/123456789/infocenter,其中的123456789是用戶本人的qq號碼,另外用戶要手動點擊網(wǎng)頁的留言板欄目,然后再運行代碼。實現(xiàn)的功能是將每一層樓的留言數(shù)據(jù)按順序保存

2. 保存瀏覽器調(diào)試窗口的變量到本地文件

編寫以下代碼嫁乘,粘貼到控制臺并回車

// 為標準console對象添加一個save函數(shù)
(function(console){
    console.save = function(data, filename){
        // 若data為空則提示用戶
        if(!data) {
            console.error('Console.save: No data');
            return;
        }
        // 默認文件名
        if(!filename){
            filename = 'console.json';
        }
        if(typeof data === "object"){
            data = JSON.stringify(data, undefined, 4);
        }
        var blob = new Blob([data], {type: 'text/json'}),
        e = document.createEvent('MouseEvents'),
        a = document.createElement('a');
        a.download = filename;
        a.href = window.URL.createObjectURL(blob);
        a.dataset.downloadurl = ['text/json', a.download, a.href].join(':');
        e.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
        a.dispatchEvent(e);
    }
})(console)

然后可以在控制臺輸入console.save(var_imgs, 'imgs.json')并回車,瀏覽器會自動彈出下載文件窗口球碉,并將此變量內(nèi)容以json格式保存到本地

3. 編寫代碼

此網(wǎng)站的數(shù)據(jù)如果需要備份蜓斧,必須注冊并登錄賬號
本代碼假定已經(jīng)登錄賬號的情況下,且用戶已經(jīng)輸入鏈接https://user.qzone.qq.com/123456789/infocenter睁冬,其中的123456789是用戶本人的qq號碼挎春,并手動點擊網(wǎng)頁的留言板欄目,用戶需要自己查看留言板的總頁數(shù)豆拨,將它寫入變量comment_page_number直奋,然后粘貼并運行代碼即可

// 保證F12后的console處選中tgb(msgbcanvas.html)而不是top,否則會出錯

// var comment_page_div = document.getElementsByClassName("mod_pagenav_count")[1].getElementsByTagName('a');
// var comment_page_number = parseInt(comment_page_div[comment_page_div.length-1].textContent);
// 留言的頁數(shù)施禾,將當前頁面打開為留言的最新一頁
var comment_page_number =77;
var comment_array = new Array();
// 為標準console對象添加一個save函數(shù)
(function(console){
    console.save = function(data, filename){
        if(!data) {
            console.error('Console.save: No data');
            return;
        }
        if(!filename){
            filename = 'console.json';
        }
        if(typeof data === "object"){
            data = JSON.stringify(data, undefined, 4);
        }
        var blob = new Blob([data], {type: 'text/json'}),
        e = document.createEvent('MouseEvents'),
        a = document.createElement('a');
        a.download = filename;
        a.href = window.URL.createObjectURL(blob);
        a.dataset.downloadurl = ['text/json', a.download, a.href].join(':');
        e.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
        a.dispatchEvent(e);
    }
})(console)

// 解析回復部分
function parse_reply(ol_reply) {
    var result = [];
    if(ol_reply.textContent==''){
        return [];
    }
    var content, timestamp, source;
    for(var i=0;i<ol_reply.childElementCount;i++){
        li_reply = ol_reply.childNodes[i];
        info = li_reply.firstElementChild.lastElementChild;
        source = info.firstElementChild.firstElementChild.textContent;
        content = info.firstElementChild.textContent.substring(source.length+1);
        timestamp = info.lastElementChild.firstElementChild.textContent;
        result.push({'發(fā)送方':source, '發(fā)送內(nèi)容':content, '時間':timestamp});
    }
    return result;
}

// 解析某條評論
function parse_comment(comment_item) {
    var div_inner = comment_item.firstElementChild.lastElementChild.firstElementChild.firstElementChild;
    var span_user = div_inner.childNodes[0].firstElementChild.firstElementChild.firstElementChild;
    var username = span_user.textContent;
    var userlink = span_user.href;
    var floor_index = div_inner.childNodes[0].childNodes[1].textContent;
    // 暫不支持圖片及表情帮碰,這些內(nèi)容會顯示為''
    var content = div_inner.childNodes[2].firstElementChild.textContent;
    var div_reply = parse_reply(div_inner.childNodes[4].lastElementChild.childNodes[2]);
    var timestamp = div_inner.childNodes[2].lastElementChild.firstElementChild.textContent;
    var result = {
        '用戶':username, '鏈接':userlink, '樓層':floor_index,
        '內(nèi)容':content, '時間':timestamp, '回復':div_reply
    }
    comment_array.push(result);
    console.log(result);
}

// 解析某一頁的結(jié)果
function parse_single() {
    var comments = document.getElementById("ulCommentList");
    for(var i=0;i<comments.childElementCount;i++){
        parse_comment(comments.childNodes[i]);
    }
}

function control_page(index) {
    if(index>=comment_page_number){
        console.save(comment_array, '評論.json');
        return;
    }
    // 解析當前頁面
    parse_single();
    // -1表示上一頁,1表示下一頁
    QZBlog.Util.PageIndexManager.goPage(1);
    // QZBlog.Util.PageIndexManager.goDirectPage(77)
    index = index + 1;
    setTimeout(control_page, 5000, index);
}


setTimeout(control_page, 5000, 0);

/*
// 解析某條評論
function parse_comment_bk(comment_item) {
    var inner_item = comment_item.getElementsByClassName('inner')[0];
    var username = inner_item.getElementsByClassName('c_tx q_namecard')[0].textContent;
    var userlink = inner_item.getElementsByClassName('c_tx q_namecard')[0].href;
    var floor_index = inner_item.getElementsByClassName('c_tx3 floor')[0].textContent;
    // var mobile_cp = inner_item.getElementsByClassName('c_tx3 unline')[0].textContent;
    var content = inner_item.getElementsByTagName("table")[0].textContent;
    var timestamp = inner_item.getElementsByClassName('c_tx3 mode_post')[1].textContent;
    var result = {
        '用戶':username, '鏈接':userlink, '樓層':floor_index,
        '內(nèi)容':content, '時間':timestamp
    }
    comment_array.push(result);
    console.log(result);
}

// 解析某一頁的結(jié)果
function parse_single_bk() {
    var comments = document.getElementById("ulCommentList").getElementsByTagName("li");
    for(var i=0;i<document.getElementById("ulCommentList").length;i++){
        parse_comment(comments[i]);
    }
}
*/

4. 備份完成

最后的json文件部分內(nèi)容示例如下拾积,只支持文字消息的備份

[
    {
        "用戶": "張三",
        "鏈接": "http://user.qzone.qq.com/111222333",
        "樓層": "第310樓",
        "內(nèi)容": "生日快樂",
        "時間": "2020-07-06 21:23",
        "回復": [
            {
                "發(fā)送方": "我",
                "發(fā)送內(nèi)容": "謝謝",
                "時間": "2019-07-06 23:24"
            },
            {
                "發(fā)送方": "張三",
                "發(fā)送內(nèi)容": "明天見",
                "時間": "2019-07-06 23:26"
            },
            {
                "發(fā)送方": "我",
                "發(fā)送內(nèi)容": "哈哈殉挽,回見",
                "時間": "2019-07-06 23:30"
            }
        ]
    },
    {
        "用戶": "李四",
        "鏈接": "http://user.qzone.qq.com/123412345",
        "樓層": "第309樓",
        "內(nèi)容": "新年快樂",
        "時間": "2020-02-01 17:44",
        "回復": [
            {
                "發(fā)送方": "我",
                "發(fā)送內(nèi)容": "謝謝,同樂",
                "時間": "2020-02-01 23:24"
            }
        ]
    },
    {
        "用戶": "王五",
        "鏈接": "http://user.qzone.qq.com/666777888",
        "樓層": "第308樓",
        "內(nèi)容": "加油M厍伞K孤怠!肛度!",
        "時間": "2019-06-06 00:21",
        "回復": [
            {
                "發(fā)送方": "我",
                "發(fā)送內(nèi)容": "共勉",
                "時間": "2019-06-06 17:05"
            }
        ]
    },
    // 以下內(nèi)容省略
]

5. 后記

當我完成之后傻唾,發(fā)現(xiàn)github已經(jīng)有整個QQ空間的備份工具了。。冠骄。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末伪煤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子凛辣,更是在濱河造成了極大的恐慌抱既,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扁誓,死亡現(xiàn)場離奇詭異防泵,居然都是意外死亡,警方通過查閱死者的電腦和手機蝗敢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門捷泞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人寿谴,你說我怎么就攤上這事锁右。” “怎么了讶泰?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵咏瑟,是天一觀的道長。 經(jīng)常有香客問我峻厚,道長响蕴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任惠桃,我火速辦了婚禮浦夷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘辜王。我一直安慰自己劈狐,他們只是感情好,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布呐馆。 她就那樣靜靜地躺著肥缔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪汹来。 梳的紋絲不亂的頭發(fā)上续膳,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機與錄音收班,去河邊找鬼坟岔。 笑死,一個胖子當著我的面吹牛摔桦,可吹牛的內(nèi)容都是我干的社付。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鸥咖!你這毒婦竟也來了燕鸽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤啼辣,失蹤者是張志新(化名)和其女友劉穎啊研,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體熙兔,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡悲伶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年艾恼,在試婚紗的時候發(fā)現(xiàn)自己被綠了住涉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡钠绍,死狀恐怖舆声,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情柳爽,我是刑警寧澤媳握,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站磷脯,受9級特大地震影響蛾找,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜赵誓,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一打毛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧俩功,春花似錦幻枉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蔓罚,卻和暖如春椿肩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背豺谈。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工郑象, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人核无。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓扣唱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子噪沙,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354