使用JavaScript备份QQ空间的留言板数据
2020-10-31 18:06
183 查看
目录内容转载自我的博客
1. 目标网站
此代码是专门为了备份本人的QQ空间留言板的数据而编写的,前提是自己在浏览器登录Qzone账号,且代码只能运行在此链接
https://user.qzone.qq.com/123456789/infocenter,其中的
123456789是用户本人的qq号码,另外用户要手动点击网页的
留言板栏目,然后再运行代码。实现的功能是将每一层楼的留言数据按顺序保存
2. 保存浏览器调试窗口的变量到本地文件
编写以下代码,粘贴到控制台并回车
// 为标准console对象添加一个save函数 (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')并回车,浏览器会自动弹出下载文件窗口,并将此变量内容以
json格式保存到本地
3. 编写代码
此网站的数据如果需要备份,必须注册并登录账号
本代码假定已经登录账号的情况下,且用户已经输入链接
https://user.qzone.qq.com/123456789/infocenter,其中的
123456789是用户本人的qq号码,并手动点击网页的
留言板栏目,用户需要自己查看留言板的总页数,将它写入变量
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); // 留言的页数,将当前页面打开为留言的最新一页 var comment_page_number =77; var comment_array = new Array(); // 为标准console对象添加一个save函数 (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.download ad8 url = ['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({'发送方':source, '发送内容':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; // 暂不支持图片及表情,这些内容会显示为'' 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, '内容':content, '时间':timestamp, '回复':div_reply } comment_array.push(result); console.log(result); } // 解析某一页的结果 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_nam 15a8 ecard')[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, '内容':content, '时间':timestamp } comment_array.push(result); console.log(result); } // 解析某一页的结果 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文件部分内容示例如下,只支持文字消息的备份
[ { "用户": "张三", "链接": "http://user.qzone.qq.com/111222333", "楼层": "第310楼", "内容": "生日快乐", "时间": "2020-07-06 21:23", "回复": [ { "发送方": "我", "发送内容": "谢谢", "时间": "2019-07-06 23:24" }, { "发送方": "张三", "发送内容": "明天见", "时间": "2019-07-06 23:26" }, { "发送方": "我", "发送内容": "哈哈,回见", "时间": "2019-07-06 23:30" } ] }, { "用户": "李四", "链接": "http://user.qzone.qq.com/123412345", "楼层": "第309楼", "内容": "新年快乐", "时间": "2020-02-01 17:44", "回复": [ { "发送方": "我", "发送内容": "谢谢,同乐", "时间": "2020-02-01 23:24" } ] }, { "用户": "王五", "链接": "http://user.qzone.qq.com/666777888", "楼层": "第308楼", "内容": "加油!!!!", "时间": "2019-06-06 00:21", "回复": [ { "发送方": "我", "发送内容": "共勉", "时间": "2019-06-06 17:05" } ] }, // 以下内容省略 ]
5. 后记
当我完成之后,发现github已经有整个QQ空间的备份工具了。。。
相关文章推荐
- JavaScript在页面间数据传输的使用
- 详解MySQL数据备份之mysqldump使用方法
- 17个使用AJAX技术的数据表格控件解决方案(Data Grids with AJAX, DHTML and JavaScript)
- JavaScript在页面间数据传输的使用
- [译]使用JavaScript来操纵数据视图DataView新建视图的默认值
- 实现JSP数据和JavaScript数据交互使用
- 使用Arkeia Smart Backup备份中小Linux服务器数据
- 利用javascript实现可视化数据备份[原创]
- 使用dwr进行数据检索的javascript
- QED数据库使用笔记之备份数据
- 使用JavaScript访问XML数据
- 在SQL Server 2005中使用OUTPUT完成数据操作时的备份
- 使用winrar来自动备份domino服务器数据
- Allway Sync--同步备份数据资料,简单介绍及使用经验分享
- 数据备份使用的SQL语句
- 使用JavaScript访问XML数据
- Ajax.net使得服务器端的数据模型能够被javascript所使用
- 如何使用JavaScript和正则表达式进行数据验证
- javascript使用xml 数据岛 简单实例
- JSP数据和JavaScript数据交互使用