內(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空間的備份工具了。。冠骄。