1、Images文件名称统一调整为小写的images

2、调整详情列表默认值
3、修复从未全量备份,自定义时间不生效问题
4、修复分享那年今日渲染错误问题
5、浏览器支持下载视频,不用切换其它下载工具
6、修复新版高清图可下载,老版高清图无法下载问题
7、更换助手内部CDN或部分CDN切换离线地址,避免CDN不稳定造成助手无法使用,备份内容仍使用在线CDN,可自行切换离线CDN
8、纯文件备份,无需要打包下载时,无【下载管理】问题,导致无法重试失败条目问题
9、相册、视频导出,支持指定相片名称合成规则
10、优化识别后缀失败但文件名有点的问题
11、修复全部模块备份时,相册、视频模块为文件时,不出现打包下载按钮问题
12、修复增量备份为上次备份时,不生效问题
13、微信朋友圈同步到QQ空间的说说添加朋友圈标识
14、微信朋友圈同步到QQ空间的说说支持转换GPS坐标到火星坐标系(需在开发者维护腾讯地图WebKey)
15、微信朋友圈同步到QQ空间的说说支持修正坐标信息描述(需在开发者维护腾讯地图WebKey)
16、修复导出QQ好友到Excel,昵称与备注相反的问题

Signed-off-by: lvshuncai <lvshuncai@gmail.com>
dev
lvshuncai 2 years ago
parent b3b6dea8b0
commit f09a483594
  1. 123
      README.md
  2. 3
      src/export/js/boards.js
  3. 20
      src/export/js/common.js
  4. 8
      src/html/about.html
  5. 1
      src/html/indicator.html
  6. 144
      src/html/options.html
  7. 24
      src/html/tools.html
  8. 141
      src/js/api.js
  9. 135
      src/js/background.js
  10. 42
      src/js/config.js
  11. 10
      src/js/content.js
  12. 16
      src/js/modules/blogs.js
  13. 8
      src/js/modules/boards.js
  14. 75
      src/js/modules/common.js
  15. 12
      src/js/modules/diaries.js
  16. 6
      src/js/modules/favorites.js
  17. 2
      src/js/modules/friends.js
  18. 77
      src/js/modules/messages.js
  19. 166
      src/js/modules/photos.js
  20. 8
      src/js/modules/shares.js
  21. 45
      src/js/modules/videos.js
  22. 2
      src/js/modules/visitors.js
  23. 91
      src/js/options.js
  24. 5
      src/manifest.json
  25. 12
      src/templates/albums.html
  26. 32
      src/templates/bloginfo.html
  27. 30
      src/templates/bloginfo_static.html
  28. 18
      src/templates/blogs.html
  29. 30
      src/templates/boards.html
  30. 18
      src/templates/diaries.html
  31. 32
      src/templates/diaryinfo.html
  32. 30
      src/templates/diaryinfo_static.html
  33. 34
      src/templates/favorites.html
  34. 22
      src/templates/friends.html
  35. 8
      src/templates/index.html
  36. 55
      src/templates/messages.html
  37. 42
      src/templates/photos.html
  38. 36
      src/templates/shares.html
  39. 40
      src/templates/videos.html
  40. 20
      src/templates/visitors.html
  41. 18
      src/vendor/jquery-resizable-columns/css/jquery.resizableColumns.css
  42. 9
      src/vendor/jquery-resizable-columns/js/jquery.resizableColumns.min.js
  43. 40
      src/vendor/loadmask/css/jquery.loadmask.css
  44. 273
      src/vendor/loadmask/js/jquery.loadmask.js
  45. 487
      src/vendor/template/template.js
  46. 7
      src/vendor/x-editable-4-bs4/js/bootstrap-editable.min.js

@ -7,24 +7,27 @@
落叶随风,青春,稍纵即逝,QQ空间,一个承载了很多人的青春的地方。
或许,是遗憾,毕竟,谁的青春没留遗憾呢,[《曾经沧海无限感慨,唯愿往事随风》](https://user.qzone.qq.com/20050606/blog/1559786793)。
[![我是往事随风。你好,我是轻舞飞扬。](https://s1.ax1x.com/2020/05/16/YcekPP.gif)](https://v.qq.com/x/page/f08719wqfd0.html)
或许,是害怕,曾经的青春变得不可控,毕竟,博客相册、网易相册、腾讯微博等相继停运,无不意味着,互联网产品都有着自己的生命周期。
或许,是害怕,曾经的青春变得不可控,毕竟,新浪博客相册、网易相册、腾讯微博等相继停运,无不意味着,互联网产品都有着自己的生命周期。
于是,萌生了备份QQ空间的念头,也在互联网上找到一些工具与脚本,要么操作复杂、要么备份类型单一,于是乎,简单易用全类型备份的QQ空间导出助手诞生了。
[![我是往事随风。你好,我是轻舞飞扬。](https://s1.ax1x.com/2020/05/16/YcekPP.gif)](https://v.qq.com/x/page/f08719wqfd0.html)
# 功能清单
- 支持备份QQ空间文字说说、图文说说、语音说说、长说说,以及评论、点赞、最近访问
- 支持备份QQ空间文字日志、图文日志、模板日志,以及评论、点赞、最近访问
- 支持备份QQ空间文字私密日记、图文私密日记,以及评论、点赞、最近访问
- 支持备份QQ空间相册/相片,以及相册/相片的评论、相册/相片的点赞、相册的最近访问
- 支持备份QQ空间视频,以及评论、点赞、最近访问
- 支持备份QQ空间留言板的寄语与留言、以及留言回复
- 支持备份QQ好友、含好友成立时间、单向好友检测、空间访问权限检测、特别关心的好友等
- 支持备份QQ空间分享内容,以及评论、点赞、最近访问
- 支持备份QQ空间收藏夹内容
- 支持备份QQ空间访客
1. 支持备份QQ空间文字说说、图文说说、语音说说、长说说,以及评论、点赞、最近访问
2. 支持备份QQ空间文字日志、图文日志、模板日志,以及评论、点赞、最近访问
3. 支持备份QQ空间文字私密日记、图文私密日记,以及评论、点赞、最近访问
4. 支持备份QQ空间相册/相片,以及相册/相片的评论、相册/相片的点赞、相册的最近访问
5. 支持备份QQ空间视频,以及评论、点赞、最近访问
6. 支持备份QQ空间留言板寄语与留言、以及留言回复
7. 支持备份QQ好友、含好友成立时间、单向好友检测、空间访问权限检测、特别关心的好友等
8. 支持备份QQ空间分享内容,以及评论、点赞、最近访问
9. 支持备份QQ空间收藏夹内容
10. 支持备份QQ空间访客,仅支持备份谁访问了我,非全部备份,备份内容的多少,看是不是黄钻
# 视频教程
去[bilibili查看](https://www.bilibili.com/video/BV16r4y1x7hP?zw)
> 非原创,来源于助手用户[阿博特-安稳](https://space.bilibili.com/36411485)投稿
## 安装
#### 在线安装
@ -35,24 +38,15 @@
- 其他[Chromium内核浏览器](https://baidu.lvshuncai.com/?q=Q2hyb21pdW3lhoXmoLjmtY/op4jlmag=)请移步->[离线安装](#离线安装)。
#### 离线安装
##### 方式①:源码安装
1. [下载源码Zip包](https://github.com/ShunCai/QZoneExport/releases/latest)
1. [下载助手源码Zip包](https://github.com/ShunCai/QZoneExport/releases/latest)
2. 解压源码Zip包
3. 打开【浏览器扩展管理】
4. 打开【开发者模式】
5. 点击【加载已解压的扩展程序】按钮
3. 打开**浏览器扩展管理**
4. 打开**开发者模式**
5. 点击**加载已解压的扩展程序**按钮
6. 选择源码包(ZIP)的解压文件夹
7. 安装完成
8. 更多问题点击[这里](https://baidu.lvshuncai.com/?q=Q2hyb21lIOWuieijhSDnprvnur/lronoo4Ug5omp5bGVIENSWA==)
##### 方式②:CRX安装
1. [下载CRX包](https://github.com/ShunCai/QZoneExport/releases/latest)
2. 打开【浏览器扩展管理】
3. 打开【开发者模式】
4. 拖拽下载好的CRX包到扩展中
5. 安装完成
6. 更多问题点击[这里](https://baidu.lvshuncai.com/?q=Q2hyb21lIOWuieijhSDnprvnur/lronoo4Ug5omp5bGVIENSWA==)
#### 版本要求
- Chromium内核版本70以上
- 理论上基于Chromium内核版本的浏览器均可正常使用
@ -63,31 +57,66 @@
- [点击这里查看当前浏览器内核版本](https://liulanmi.com/labs/core.html)
## 使用说明
1. 进行助手的安装,参考[在线安装](#在线安装)或[离线安装](#离线安装)进行助手安装
2. 助手安装完成后,可进行助手的配置,可参考[配置说明](https://lvshuncai.com/archives/qzone-export.html#配置说明)
3. 助手配置完成后,先登录自己的[QQ空间](https://i.qq.com/)
4. 进入需要备份的QQ空间,如若备份自己的[QQ空间](https://i.qq.com/),可跳过
5. 刷新QQ空间使助手配置生效,如若是保存配置后再打开的QQ空间页面,可跳过
6. 插件栏点击插件图标
1. 如若首次使用,**建议先使用小号进行备份**,熟悉流程后,再使用大号进行备份,避免浪费不必要的时间。
2. 先进行助手安装,更多详情请移步[在线安装](#在线安装)或[离线安装](#离线安装)
3. 安装完成后,**可以先根据**个人情况进行助手的配置,更多详情请移步[配置说明](#配置说明)
4. 接下来,请先**登录QQ空间**,**登录QQ空间**,**登录QQ空间**
5. 然后,**进入需要备份的QQ空间**、**进入需要备份的QQ空间**、**进入需要备份的QQ空间**,若只备份自己的QQ空间,该步骤*可跳过*
> 拜托,别再问我怎么备份QQ好友的空间内容了
6. 备份前,**刷新备份的QQ空间页面**使助手的配置**生效**,如果是保存配置后再打开的QQ空间页面,该步骤*可跳过*
7. 在需要备份的QQ空间页面,插件栏点击插件图标进行备份,如果点击图标无反映请移步[这里](#点击助手图标无反应)
[![75EXvj.png](https://s4.ax1x.com/2022/01/23/75EXvj.png)](https://imgtu.com/i/75EXvj)
7. 选择要备份的QQ空间内容,点击【开始备份】
8. 选择要备份的QQ空间内容,建议全部备份,点击**开始备份**
[![7TIqG8.png](https://s4.ax1x.com/2022/01/24/7TIqG8.png)](https://imgtu.com/i/7TIqG8)
8. 助手将开始收集QQ空间的数据,请耐心等待数据收集完成
9. 助手将开始收集QQ空间的数据,**请耐心等待数据收集完成**
[![75eUC8.png](https://s4.ax1x.com/2022/01/23/75eUC8.png)](https://imgtu.com/i/75eUC8)
9. 采集完成后,助手自动添加[多媒体文件](https://lvshuncai.com/archives/qzone-export.html#多媒体文件)的下载任务到[文件下载工具](https://lvshuncai.com/archives/qzone-export.html#文件下载工具)
10. QQ空间数据采集完成后,助手自行添加[多媒体文件](#多媒体文件)的下载任务到[文件下载工具](#文件下载工具)
[![75mZrj.png](https://s4.ax1x.com/2022/01/23/75mZrj.png)](https://imgtu.com/i/75mZrj)
10. 下载任务添加完成后,备份界面下方将出现【打包下载】按钮
[![75mbes.png](https://s4.ax1x.com/2022/01/23/75mbes.png)](https://imgtu.com/i/75mbes)
11. 点击【打包下载】按钮时,助手自动打包[文案内容](https://lvshuncai.com/archives/qzone-export.html#文案内容)到ZIP包中并下载ZIP包
[![75nAFx.png](https://s4.ax1x.com/2022/01/23/75nAFx.png)](https://imgtu.com/i/75nAFx)
12. ZIP包下载完成后,点击【查看备份】按钮查看ZIP包,或自行打开[文案内容下载文件夹](https://lvshuncai.com/archives/qzone-export.html#文案内容下载文件夹)查看[备份压缩包](https://lvshuncai.com/archives/qzone-export.html#备份压缩包)
[![75neSO.png](https://s4.ax1x.com/2022/01/23/75neSO.png)](https://imgtu.com/i/75neSO)
13. 再进行[文案内容备份文件夹](https://lvshuncai.com/archives/qzone-export.html#文案内容备份文件夹)与[多媒体文件备份文件夹](https://lvshuncai.com/archives/qzone-export.html#多媒体文件备份文件夹)进行合并,详情参考:[备份文件夹合并](https://lvshuncai.com/archives/qzone-export.html#备份文件夹合并)
14. 合并完成后,根据备份类型的不同,自行[查看备份内容](https://lvshuncai.com/archives/qzone-export.html#查看备份内容)
[![7T4kxH.png](https://s4.ax1x.com/2022/01/24/7T4kxH.png)](https://imgtu.com/i/7T4kxH)
15. [点击这里查看更多说明](https://lvshuncai.com/archives/qzone-export.html#使用说明)
## 常见问题
11. **如若不涉及文案内容的下载,助手的备份任务到此已完成**,剩下的请耐心等待[文件下载工具](#文件下载工具)把[多媒体文件](#多媒体文件)的下载任务完成,然后[查看备份内容](#查看备份内容)即可,更多内容移步[打包下载](#打包下载)
12. **如若涉及文案内容的下载**,[文件下载工具](#文件下载工具)的下载任务添加完成后,备份界面下方将出现**打包下载**按钮,更多内容移步[打包下载](#打包下载)
[![75mbes.png](https://s4.ax1x.com/2022/01/23/75mbes.png)](https://imgtu.com/i/75mbes)
11. 点击**打包下载**按钮时,助手自动打包[文案内容](#文案内容)到[备份压缩包](#备份压缩包)并下载
[![75nAFx.png](https://s4.ax1x.com/2022/01/23/75nAFx.png)](https://imgtu.com/i/75nAFx)
12. [备份压缩包](#备份压缩包)下载完成后,点击**查看备份**按钮查看[备份压缩包](#备份压缩包),点击**查看备份**按钮无法查看时,可自行打开[文案内容下载文件夹](#文案内容下载文件夹)查看
[![75neSO.png](https://s4.ax1x.com/2022/01/23/75neSO.png)](https://imgtu.com/i/75neSO)
13. 解压压缩包,建议解压时,选择解压到当前文件夹,而不是解压到**QQ空间备份_QQ号**,这样的话,当文件下载工具为浏览器下载时,则无需进行额外的[备份文件夹合并](#备份文件夹合并),解压的动作就是合并的过程。
14. 再进行[文案内容备份文件夹](#文案内容备份文件夹)与[多媒体文件备份文件夹](#多媒体文件备份文件夹)的合并,详情移步[备份文件夹合并](#备份文件夹合并)
15. 合并完成后,根据备份类型的不同,自行[查看备份内容](#查看备份内容)
[![7T4kxH.png](https://s4.ax1x.com/2022/01/24/7T4kxH.png)](https://imgtu.com/i/7T4kxH)
16. 完整备份文件夹结构,如果结构不对,表示合并错误,比如会导致备份内容无法查看配图
``` folder QQ空间备份_QQ号
├─Albums // 相册模块文件夹
│ ├─Images // 主要放相册的预览图,来源于[多媒体文件备份文件夹]
│ ├─js // 助手展示内容专用,来源于[文案内容备份文件夹]
│ ├─json // 助手展示内容专用,来源于[文案内容备份文件夹]
│ └─其它 // 相册分类文件夹,来源于[多媒体文件备份文件夹]
│ ├─相册A // 相册文件夹,相册的相片就放这里面,来源于[多媒体文件备份文件夹]
├─Blogs // 日志模块文件夹
│ ├─Images // 配图,来源于[多媒体文件备份文件夹]
│ ├─js // 助手展示内容专用,来源于[文案内容备份文件夹]
│ └─json // 助手展示内容专用,来源于[文案内容备份文件夹]
├─Boards // 留言模块文件夹,子文件夹可参考日志模块文件夹
├─Common // 助手专用
│ ├─css // 助手展示内容专用,来源于[文案内容备份文件夹]
│ ├─Images // 其它配图,来源于[多媒体文件备份文件夹]
│ ├─js // 助手展示内容专用,来源于[文案内容备份文件夹]
│ └─json // 助手展示内容专用,来源于[文案内容备份文件夹]
├─Diaries // 私密日记模块文件夹,子文夹件可参考日志模块文件夹
├─Favorites // 收藏夹模块文件夹,子文件夹可参考日志模块文件夹
├─Friends // QQ好友模块文件夹,子文件夹可参考日志模块文件夹
├─Messages // 说说模块文件夹,子文件夹可参考日志模块文件夹
├─Shares // 分享模块文件夹,子文件夹可参考日志模块文件夹
├─Videos // 视频模块文件夹,子文件夹可参考日志模块文件夹与相册模块文件夹
└─Visitors // 访客模块文件夹,子文件夹可参考日志模块文件夹
```
15. 最后,你可以把[完整备份文件夹](#完整备份文件夹)复制或移动到其它地方进行再次备份、比如说U盘、网盘、或者电脑的其它位置、甚至部署到服务器,比如[备份预览](#备份预览)就是基于备份内容部署到服务器的
16. [更多说明点击这里](https://lvshuncai.com/archives/qzone-export.html)
## 常见问题
是否可以破解加密空间,加密相册等等
- 不会,有会的,麻烦私聊我,准备膜拜大佬。
---
是否会导致QQ空间账号被冻结
- 一般情况下不会,但如果助手采集速度过快时,偶尔会造成QQ空间短暂的冻结,如造成相册访问空白等。
- 过段时间会自动解冻,如若介意,请勿使用,否则,后果自负。

@ -48,4 +48,7 @@ $(function() {
galleryIns.openGallery(imgIdx * 1);
})
// 初始化提示
$('[data-toggle="tooltip"]').tooltip();
});

@ -1001,7 +1001,7 @@ API.Common = {
*/
formatWxEmoji(content, type) {
const contentList = parseEmoji(content);
const imgRelativePath = 'https://cdn.jsdelivr.net/gh/ShunCai/QZoneExport@dev/src/img/emoji';
const imgRelativePath = 'https://fastly.jsdelivr.net/gh/ShunCai/QZoneExport@dev/src/img/emoji';
const result = [];
for (const _content of contentList) {
if (_content.type === 1) {
@ -1769,7 +1769,7 @@ TPL.LIKE_LIST = `
<%for (const item of items) {%>
<a href="<%:=API.Common.getUserUrl(item.fuin)%>" target="_blank" class="list-group-item list-group-item-action border rounded">
<div class="d-flex flex-row bd-highlight">
<div class="bd-highlight">
<div class="avatar bd-highlight">
<img class="rounded-circle" src="<%:=API.Common.getUserLogoUrl(item.fuin)%>" alt="" style="height: 50px;width: 50px;">
</div>
<div class="flex-fill bd-highlight align-self-center ml-3">
@ -1805,7 +1805,7 @@ TPL.VISITOR_LIST = `
<%for (const item of items) {%>
<a href="<%:=API.Common.getUserUrl(item.uin)%>" target="_blank" class="list-group-item list-group-item-action border rounded">
<div class="d-flex flex-row bd-highlight">
<div class="bd-highlight">
<div class="avatar bd-highlight">
<img class="rounded-circle" src="<%:=API.Common.getUserLogoUrl(item.uin)%>" alt="" style="height: 50px;width: 50px;">
</div>
<div class="flex-fill bd-highlight align-self-center ml-3">
@ -2014,14 +2014,14 @@ TPL.MESSAGES_ITEM = `
<!-- 外部视频 -->
<a class="medias-item border message-lightbox-external" href="<%:=API.Videos.getVideoUrl(video)%>" target="_blank">
<span class="message-video"></span>
<img class="lazyload loading w-100 h-100" src="../Common/Images/loading.gif" data-src="<%:=video.custom_pre_filepath || video.custom_pre_url || video.url1%>">
<img class="lazyload loading w-100 h-100" src="../Common/images/loading.gif" data-src="<%:=video.custom_pre_filepath || video.custom_pre_url || video.url1%>">
</a>
<%}else{%>
<!-- 空间视频 -->
<a class="medias-item border message-lightbox" data-idx="<%:=imgIdx%>" data-video='{"source": [{"src":"<%:=(video.custom_filepath || video.custom_url || video.url3)%>", "type":"video/mp4"}],"attributes": {"preload": false, "controls": true}}'
data-poster="<%:=video.custom_pre_filepath || video.custom_pre_url || video.url1%>" data-sub-html="#<%:= 'QZIMG-'+ message.tid%>">
<span class="message-video"></span>
<img class="lazyload loading w-100 h-100" data-id="<%:=video.video_id%>" src="../Common/Images/loading.gif" data-src="<%:=video.custom_pre_filepath || video.custom_pre_url || video.url1%>" />
<img class="lazyload loading w-100 h-100" data-id="<%:=video.video_id%>" src="../Common/images/loading.gif" data-src="<%:=video.custom_pre_filepath || video.custom_pre_url || video.url1%>" />
</a>
<%imgIdx++%>
<%}%>
@ -2036,20 +2036,20 @@ TPL.MESSAGES_ITEM = `
<!-- 外部视频 -->
<a class="medias-item border message-lightbox-external" href="<%:=API.Videos.getVideoUrl(image.video_info)%>" target="_blank">
<span class="message-video"></span>
<img class="lazyload loading w-100 h-100" src="../Common/Images/loading.gif" data-src="<%:=image.video_info.custom_pre_filepath || image.video_info.custom_pre_url || image.video_info.url1%>">
<img class="lazyload loading w-100 h-100" src="../Common/images/loading.gif" data-src="<%:=image.video_info.custom_pre_filepath || image.video_info.custom_pre_url || image.video_info.url1%>">
</a>
<%}else{%>
<!-- 空间视频 -->
<a class="medias-item border message-lightbox" data-idx="<%:=imgIdx%>" data-video='{"source": [{"src":"<%:=(image.video_info.custom_filepath || image.video_info.custom_url || image.video_info.url3)%>", "type":"video/mp4"}],"attributes": {"preload": false, "controls": true}}'
data-poster="<%:=image.video_info.custom_pre_filepath || image.video_info.custom_pre_url || image.video_info.url1%>" data-sub-html="#<%:= 'QZIMG-'+ message.tid%>">
<span class="message-video"></span>
<img class="lazyload loading w-100 h-100" data-id="<%:=image.video_info.video_id%>" src="../Common/Images/loading.gif" data-src="<%:=image.video_info.custom_pre_filepath || image.video_info.custom_pre_url || image.video_info.url1%>" />
<img class="lazyload loading w-100 h-100" data-id="<%:=image.video_info.video_id%>" src="../Common/images/loading.gif" data-src="<%:=image.video_info.custom_pre_filepath || image.video_info.custom_pre_url || image.video_info.url1%>" />
</a>
<%imgIdx++%>
<%}%>
<%}else{%>
<a class="medias-item border message-lightbox" data-idx="<%:=imgIdx%>" data-src="<%:=(image.custom_filepath || image.custom_url)%>" data-sub-html="#<%:= 'QZIMG-'+ message.tid%>">
<img class="lazyload loading w-100 h-100" data-id="<%:=image.pic_id%>" src="../Common/Images/loading.gif" src="../Common/Images/loading.gif" data-src="<%:=(image.custom_filepath || image.custom_url)%>">
<img class="lazyload loading w-100 h-100" data-id="<%:=image.pic_id%>" src="../Common/images/loading.gif" src="../Common/images/loading.gif" data-src="<%:=(image.custom_filepath || image.custom_url)%>">
</a>
<%imgIdx++%>
<%}%>
@ -2212,7 +2212,7 @@ TPL.BOARDS_YEAR_ITEMS = `
TPL.SHARES_COMMENTS = `
<%if(share.comments && share.comments.length > 0){%>
<%/* 遍历评论 */%>
<%for(let comment of comments.comments){%>
<%for(let comment of share.comments){%>
<hr>
` + TPL.COMMON_COMMENT + `
<%}%>
@ -2417,7 +2417,7 @@ TPL.BLOGS_TYPE_LIST = `
TPL.FRIENDS_LIST_ITEM = `
<div class="list-group-item list-group-item-action mb-2">
<div class="align-middle mb-2">
<a href="<%:=API.Common.getUserUrl(friend.uin)%>" target="_blank" title="访问TA的QQ空间">
<a class="avatar" href="<%:=API.Common.getUserUrl(friend.uin)%>" target="_blank" title="访问TA的QQ空间">
<img src="<%:=API.Common.getMediaPath(API.Common.getUserLogoUrl(friend.uin), friend.custom_avatar, "Friends_HTML")%>">
</a>
<span title="备注/昵称" class="ml-2"><%:=API.Common.formatContent(friend.remark || friend.name)%></span>

@ -2,14 +2,14 @@
<html lang="zh">
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css" integrity="sha384-zCbKRCUGaJDkqS1kPbPd7TveP5iyJE0EjAuZQTgFLD2ylzuqKfdKlfG/eSrtxUkn" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.staticfile.org/bootstrap/4.6.1/css/bootstrap.min.css">
<link rel="stylesheet" href="../css/options.css">
<link rel="icon" href="../img/icon-128.png">
<meta charset="utf-8" name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<title>QQ空间导出助手-关于</title>
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-fQybjgWLrvvRgtW6bFlB7jaZrFsaBXjsOMm/tB9LTS58ONXgqbR9W8oWht/amnpF" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js" integrity="sha256-qXBd/EfAdjOA2FGrGAG+b3YBn2tn5A6bhz+LSgYD96k=" crossorigin="anonymous"></script>
<script src="https://cdn.staticfile.org/jquery/3.6.0/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/bootstrap/4.6.1/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.staticfile.org/lodash.js/4.17.21/lodash.min.js"></script>
</head>
<body>

@ -34,6 +34,7 @@
<p id="Messages_Comments_Tips"></p>
<p id="Messages_Like_Tips"></p>
<p id="Messages_Visitor_Tips"></p>
<p id="Messages_Lbs_Info_Tips"></p>
<p id="Messages_Images_Mime_Tips"></p>
<p id="Messages_Export_Tips"></p>
<p id="Messages_Export_Other_Tips"></p>

@ -2,27 +2,27 @@
<html lang="zh">
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/font-awesome@4.7.0/css/font-awesome.min.css" integrity="sha256-eZrrJcwDc/3uDhsdt61sL2oOBY362qM3lon1gyExkL0=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css" integrity="sha384-zCbKRCUGaJDkqS1kPbPd7TveP5iyJE0EjAuZQTgFLD2ylzuqKfdKlfG/eSrtxUkn" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/jquery-resizable-columns@0.2.3/dist/jquery.resizableColumns.css" integrity="sha256-pnOeaniXq/EnY85GZ3NlDMmFN7eTJfc2MPpfO+UFN4w=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-table@1.19.1/dist/bootstrap-table.min.css" integrity="sha256-ZD9Tb2mCr01yh68j+JrUV91+SoL5xpUzChErCIHDCko=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/tempusdominus-bootstrap-4@5.39.0/build/css/tempusdominus-bootstrap-4.min.css" integrity="sha256-VL9T9QfjO/EGCzuu5CtTWWzIksAkGDTs+fO51ALqMjg=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.staticfile.org/font-awesome/4.7.0/css/font-awesome.min.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/bootstrap/4.6.1/css/bootstrap.min.css">
<link rel="stylesheet" href="../vendor/jquery-resizable-columns/css/jquery.resizableColumns.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/bootstrap-table/1.19.1/bootstrap-table.min.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/tempusdominus-bootstrap-4/5.39.0/css/tempusdominus-bootstrap-4.min.css">
<link rel="stylesheet" href="../css/options.css">
<link rel="icon" href="../img/icon-128.png">
<meta charset="utf-8" name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<title>QQ空间导出助手-选项</title>
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.3/dist/umd/popper.min.js" integrity="sha384-eMNCOe7tC1doHpGoWe/6oMVemdAVTMs2xqW4mwXrXsW0L84Iytr2wi5v2QjrP/xp" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-fQybjgWLrvvRgtW6bFlB7jaZrFsaBXjsOMm/tB9LTS58ONXgqbR9W8oWht/amnpF" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/jquery-resizable-columns@0.2.3/dist/jquery.resizableColumns.min.js" integrity="sha256-1pxGs5I5g78tKMDCR19p7mVIZ8kVD0N6qqXeraiheSg=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap-table@1.19.1/dist/bootstrap-table.min.js" integrity="sha256-BqVxqb61C9Xd1gUXFZd13+wfPnmP/zj7EXriNQ3Jup0=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap-table@1.19.1/dist/locale/bootstrap-table-zh-CN.min.js" integrity="sha256-pE+tLWBaNzEJufpbligmXg6jcxEHGXrWjQe4rv3yUNY=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/moment@2.27.0/min/moment.min.js" integrity="sha256-ZsWP0vT+akWmvEMkNYgZrPHKU9Ke8nYBPC3dqONp1mY=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/moment@2.27.0/min/moment-with-locales.min.js" integrity="sha256-wdiCkHJlqyoIJxG49WbDO0D3/EnppQp6GVOGQA6PBkA=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/x-editable-4-bs4@2.2.0/dist/bootstrap4-editable/js/bootstrap-editable.min.js" integrity="sha256-F2w/rRTJCTminpQHTIZ69RCFJyyeTThqqNeGbhxaY9A=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap-table@1.19.1/dist/extensions/resizable/bootstrap-table-resizable.min.js" integrity="sha256-bnx3qhjwjuNaU+aDr622pnYc6QFjZ5fnpSqp6FWWhBs=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/tempusdominus-bootstrap-4@5.39.0/build/js/tempusdominus-bootstrap-4.min.js" integrity="sha256-VpqYzVoiXWnJ6OWGzqbreWjWS5pu3mLoqyQSLyQD6aE=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js" integrity="sha256-qXBd/EfAdjOA2FGrGAG+b3YBn2tn5A6bhz+LSgYD96k=" crossorigin="anonymous"></script>
<script src="https://cdn.staticfile.org/jquery/3.6.0/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/popper.js/2.9.3/umd/popper.min.js"></script>
<script src="https://cdn.staticfile.org/bootstrap/4.6.1/js/bootstrap.bundle.min.js"></script>
<script src="../vendor/jquery-resizable-columns/js/jquery.resizableColumns.min.js"></script>
<script src="https://cdn.staticfile.org/bootstrap-table/1.19.1/bootstrap-table.min.js"></script>
<script src="https://cdn.staticfile.org/bootstrap-table/1.19.1/locale/bootstrap-table-zh-CN.min.js"></script>
<script src="https://cdn.staticfile.org/moment.js/2.27.0/moment.min.js"></script>
<script src="https://cdn.staticfile.org/moment.js/2.27.0/locale/zh-cn.min.js"></script>
<script src="../vendor/x-editable-4-bs4/js/bootstrap-editable.min.js"></script>
<script src="https://cdn.staticfile.org/bootstrap-table/1.19.1/extensions/resizable/bootstrap-table-resizable.min.js"></script>
<script src="https://cdn.staticfile.org/tempusdominus-bootstrap-4/5.39.0/js/tempusdominus-bootstrap-4.min.js"></script>
<script src="https://cdn.staticfile.org/lodash.js/4.17.21/lodash.min.js"></script>
</head>
<body>
@ -64,6 +64,7 @@
<a class="nav-item nav-link" id="nav-shares-tab" data-toggle="tab" href="#nav-shares" role="tab" aria-controls="nav-shares" aria-selected="false">分享</a>
<a class="nav-item nav-link" id="nav-visitors-tab" data-toggle="tab" href="#nav-visitors" role="tab" aria-controls="nav-visitors" aria-selected="false">访客</a>
<a class="nav-item nav-link " id="nav-common-tab" data-toggle="tab" href="#nav-common" role="tab" aria-controls="nav-common" aria-selected="false">公共</a>
<a class="nav-item nav-link " id="nav-dev-tab" data-toggle="tab" href="#nav-dev" role="tab" aria-controls="nav-dev" aria-selected="false">开发者</a>
</div>
</nav>
<div class="tab-content" id="nav-tabContent">
@ -241,6 +242,16 @@
<small id="messages_that_year_today_help" class="text-muted">是否生成那年今日,仅适用于HTML备份类型</small>
</div>
</div>
<div class="form-group row">
<div class="col-sm-auto">微信坐标:</div>
<div class="col-sm-2 custom-control custom-checkbox">
<input type="checkbox" class="custom-control-input" data-module="Messages" name="refreshWeChatLbs" id="messages_refreshWeChatLbs">
<label style="margin-left: 14px;" class="custom-control-label" for="messages_refreshWeChatLbs" aria-describedby="messages_refreshWeChatLbs_help"></label>
</div>
<div class="col-sm-auto">
<small id="messages_refreshWeChatLbs_help" class="text-muted">刷新微信朋友圈同步到空间的说说的坐标信息,<span style="color:red">需在开发者中维护腾讯地图Key</span></small>
</div>
</div>
<h5 style="color:cadetblue">评论选项:</h5>
<hr>
<div class="form-group row">
@ -853,6 +864,42 @@
</small>
</div>
</div>
<div class="form-group row">
<label for="photos_images_rename_type" class="col-sm-auto col-form-label">命名方式:</label>
<div class="col-sm-2">
<select id="photos_images_rename_type" class="form-control selectpicker custom-select" data-actions-box="true">
<optgroup label="相片名">
<option value="Name" selected >序号_相片名</option>
<option value="Default" selected >序号_相片名_随机码</option>
</optgroup>
<optgroup label="智能合成">
<option value="Time">序号_相片名_拍摄/上传时间</option>
<option value="Time_Lbs1">序号_相片名_拍摄/上传时间_拍摄/上传地点</option>
<option value="Time_Lbs2">序号_相片名_上传/拍摄时间_上传/拍摄地点</option>
</optgroup>
<optgroup label="智能汇总">
<option value="ALL">序号_相片名_上传时间_上传地点_拍摄时间_拍摄地点</option>
</optgroup>
<optgroup label="固定时间">
<option value="UploadTime">序号_相片名_上传时间</option>
<option value="ShootTime">序号_相片名_拍摄时间</option>
</optgroup>
<optgroup label="拍摄时间">
<option value="ShootTime_ShootLbs">序号_相片名_拍摄时间_拍摄地点</option>
<option value="ShootTime_Lbs1">序号_相片名_拍摄时间_拍摄/上传地点</option>
<option value="ShootTime_Lbs2">序号_相片名_拍摄时间_上传/拍摄地点</option>
</optgroup>
<optgroup label="上传时间">
<option value="UploadTime_UploadLbs">序号_相片名_上传时间_上传地点</option>
<option value="UploadTime_Lbs1">序号_相片名_上传时间_上传/拍摄地点</option>
<option value="UploadTime_Lbs2">序号_相片名_上传时间_拍摄/上传地点</option>
</optgroup>
</select>
</div>
<div class="col-sm-auto">
<small class="text-muted">相片备份文件的命名方式</small>
</div>
</div>
<div class="form-group row">
<label for="photos_images_list_type" class="col-sm-auto col-form-label">列表类型:</label>
<div class="col-sm-2">
@ -1144,6 +1191,19 @@
</small>
</div>
</div>
<div class="form-group row">
<label for="videos_file_rename_type" class="col-sm-auto col-form-label">命名方式:</label>
<div class="col-sm-2">
<select id="videos_file_rename_type" class="custom-select">
<option value="Default" selected >序号_随机码</option>
<option value="Name" selected >序号_视频标题/上传时间</option>
<option value="Time">序号_视频标题_上传时间</option>
</select>
</div>
<div class="col-sm-auto">
<small class="text-muted">视频备份文件的命名方式</small>
</div>
</div>
<div class="form-group row">
<label class="col-sm-auto col-form-label">查询间隔:</label>
<div class="col-sm-1">
@ -1870,6 +1930,18 @@
</small>
</div>
</div>
<!-- 引用来源 -->
<div id="common_refererUrls_row" class="form-group row">
<label for="common_refererUrls" class="col-sm-auto col-form-label">追加引用来源:</label>
<div class="col-sm-2">
<textarea class="form-control mt-2" id="common_refererUrls" rows="3" placeholder=""></textarea>
</div>
<div class="col-sm-auto">
<small id="common_refererUrls_help" class="text-muted">给指定域名的请求自动添加引用来源,主要用于浏览器下载方式,避免视频图片文件无法下载问题,一行一个域名
<a target="_blank" href="https://developer.chrome.com/docs/extensions/reference/declarativeNetRequest/#type-RulesMatchedDetails"><span class="fa fa-question-circle-o fa-lg" data-toggle="tooltip"></span></a>
</small>
</div>
</div>
<!-- Aria2下载相关配置 -->
<div id="common_aria2_rpc_row" class="form-group row" style="display: none;">
<label for="common_aria2_rpc" class="col-sm-auto col-form-label">Aria2 RPC地址:</label>
@ -1911,6 +1983,44 @@
</div>
</form>
</div>
<div class="tab-pane fade" id="nav-dev" role="tabpanel" aria-labelledby="nav-dev-tab">
<br />
<form id="tb_dev" data-module="Dev">
<h5 style="color:cadetblue">地图相关:</h5>
<hr>
<div class="form-group row">
<label class="col-sm-auto col-form-label">腾讯Key:</label>
<div class="col-sm-auto">
<input type="text" class="form-control" data-module="Dev" name="Maps.TxKey" id="dev_maps_tx_key">
</div>
<div class="col-sm-auto">
<small id="dev_maps_tx_key_help" class="text-muted">用于坐标转换、坐标转描述</small>
</div>
</div>
<!-- <div class="form-group row">
<label class="col-sm-auto col-form-label">百度Key:</label>
<div class="col-sm-auto">
<input type="text" class="form-control" data-module="Dev" name="Maps.BdKey" id="dev_maps_bd_key">
</div>
<div class="col-sm-auto">
<small id="dev_maps_bd_key_help" class="text-muted">用于打卡足迹展示</small>
</div>
</div>
<div class="form-group row">
<label class="col-sm-auto col-form-label">高德Key:</label>
<div class="col-sm-auto">
<input type="text" class="form-control" data-module="Dev" name="Maps.GdKey" id="dev_maps_gd_key">
</div>
<div class="col-sm-auto">
<small id="dev_maps_gd_key_help" class="text-muted">用于打卡足迹展示、坐标转换、坐标转描述</small>
</div>
</div> -->
<div class="text-center">
<button class="btn btn-primary submit" data-toggle="tooltip" title="保存所有模块设置项">保存</button>
<button type="button" class="btn btn-secondary reset" data-toggle="tooltip" title="重置当前配置模块设置项">重置</button>
</div>
</form>
</div>
</div>
</div>
</div>

@ -2,22 +2,22 @@
<html lang="zh">
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/font-awesome@4.7.0/css/font-awesome.min.css" integrity="sha256-eZrrJcwDc/3uDhsdt61sL2oOBY362qM3lon1gyExkL0=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css" integrity="sha384-zCbKRCUGaJDkqS1kPbPd7TveP5iyJE0EjAuZQTgFLD2ylzuqKfdKlfG/eSrtxUkn" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-table@1.19.1/dist/bootstrap-table.min.css" integrity="sha256-ZD9Tb2mCr01yh68j+JrUV91+SoL5xpUzChErCIHDCko=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/tempusdominus-bootstrap-4@5.1.2/build/css/tempusdominus-bootstrap-4.min.css" integrity="sha256-vi00YWza8MRCSI5GdsFLptAZIULny5MPn62PxEf/ZTY=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/jquery.loadmask@1.0.1/jquery.loadmask.css" integrity="sha256-b1bMgmqsZl8mmXnqSwZDTgToEQDfwBOzTFPnbG1xS6Y=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.staticfile.org/font-awesome/4.7.0/css/font-awesome.min.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/bootstrap/4.6.1/css/bootstrap.min.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/bootstrap-table/1.19.1/bootstrap-table.min.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/tempusdominus-bootstrap-4/5.1.2/css/tempusdominus-bootstrap-4.min.css">
<link rel="stylesheet" href="../vendor/loadmask/css/jquery.loadmask.css">
<link rel="stylesheet" href="../css/options.css">
<link rel="icon" href="../img/icon-128.png">
<meta charset="utf-8" name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<title>QQ空间导出助手-选项</title>
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-fQybjgWLrvvRgtW6bFlB7jaZrFsaBXjsOMm/tB9LTS58ONXgqbR9W8oWht/amnpF" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap-table@1.19.1/dist/bootstrap-table.min.js" integrity="sha256-BqVxqb61C9Xd1gUXFZd13+wfPnmP/zj7EXriNQ3Jup0=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap-table@1.19.1/dist/locale/bootstrap-table-zh-CN.min.js" integrity="sha256-pE+tLWBaNzEJufpbligmXg6jcxEHGXrWjQe4rv3yUNY=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/template_js@2.2.1/dist/index.aio.min.js" integrity="sha256-gnK+GsIXEBgu/mJouMDtUxXvXM3M0jzxNYmjnlsifgY=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/jquery.loadmask@1.0.1/jquery.loadmask.js" integrity="sha256-H6wQZnEUqzmTaAblQuLvp+cLdxre7XWdRyb3llskfAU=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js" integrity="sha256-qXBd/EfAdjOA2FGrGAG+b3YBn2tn5A6bhz+LSgYD96k=" crossorigin="anonymous"></script>
<script src="https://cdn.staticfile.org/jquery/3.6.0/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/bootstrap/4.6.1/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.staticfile.org/bootstrap-table/1.19.1/bootstrap-table.min.js"></script>
<script src="https://cdn.staticfile.org/bootstrap-table/1.19.1/locale/bootstrap-table-zh-CN.min.js"></script>
<script src="../vendor/template/template.js"></script>
<script src="../vendor/loadmask/js/jquery.loadmask.js"></script>
<script src="https://cdn.staticfile.org/lodash.js/4.17.21/lodash.min.js"></script>
</head>
<body>

@ -118,7 +118,13 @@ const REST_URLS = {
SPECIAL_CARE_LIST_URL: 'https://user.qzone.qq.com/proxy/domain/r.qzone.qq.com/cgi-bin/tfriend/specialcare_get.cgi',
/** 好友/用户名片(含昵称、备注、智能备注、是否特别关心、亲密度、共同好友、是否好友,是否开通空间,性别,城市) */
USER_CARD_URL: 'https://h5.qzone.qq.com/proxy/domain/r.qzone.qq.com/cgi-bin/user/cgi_personal_card'
USER_CARD_URL: 'https://h5.qzone.qq.com/proxy/domain/r.qzone.qq.com/cgi-bin/user/cgi_personal_card',
/** 获取坐标地址信息 */
MAP_LBS_INFO: 'https://apis.map.qq.com/ws/geocoder/v1',
/** 转换坐标信息 */
TO_TX_LBS: 'https://apis.map.qq.com/ws/coord/v1/translate'
};
@ -372,7 +378,10 @@ API.Utils = {
async getFileSuffix(url) {
let viewUrl = API.Utils.makeViewUrl(url);
return await API.Utils.getMimeType(viewUrl).then((data) => {
return '.' + data;
if (data) {
return '.' + data;
}
return '';
}).catch((e) => {
console.error('获取文件类型异常', viewUrl, e);
return '';
@ -1298,29 +1307,37 @@ API.Utils = {
thunderLink.newTask(taskInfo);
},
/**
* 删除浏览器任务属性
* @param {BrowserTask} task
*/
transformBrowserTask(task) {
// 简单克隆
const newTask = JSON.parse(JSON.stringify(task));
// 删除多余属性
delete newTask.id;
delete newTask.dir;
delete newTask.name;
delete newTask.source;
delete newTask.state;
delete newTask.downloadState;
delete newTask.module;
return newTask;
},
/**
* 浏览器下载(发送消息给背景页下载)
* @param {BrowserTask} task
*/
downloadByBrowser(task) {
return new Promise(function(resolve, reject) {
// 简单克隆
const newTask = JSON.parse(JSON.stringify(task));
// 删除多余属性
delete newTask.id;
delete newTask.dir;
delete newTask.name;
delete newTask.source;
delete newTask.state;
delete newTask.downloadState;
delete newTask.module;
return new Promise(async function(resolve, reject) {
chrome.runtime.sendMessage({
from: 'content',
type: 'download_browser',
downloadThread: QZone_Config.Common.downloadThread,
task: newTask
task: API.Utils.transformBrowserTask(task)
}, function(id) {
if (chrome.runtime.lastError) {
task.setId(0);
@ -1777,7 +1794,7 @@ API.Common = {
*/
getUserLogoLocalUrl(uin) {
// 头像默认PNG格式
return "Common/Images/{uin}".format({
return "Common/images/{uin}".format({
uin: uin
});
},
@ -1886,6 +1903,39 @@ API.Common = {
break;
}
return res;
},
/**
* 获取坐标的地址信息
* @param {Number} lat 纬度
* @param {Number} lng 经度
*/
getLbsInfo(lat, lng) {
const params = {
"location": '{0},{1}'.format(lat, lng),
"key": QZone_Config.DEV.Maps.TxKey
};
return API.Utils.get(REST_URLS.MAP_LBS_INFO, params);
},
/**
* 转换坐标到腾讯坐标也就是火星系坐标
* @param {Number} lat 纬度
* @param {Number} lng 经度
*/
toTxLbs(lat, lng, type) {
const params = {
"locations": '{0},{1}'.format(lat, lng),
"type": type || "1",
"key": QZone_Config.DEV.Maps.TxKey
};
// 1 GPS坐标
// 2 sogou经纬度
// 3 baidu经纬度
// 4 mapbar经纬度
// 5 [默认]腾讯、google、高德坐标
// 6 sogou墨卡托
return API.Utils.get(REST_URLS.TO_TX_LBS, params);
}
}
@ -2756,6 +2806,51 @@ API.Messages = {
return '#';
}
return 'https://apis.map.qq.com/uri/v1/marker?marker=coord:{pos_y},{pos_x};title:{idname};addr:{name}'.format(ibs);
},
/**
* 是否为微信同步的说说
* @param {Message} item 说说
* @returns
*/
isWeChat(item) {
return item.t1_source === 1 && item.t1_subtype === 29;
},
/**
* 显示来源
* @param {Message} item 说说
*/
getSourceHTML(item) {
if (item.t1_source === 0) {
// 朋友网
return '来自<span class="text-info">朋友网</span>';
}
if (item.t1_source === 1) {
// QQ空间
switch (item.t1_subtype) {
case 29:
return `
<svg t="1654947237192" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="10603" width="16" height="16">
<path
d="M512 954.24A442.24 442.24 0 1 0 69.76 512 442.08 442.08 0 0 0 512 954.24z m0-30.88a401.12 401.12 0 0 1-137.12-21.92V621.6l274.24 276.64A356 356 0 0 1 512 923.36z m285.28-119.68a400 400 0 0 1-112 81.28L487.2 687.04l389.44 1.92a359.52 359.52 0 0 1-79.2 114.72z m118.24-289.28a400 400 0 0 1-21.92 136.96H613.76l276.8-273.92a355.04 355.04 0 0 1 25.12 136.96z m-232.8-368a355.68 355.68 0 0 1 114.56 79.04 402.88 402.88 0 0 1 81.44 112L680.96 535.52zM512 653.6A141.6 141.6 0 1 1 653.6 512 141.6 141.6 0 0 1 512 653.6z m0-548.32A400 400 0 0 1 649.12 128v280L375.04 130.4A356.32 356.32 0 0 1 512 105.28z m-285.28 119.84a405.44 405.44 0 0 1 112-81.44l198.4 198.08-389.44-2.08a355.68 355.68 0 0 1 79.04-114.56zM108.64 514.4a400 400 0 0 1 21.92-136.96h279.84L133.6 651.36a357.92 357.92 0 0 1-24.96-136.96z m234.72-21.12l-1.92 389.44a357.12 357.12 0 0 1-114.72-79.04 401.76 401.76 0 0 1-81.28-112z"
fill="#FFFFFF" p-id="10604"></path>
<path d="M649.12 128A400 400 0 0 0 512 105.28a356.32 356.32 0 0 0-137.12 25.12l274.08 276.8z" fill="#FC6B4F" p-id="10605"></path>
<path d="M797.44 225.12a355.68 355.68 0 0 0-114.56-79.04l-1.92 389.44 197.92-198.08a402.88 402.88 0 0 0-81.44-112.32z" fill="#7838F2" p-id="10606"></path>
<path d="M893.76 651.36a400 400 0 0 0 21.92-136.96 355.04 355.04 0 0 0-25.12-136.96l-276.8 273.92z" fill="#5698F3" p-id="10607"></path>
<path d="M685.12 884.96a400 400 0 0 0 112-81.28 359.52 359.52 0 0 0 79.2-114.72l-389.44-1.92z" fill="#20E9F4" p-id="10608"></path>
<path d="M375.04 901.44A401.12 401.12 0 0 0 512 923.36a356 356 0 0 0 136.96-25.12L375.04 621.6z" fill="#00FD60" p-id="10609"></path>
<path d="M341.44 882.72l1.92-389.44L145.44 691.2a401.76 401.76 0 0 0 81.28 112 357.12 357.12 0 0 0 114.72 79.52z" fill="#ABFB5B" p-id="10610"></path>
<path d="M130.56 377.44a400 400 0 0 0-21.92 136.96 357.92 357.92 0 0 0 24.96 136.96l276.8-273.92z" fill="#F0E254" p-id="10611"></path>
<path d="M339.04 144a405.44 405.44 0 0 0-112 81.44 355.68 355.68 0 0 0-79.04 114.56l389.44 2.08z" fill="#F6B351" p-id="10612"></path>
</svg>
<span class="text-info">朋友圈</span>
`;
default:
break;
}
}
return void 0;
}
};
@ -3168,14 +3263,14 @@ API.Photos = {
getDownloadUrl(photo, type) {
let url = photo.url;
// 原图
let raw_url = photo.raw_upload === 1 ? photo.raw : undefined;
// 高清
let origin_url = photo.origin_url;
// 常规
let normal_url = photo.downloadUrl || photo.url;
const raw_url = photo.raw_upload === 1 && photo.raw;
// 高清图
const origin_url = photo.origin_upload === 1 && photo.origin_url || photo.origin;
// 普通图
const normal_url = photo.downloadUrl || photo.url;
switch (type) {
case 'raw':
// 原图,原图不存在高清,高清不存在取普通
// 原图,原图不存在高清,高清不存在取普通
url = raw_url || origin_url || normal_url;
break;
case 'original':

@ -49,26 +49,51 @@ const getInProgressTask = () => {
const downloadByBrowser = function(request) {
return new Promise(async resolve => {
let dataList = await getInProgressTask();
console.log(`添加任务到浏览器,当前任务数:${dataList.length}`);
// 如果有配置最大并发数,需要查询当前下载任务数,如果等于或大于,则继续等待
while (request.downloadThread > 0 && dataList.length >= request.downloadThread) {
console.log(`添加任务到浏览器,当前任务数:${dataList.length},不允许添加任务`);
// 等待1秒后重新查询当前任务数
await new Promise(resolve => setTimeout(resolve, 1000));
dataList = await getInProgressTask();
}
console.log(`添加任务到浏览器,当前任务数:${dataList.length},允许添加任务`);
// 添加下载任务
chrome.downloads.download(request.task, function(downloadId) {
if (chrome.runtime.lastError) {
console.error(`添加任务到浏览器失败,请求参数:${JSON.stringify(request)},错误信息:${chrome.runtime.lastError}`);
// 返回失败标识
resolve(0);
return;
// 下载任务
const task = request.task;
// 读取配置
chrome.storage.sync.get({
Common: {
refererUrls: [
"gtimg.com"
]
}
BrowseDownloads.set(downloadId, request.task)
resolve(downloadId);
});
}, async function(options) {
// 是否需要添加引用页
const isMatch = options.Common.refererUrls.filter(item => task.url.includes(item)).length > 0;
if (isMatch) {
// 通过XHR下载视频文件
await send(task.url, 'blob').then((xhr) => {
// 使用BLOB链接下载文件
task.url = URL.createObjectURL(xhr.response);
}).catch((e) => {
console.error('通过XHR下载视频错误,将使用浏览器直接下载 bg', task, e);
})
}
// 添加下载任务
chrome.downloads.download(task, function(downloadId) {
if (chrome.runtime.lastError) {
console.error(`添加任务到浏览器失败,请求参数:${JSON.stringify(request)},错误信息:${chrome.runtime.lastError}`);
// 返回失败标识
resolve(0);
return;
}
BrowseDownloads.set(downloadId, task)
resolve(downloadId);
});
})
})
}
@ -112,7 +137,6 @@ const resumeDownload = function(downloadId) {
* 消息监听器监听来自其他页面的消息
*/
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
console.info("Background 接收到消息!", request, sender);
switch (request.from) {
case 'content':
// 消息来源,内容脚本
@ -256,6 +280,40 @@ chrome.runtime.onInstalled.addListener((details) => {
}
})
/**
* 发送请求
* @param {string} url
* @param {string} responseType
* @param {integer} timeout 超时秒数
*/
const send = function(url, responseType, timeout) {
return new Promise(function(resolve, reject) {
var request = new XMLHttpRequest();
request.open("GET", url);
if (responseType) {
request.responseType = responseType;
}
// 允许跨域
request.withCredentials = true;
// 超时秒数
if (timeout) {
request.timeout = timeout * 1000;
}
request.onload = function() {
resolve(this);
};
request.onerror = function(error) {
reject(error);
this.abort();
};
request.ontimeout = function(error) {
reject(error);
this.abort();
};
request.send();
});
}
/**
* 获取文件类型
* @param {string} url 文件地址
@ -317,4 +375,51 @@ const getMapJson = function(url) {
}
xhr.send();
});
}
}
// 获取动态规则
chrome.declarativeNetRequest && chrome.declarativeNetRequest.getDynamicRules(
function(res) {
// 添加的规则
const addRules = [{
"id": 1,
"priority": 1,
"action": {
"requestHeaders": [{
"header": "Referer",
"operation": "set",
"value": "https://user.qzone.qq.com/"
}],
"type": "modifyHeaders"
},
"condition": {
"urlFilter": 'gtimg.com',
"resourceTypes": [
"xmlhttprequest"
]
}
}]
// 删除的规则
const removeRuleIds = res.map(item => item.id);
try {
// 移除动态规则
chrome.declarativeNetRequest.updateDynamicRules({
removeRuleIds: removeRuleIds
}, function() {
// 添加动态规则
chrome.declarativeNetRequest.updateDynamicRules({
addRules: addRules
})
})
} catch (error) {
try {
// 移除动态规则
chrome.declarativeNetRequest.updateDynamicRules(removeRuleIds, addRules)
} catch (error) {
}
}
}
)

@ -30,7 +30,20 @@ const Default_Config = {
// 是否禁用下载状态栏提醒
disabledShelf: false,
// 生成内容是否包含其他空间用户链接
hasUserLink: true
hasUserLink: true,
// 需要添加来源页的URL,目前主要用来下载视频
refererUrls: [
"gtimg.com"
]
},
// 开发者
Dev: {
Maps: {
// 腾讯Key
TxKey: "",
BdKey: "",
GdKey: ""
}
},
// 说说模块
Messages: {
@ -88,6 +101,7 @@ const Default_Config = {
'0元抢购'
],
hasThatYearToday: true,
refreshWeChatLbs: false, // 刷新朋友圈坐标信息
Like: {
isGet: false, //是否获取赞
randomSeconds: {
@ -225,7 +239,7 @@ const Default_Config = {
exifType: "raw",
Info: {
isGet: true, // 是否获取详情
pageSize: 1000,
pageSize: 200,
randomSeconds: {
min: 1,
max: 2
@ -233,7 +247,8 @@ const Default_Config = {
},
isGetVideo: true, // 是否获取相片关联的视频
isGetPreview: false, // 是否获取预览图
fileStructureType: 'File' // 文件夹结构类型
fileStructureType: 'File', // 文件夹结构类型
RenameType: "Default", // 相片命名规则
},
IncrementType: "Full", // 增量备份类型
IncrementTime: Default_IncrementTime, // 增量时间
@ -258,6 +273,7 @@ const Default_Config = {
Videos: {
exportType: "HTML",
fileStructureType: 'File', // 文件夹结构类型
RenameType: "Default", // 视频命名规则
randomSeconds: {
min: 1,
max: 2
@ -609,13 +625,13 @@ const ExportFiles = [{
target: 'Common/js/sidebar.js'
}, {
original: 'export/images/index.jpg',
target: 'Common/Images/index.jpg'
target: 'Common/images/index.jpg'
}, {
original: 'export/images/video-play.png',
target: 'Common/Images/video-play.png'
target: 'Common/images/video-play.png'
}, {
original: 'export/images/loading.gif',
target: 'Common/Images/loading.gif'
target: 'Common/images/loading.gif'
}, {
original: 'export/js/common.js',
target: 'Common/js/common.js'
@ -701,7 +717,7 @@ var QZone = {
// 说说模块
Messages: {
ROOT: 'Messages',
IMAGES_ROOT: 'Messages/Images',
IMAGES_ROOT: 'Messages/images',
total: 0,
Data: [],
FILE_URLS: new Map()
@ -709,7 +725,7 @@ var QZone = {
// 日志模块
Blogs: {
ROOT: 'Blogs',
IMAGES_ROOT: 'Blogs/Images',
IMAGES_ROOT: 'Blogs/images',
total: 0,
Data: [],
FILE_URLS: new Map()
@ -717,7 +733,7 @@ var QZone = {
// 私密日记模块
Diaries: {
ROOT: 'Diaries',
IMAGES_ROOT: 'Diaries/Images',
IMAGES_ROOT: 'Diaries/images',
total: 0,
Data: [],
FILE_URLS: new Map()
@ -798,7 +814,7 @@ var QZone = {
// 收藏夹模块
Favorites: {
ROOT: 'Favorites',
IMAGES_ROOT: 'Favorites/Images',
IMAGES_ROOT: 'Favorites/images',
total: 0,
Data: [],
FILE_URLS: new Map()
@ -806,7 +822,7 @@ var QZone = {
// 分享模块
Shares: {
ROOT: 'Shares',
IMAGES_ROOT: 'Shares/Images',
IMAGES_ROOT: 'Shares/images',
total: 0,
Data: [],
FILE_URLS: new Map(),
@ -826,7 +842,7 @@ var QZone = {
// 访客模块
Visitors: {
ROOT: 'Visitors',
IMAGES_ROOT: 'Visitors/Images',
IMAGES_ROOT: 'Visitors/images',
Data: {
items: [],
total: 0,
@ -837,7 +853,7 @@ var QZone = {
// 数据统计模板
Statistics: {
ROOT: 'Statistics',
IMAGES_ROOT: 'Statistics/Images',
IMAGES_ROOT: 'Statistics/images',
Data: {
},

@ -236,6 +236,13 @@ const MAX_MSG = {
'总共 <span style="color: #1ca5fc;">{total}</span> 条',
'请稍后...'
],
Messages_Lbs_Info: [
'正在获取第 <span style="color: #1ca5fc;">{index}</span> 条微信说说坐标信息',
'已刷新 <span style="color: #1ca5fc;">{downloaded}</span> 条',
'已跳过 <span style="color: #1ca5fc;">{skip}</span> 条',
'总共 <span style="color: #1ca5fc;">{total}</span> 条',
'请稍后...'
],
Messages_Export: [
'正在导出说说',
'已导出 <span style="color: #1ca5fc;">{downloaded}</span> 条',
@ -1029,6 +1036,7 @@ class QZoneOperator {
if (API.Common.isOnlyFileExport()) {
// 仅文件导出,无需压缩文件
console.log('仅文件导出,无需压缩文件');
$("#fileList").show();
} else {
// 压缩文件
await API.Utils.sleep(1000);
@ -1555,7 +1563,7 @@ API.Utils.addDownloadTasks = async(module, item, url, module_dir, source, FILE_U
}
}
item.custom_filename = filename;
item.custom_filepath = 'Images/' + filename;
item.custom_filepath = 'images/' + filename;
if (!FILE_URLS.has(url)) {
// 添加下载任务
API.Utils.newDownloadTask(module, url, module_dir, filename, source, suffix);

@ -177,8 +177,8 @@ API.Blogs.getAllList = async() => {
// 合并数据
QZone.Blogs.Data = API.Utils.unionItems(QZone.Blogs.Data, dataList);
if (!_.isEmpty(QZone.Blogs.OLD_Data) && API.Common.isPreBackupPos(dataList, CONFIG)) {
// 如果备份到已备份过的数据,则停止获取下一页,适用于增量备份
if (!API.Common.isGetNextPage(QZone.Blogs.OLD_Data, dataList, CONFIG)) {
// 不再继续获取下一页
return QZone.Blogs.Data;
}
// 递归获取下一页
@ -529,10 +529,10 @@ API.Blogs.handerListImages = async(items) => {
const suffix = await API.Utils.autoFileSuffix(url);
image.custom_url = uid + suffix;
API.Utils.newDownloadTask('Blogs', url, 'Blogs/Images', image.custom_url, item);
API.Utils.newDownloadTask('Blogs', url, 'Blogs/images', image.custom_url, item);
// 备份的显示地址
image.custom_url = 'Images/' + image.custom_url;
image.custom_url = 'images/' + image.custom_url;
}
}
}
@ -563,10 +563,10 @@ API.Blogs.handerContentImages = async(item, images) => {
const custom_filename = uid + suffix;
// 添加下载任务
API.Utils.newDownloadTask('Blogs', url, 'Blogs/Images', custom_filename, item);
API.Utils.newDownloadTask('Blogs', url, 'Blogs/images', custom_filename, item);
// 新的图片离线地址
url = 'MarkDown' === exportType ? '../Images/' + custom_filename : 'Images/' + custom_filename;
url = 'MarkDown' === exportType ? '../images/' + custom_filename : 'images/' + custom_filename;
}
// 修改日志中的图片链接
@ -628,10 +628,10 @@ API.Blogs.handerMedias = async(item, embeds) => {
const custom_filename = uid + suffix;
// 添加下载任务
API.Utils.newDownloadTask('Blogs', vurl, 'Blogs/Images', custom_filename, item);
API.Utils.newDownloadTask('Blogs', vurl, 'Blogs/images', custom_filename, item);
// 新的图片离线地址
vurl = 'MarkDown' === exportType ? '../Images/' + custom_filename : 'Images/' + custom_filename;
vurl = 'MarkDown' === exportType ? '../images/' + custom_filename : 'images/' + custom_filename;
}
$embed.replaceWith('<video src="{0}" height="auto" width="100%" controls="controls" ></video>'.format(vurl));
} else {

@ -98,8 +98,8 @@ API.Boards.getAllList = async() => {
// 合并数据
QZone.Boards.Data.items = API.Utils.unionItems(QZone.Boards.Data.items, dataList);
if (!_.isEmpty(QZone.Boards.OLD_Data.items) && API.Common.isPreBackupPos(dataList, CONFIG)) {
// 如果备份到已备份过的数据,则停止获取下一页,适用于增量备份
if (!API.Common.isGetNextPage(QZone.Boards.OLD_Data.items, dataList, CONFIG)) {
// 不再继续获取下一页
return QZone.Boards.Data;
}
// 递归获取下一页
@ -173,10 +173,10 @@ API.Boards.handerData = async(boardInfo) => {
custom_filename = custom_filename + autoSuffix;
// 添加下载任务
API.Utils.newDownloadTask('Boards', url, 'Boards/Images', custom_filename, board);
API.Utils.newDownloadTask('Boards', url, 'Boards/images', custom_filename, board);
// 图片离线地址
url = 'Images/' + custom_filename;
url = 'images/' + custom_filename;
}
// 修改日志中的图片链接

@ -146,7 +146,7 @@ API.Common.exportUserToJson = async(jsonObj) => {
await API.Utils.createFolder(path);
// 写入JOSN
await API.Utils.writeText(JSON.stringify(jsonObj), path + '/User.json').then((fileEntry) => {
await API.Common.writeJsonToJs('userInfo', jsonObj, path + '/user.js').then((fileEntry) => {
console.info("导出用户个人档信息完成", fileEntry);
}).catch((error) => {
console.error("导出用户个人档信息异常", error);
@ -325,7 +325,7 @@ API.Common.handerContentImages = (module, content, type) => {
if ("MD" === type) {
content.replace(/!\[.*?\]\((.+?)\)/g, function(linkmd, url) {
let custom_filename = API.Common.addDownloadTask(module, url, content);
return linkmd.replace(url, API.Common.getMediaPath(url, 'Common/Images/' + custom_filename, "Messages_HTML"));
return linkmd.replace(url, API.Common.getMediaPath(url, 'Common/images/' + custom_filename, "Messages_HTML"));
})
return content;
}
@ -336,7 +336,7 @@ API.Common.handerContentImages = (module, content, type) => {
const $img = $(images[i]);
let url = $img.attr('orgsrc') || $img.attr('src') || '';
let custom_filename = API.Common.addDownloadTask(module, url, content);
$img.attr('src', API.Common.getMediaPath(url, 'Common/Images/' + custom_filename, "Messages_HTML"));
$img.attr('src', API.Common.getMediaPath(url, 'Common/images/' + custom_filename, "Messages_HTML"));
}
return _html.html();
}
@ -352,7 +352,7 @@ API.Common.addDownloadTask = (module, url, content) => {
if (!custom_filename) {
custom_filename = API.Utils.newSimpleUid(8, 16);
// 添加下载任务
API.Utils.newDownloadTask(module, url, 'Common/Images', custom_filename, content);
API.Utils.newDownloadTask(module, url, 'Common/images', custom_filename, content);
QZone.Common.FILE_URLS.set(url, custom_filename);
}
return custom_filename;
@ -412,7 +412,7 @@ API.Common.downloadsByBrowser = async(tasks) => {
for (let j = 0; j < list.length; j++) {
const task = list[j];
// 添加任务到下载器的时候,可能存在一直无返回的情况,问题暂未定位,先临时添加超时秒数逻辑
await API.Utils.timeoutPromise(API.Utils.downloadByBrowser(task), 15 * 1000).then((downloadTask) => {
await API.Utils.timeoutPromise(API.Utils.downloadByBrowser(task), 60 * 1000 * 5).then((downloadTask) => {
if (downloadTask.id > 0) {
task.setState('complete');
indicator.addSuccess(task);
@ -661,6 +661,22 @@ API.Common.isFullBackup = (moduleConfig) => {
return moduleConfig.IncrementType === 'Full';
}
/**
* 是否上次备份
* @param {Object} moduleConfig 模块配置
*/
API.Common.isLast = (moduleConfig) => {
return moduleConfig.IncrementType === 'LastTime';
}
/**
* 是否自定义备份
* @param {Object} moduleConfig 模块配置
*/
API.Common.isCustom = (moduleConfig) => {
return moduleConfig.IncrementType === 'Custom';
}
/**
* 数据是否包含上次备份的位置
* @param {Array} new_items 新数据
@ -807,8 +823,10 @@ API.Common.saveBackupItems = () => {
for (const moduleName of MODULE_NAME_LIST) {
// 配置的备份时间,直接刷新为当前时间
QZone_Config[moduleName].IncrementTime = API.Utils.formatDate(Date.now() / 1000);
if (QZone_Config[moduleName].IncrementType === 'Last') {
// 备份方式为上次备份时,配置的备份时间,刷新为当前时间
QZone_Config[moduleName].IncrementTime = API.Utils.formatDate(Date.now() / 1000);
}
// 历史备份数据是否为空
const oldItems = API.Common.getOldModuleData(moduleName);
@ -1290,7 +1308,7 @@ API.Common.downloadUserAvatar = (user) => {
return;
}
API.Utils.newDownloadTask('Friends', avatarUrl, 'Common/Images', user.uin + '', user);
API.Utils.newDownloadTask('Friends', avatarUrl, 'Common/images', user.uin + '', user);
user.avatar = API.Common.getUserLogoUrl(user.uin);
user.custom_avatar = API.Common.getUserLogoLocalUrl(user.uin);
@ -1345,8 +1363,41 @@ API.Common.exportConfigToJson = async() => {
* 是否仅导出文件
*/
API.Common.isOnlyFileExport = () => {
// 相册导出类型为文件、视频导出类型为文件
const isFile = QZone_Config.Photos.exportType === 'File' && QZone_Config.Videos.exportType === 'File';
// 且下载工具不为下载链接
return isFile && QZone_Config.Common.downloadType !== 'Thunder_Link';
if (QZone.Common.ExportTypes.length > 2) {
// 大于两个的备份模块,都不是仅文件导出
return false;
}
if (QZone.Common.ExportTypes.includes('Photos') && QZone.Common.ExportTypes.includes('Videos')) {
// 相册导出类型为文件、视频导出类型为文件
const isFile = QZone_Config.Photos.exportType === 'File' && QZone_Config.Videos.exportType === 'File';
// 且下载工具不为下载链接
return isFile && QZone_Config.Common.downloadType !== 'Thunder_Link';
}
// 包含非相册或非视频的,都不是仅文件导出
return false;
}
/**
* 是否继续获取下一页
* @param {Array} oldItems 历史备份条目
* @param {Array} pageItems 新页的条目
* @param {Object} moduleCfg 模块的配置信息
*/
API.Common.isGetNextPage = (oldItems, pageItems, moduleCfg) => {
if (API.Common.isFullBackup(moduleCfg)) {
// 如果是全量备份,需要继续获取下一页,是否获取到末页不在这里判断,在hasNextPage判断
return true;
}
if (API.Common.isCustom(moduleCfg)) {
// 如果是自定义备份,则需判断是否备份到指定时间的位置
return !API.Common.isPreBackupPos(pageItems, moduleCfg);
}
if (API.Common.isLast(moduleCfg)) {
// 如果是上次备份,则需要判断是否达到上次备份的位置
if (_.isEmpty(oldItems)) {
return true;
}
return !API.Common.isPreBackupPos(pageItems, moduleCfg);
}
return true;
}

@ -169,8 +169,8 @@ API.Diaries.getAllList = async() => {
// 合并数据
QZone.Diaries.Data = API.Utils.unionItems(QZone.Diaries.Data, dataList);
if (!_.isEmpty(QZone.Diaries.OLD_Data) && API.Common.isPreBackupPos(dataList, CONFIG)) {
// 如果备份到已备份过的数据,则停止获取下一页,适用于增量备份
if (!API.Common.isGetNextPage(QZone.Diaries.OLD_Data.items, dataList, CONFIG)) {
// 不再继续获取下一页
return QZone.Diaries.Data;
}
// 递归获取下一页
@ -694,10 +694,10 @@ API.Diaries.handerImages = async(item, images) => {
let suffix = await API.Utils.autoFileSuffix(url);
const custom_filename = uid + suffix;
// 添加下载任务
API.Utils.newDownloadTask('Diaries', url, 'Diaries/Images', custom_filename, item);
API.Utils.newDownloadTask('Diaries', url, 'Diaries/images', custom_filename, item);
// 新的图片离线地址
url = 'MarkDown' === exportType ? '../Images/' + custom_filename : 'Images/' + custom_filename;
url = 'MarkDown' === exportType ? '../images/' + custom_filename : 'images/' + custom_filename;
}
// 修改日志中的图片链接
@ -760,10 +760,10 @@ API.Diaries.handerMedias = async(item, embeds) => {
const custom_filename = uid + suffix;
// 添加下载任务
API.Utils.newDownloadTask('Diaries', vurl, 'Diaries/Images', custom_filename, item);
API.Utils.newDownloadTask('Diaries', vurl, 'Diaries/images', custom_filename, item);
// 新的图片离线地址
vurl = 'MarkDown' === exportType ? '../Images/' + custom_filename : 'Images/' + custom_filename;
vurl = 'MarkDown' === exportType ? '../images/' + custom_filename : 'images/' + custom_filename;
}
$embed.replaceWith('<video src="{0}" height="auto" width="100%" controls="controls" ></video>'.format(vurl));
} else {

@ -88,8 +88,8 @@ API.Favorites.getAllList = async() => {
// 合并数据
QZone.Favorites.Data = API.Utils.unionItems(QZone.Favorites.Data, dataList);
if (!_.isEmpty(QZone.Favorites.OLD_Data) && API.Common.isPreBackupPos(dataList, CONFIG)) {
// 如果备份到已备份过的数据,则停止获取下一页,适用于增量备份
if (!API.Common.isGetNextPage(QZone.Favorites.OLD_Data.items, dataList, CONFIG)) {
// 不再继续获取下一页
return QZone.Favorites.Data;
}
// 递归获取下一页
@ -432,7 +432,7 @@ API.Favorites.exportToJson = async(favorites) => {
*/
API.Favorites.addMediaToTasks = async(dataList) => {
// 下载相对目录
let module_dir = 'Favorites/Images';
let module_dir = 'Favorites/images';
for (const item of dataList) {

@ -245,8 +245,8 @@ API.Friends.exportToExcel = async(friends) => {
// 行信息
const rowData = [
friend.uin,
friend.remark,
friend.name,
friend.remark,
friend.groupName,
API.Friends.getShowCare(friend),
API.Friends.getShowFriendTime(friend, 0),

@ -44,6 +44,9 @@ API.Messages.export = async() => {
// 处理特殊坐标数据,避免地图跳转错误
API.Messages.dealLbs(items);
// 优化微信同步说说的坐标信息
await API.Messages.refreshWeChatLbsInfo(items);
// 根据导出类型导出数据
await API.Messages.exportAllListToFiles(items);
@ -113,8 +116,8 @@ API.Messages.getAllList = async() => {
return await API.Messages.getList(pageIndex, indicator).then(async(dataList) => {
// 合并数据
QZone.Messages.Data = API.Utils.unionItems(QZone.Messages.Data, dataList);
if (!_.isEmpty(QZone.Messages.OLD_Data) && API.Common.isPreBackupPos(dataList, CONFIG)) {
// 如果备份到已备份过的数据,则停止获取下一页,适用于增量备份
if (!API.Common.isGetNextPage(QZone.Messages.OLD_Data, dataList, CONFIG)) {
// 不再继续获取下一页
return QZone.Messages.Data;
}
// 递归获取下一页
@ -222,7 +225,7 @@ API.Messages.getItemCommentList = async(item, pageIndex) => {
}
// 下载相对目录
let module_dir = 'Messages/Images';
let module_dir = 'Messages/images';
// 处理说说评论的配图
let comments = data.commentlist || [];
@ -597,7 +600,7 @@ API.Messages.addMediaToTasks = async(dataList) => {
const indicator = new StatusIndicator('Messages_Images_Mime');
// 下载相对目录
let module_dir = 'Messages/Images';
let module_dir = 'Messages/images';
for (const item of dataList) {
@ -1094,4 +1097,70 @@ API.Messages.dealLbs = function(items) {
lbs.pos_x = Number.parseFloat(lbs.pos_x).toString() * 1;
lbs.pos_y = Number.parseFloat(lbs.pos_y).toString() * 1;
}
}
/**
* 刷新微信同步说说的坐标信息
* @param {Array} items 说说
*/
API.Messages.refreshWeChatLbsInfo = async items => {
if (!QZone_Config.Messages.refreshWeChatLbs) {
return;
}
// 状态更新器
const indicator = new StatusIndicator('Messages_Lbs_Info');
// 更新总数
indicator.setTotal(items.length);
for (let idx = 0; idx < items.length; idx++) {
const item = items[idx];
indicator.setIndex(idx + 1);
if (item.custom_lbsInfo) {
// 已有坐标信息的,跳过
indicator.addSkip(item);
continue;
}
if (!API.Messages.isWeChat(item)) {
// 不是微信的,跳过
indicator.addSkip(item);
continue;
}
if (!item.lbs || !item.lbs.idname) {
// 没有坐标信息的,跳过
indicator.addSkip(item);
continue;
}
if(!QZone_Config.DEV.Maps.TxKey){
// 没有API Key的,跳过
indicator.addSkip(item);
continue;
}
await API.Common.toTxLbs(item.lbs.pos_y, item.lbs.pos_x).then(lbsInfo => {
if (lbsInfo.status === 0) {
item.lbs.pos_y = lbsInfo.locations[0].lat;
item.lbs.pos_x = lbsInfo.locations[0].lng;
}
}).catch(e => {
console.error('转换微信GPS坐标到腾讯火星系坐标异常', item, e);
});
await API.Common.getLbsInfo(item.lbs.pos_y, item.lbs.pos_x).then(lbsInfo => {
if (lbsInfo.status === 0) {
item.custom_lbsInfo = lbsInfo.result;
item.lbs.idname = item.custom_lbsInfo.formatted_addresses.recommend;
item.lbs.name = item.custom_lbsInfo.address;
}
indicator.addSuccess(item);
}).catch(e => {
console.error('请求坐标信息异常', item, e);
indicator.addFailed(item);
});
await API.Utils.sleep(500);
}
// 完成
indicator.complete();
}

@ -290,8 +290,8 @@ API.Photos.getAllAlbumList = async() => {
// 合并数据
QZone.Photos.Album.Data = API.Utils.unionItems(QZone.Photos.Album.Data, dataList);
if (!_.isEmpty(QZone.Photos.Album.OLD_Data) && API.Common.isPreBackupPos(dataList, CONFIG)) {
// 如果备份到已备份过的数据,则停止获取下一页,适用于增量备份
if (!API.Common.isGetNextPage(QZone.Photos.Album.OLD_Data, dataList, CONFIG)) {
// 不再继续获取下一页
return QZone.Photos.Album.Data;
}
// 递归获取下一页
@ -401,10 +401,11 @@ API.Photos.getAlbumImageAllList = async(album) => {
// 合并数据
QZone.Photos.Images[album.id].Data = API.Utils.unionItems(QZone.Photos.Images[album.id].Data, dataList);
if (!_.isEmpty(QZone.Photos.Images[album.id].OLD_Data) && API.Common.isPreBackupPos(dataList, ALBUM_CONFIG)) {
// 如果备份到已备份过的数据,则停止获取下一页,适用于增量备份
if (!API.Common.isGetNextPage(QZone.Photos.Images[album.id].OLD_Data, dataList, ALBUM_CONFIG)) {
// 不再继续获取下一页
return QZone.Photos.Images[album.id].Data;
}
// 递归获取下一页
return await API.Common.callNextPage(nextPageIndex, PHOTO_CONFIG, QZone.Photos.Images[album.id].total, QZone.Photos.Images[album.id].Data, arguments.callee, nextPageIndex, indicator);
}).catch(async(e) => {
@ -494,8 +495,8 @@ API.Photos.getAlbumImageAllListByDetail = async(album) => {
// 成功数量
indicator.setSuccess(QZone.Photos.Images[albumId].Data);
if (!_.isEmpty(QZone.Photos.Images[albumId].OLD_Data) && API.Common.isPreBackupPos(dataList, ALBUM_CONFIG) || data.last === 1) {
// 如果备份到已备份过的数据,则停止获取下一页,适用于增量备份
if (!API.Common.isGetNextPage(QZone.Photos.Images[albumId].OLD_Data, dataList, ALBUM_CONFIG) || data.last === 1) {
// 不再继续获取下一页
return QZone.Photos.Images[albumId].Data;
}
@ -503,9 +504,9 @@ API.Photos.getAlbumImageAllListByDetail = async(album) => {
return await nextPage(albumId, API.Photos.getImageKey(_.last(dataList)), indicator) || [];
}).catch((error) => {
console.error('获取相片详情异常', photo, error);
console.error('获取相片详情异常', picKey, error);
// 更新获取进度
indicator.addFailed(photo);
indicator.addFailed(picKey);
});
// 请求一页成功后等待指定秒数后再请求下一页
@ -621,10 +622,11 @@ API.Photos.getAlbumAllComments = async(item) => {
// 合并数据
item.comments = API.Utils.unionItems(item.comments, data.comments);
if (!_.isEmpty(QZone.Photos.Album.OLD_Data) && API.Common.isPreBackupPos(data.comments, CONFIG)) {
// 如果备份到已备份过的数据,则停止获取下一页,适用于增量备份
if (!API.Common.isGetNextPage(QZone.Photos.Album.OLD_Data, data.comments, CONFIG)) {
// 不再继续获取下一页
return item.comments;
}
// 递归获取下一页
return await API.Common.callNextPage(nextPageIndex, CONFIG, item.comment, item.comments, arguments.callee, item, nextPageIndex);
@ -717,10 +719,11 @@ API.Photos.getImageAllComments = async(item, indicator) => {
item.comments = API.Utils.unionItems(item.comments, data.comments);
indicator.addSuccess(data.comments);
if (!_.isEmpty(QZone.Photos.Album.OLD_Data) && API.Common.isPreBackupPos(data.comments, CONFIG)) {
// 如果备份到已备份过的数据,则停止获取下一页,适用于增量备份
if (!API.Common.isGetNextPage(QZone.Photos.Album.OLD_Data, data.comments, CONFIG)) {
// 不再继续获取下一页
return item.comments;
}
// 递归获取下一页
return await API.Common.callNextPage(nextPageIndex, CONFIG, item.cmtTotal, item.comments, arguments.callee, item, nextPageIndex, indicator);
@ -792,10 +795,10 @@ API.Photos.addAlbumsDownloadTasks = async(albums) => {
if (API.Photos.isNewAlbum(album.id)) {
// 添加相册预览图的下载任务
await API.Photos.addPreviewDownloadTasks(album, 'Albums/Images');
await API.Photos.addPreviewDownloadTasks(album, 'Albums/images');
// 添加评论的图片的下载任务
await API.Photos.addCommentDownloadTasks(album, 'Albums/Images');
await API.Photos.addCommentDownloadTasks(album, 'Albums/images');
}
// 添加相片的下载任务
@ -816,7 +819,7 @@ API.Photos.addPreviewDownloadTasks = async(item, dir) => {
item.custom_filename = API.Utils.newSimpleUid(8, 16);
// 预览图直接写死后缀(有权限的默认JPEG,无权限的,根据文件名获取)
item.custom_filename = item.custom_filename + (API.Utils.getFileSuffixByUrl(item.custom_url) || '.jpeg');
item.custom_filepath = 'Images/' + item.custom_filename;
item.custom_filepath = 'images/' + item.custom_filename;
// 添加下载任务
API.Utils.newDownloadTask('Photos', item.custom_url, dir, item.custom_filename, item);
return item;
@ -843,7 +846,7 @@ API.Photos.addCommentDownloadTasks = async(item, dir) => {
// 获取图片类型
let suffix = await API.Utils.autoFileSuffix(image.custom_url);
image.custom_filename = image.custom_filename + suffix;
image.custom_filepath = 'Images/' + image.custom_filename;
image.custom_filepath = 'images/' + image.custom_filename;
// 添加下载任务
API.Utils.newDownloadTask('Photos', image.custom_url, dir, image.custom_filename, item);
}
@ -904,7 +907,7 @@ API.Photos.addPhotosDownloadTasks = async(album, photos) => {
if (photo.is_video && photo.video_info) {
// 预览图与视频共用一个文件名
let filename = API.Utils.filenameValidate(orderNumber + '_' + photo.name + '_' + API.Utils.newSimpleUid(8, 16));
const filename = API.Photos.getImageFileName(photo, orderNumber);
// 下载预览图
// 根据配置的清晰度匹配图片,默认高清
@ -912,8 +915,8 @@ API.Photos.addPhotosDownloadTasks = async(album, photos) => {
// 下载视频预览图
photo.custom_pre_filename = filename + API.Photos.getPhotoSuffix(photo);
photo.custom_pre_filepath = albumFolder + '/Images/' + photo.custom_pre_filename;
API.Utils.newDownloadTask('Photos', photo.custom_url, albumFolder + '/Images', photo.custom_pre_filename, photo);
photo.custom_pre_filepath = albumFolder + '/images/' + photo.custom_pre_filename;
API.Utils.newDownloadTask('Photos', photo.custom_url, albumFolder + '/images', photo.custom_pre_filename, photo);
// 下载视频
photo.custom_filename = filename + '.mp4';
@ -925,7 +928,7 @@ API.Photos.addPhotosDownloadTasks = async(album, photos) => {
photo.custom_url = API.Photos.getDownloadUrl(photo, QZone_Config.Photos.Images.exifType);
// 文件名称
photo.custom_filename = API.Utils.filenameValidate(orderNumber + '_' + photo.name + '_' + API.Utils.newSimpleUid(8, 16));
photo.custom_filename = API.Photos.getImageFileName(photo, orderNumber);
photo.custom_filename = photo.custom_filename + API.Photos.getPhotoSuffix(photo);
// 添加下载任务
@ -940,9 +943,9 @@ API.Photos.addPhotosDownloadTasks = async(album, photos) => {
// 是否下载预览图
if (QZone_Config.Photos.Images.isGetPreview) {
// 如果需要获取预览图
photo.custom_pre_filepath = albumFolder + '/Images/' + photo.custom_filename;
photo.custom_pre_filepath = albumFolder + '/images/' + photo.custom_filename;
// 添加下载任务
API.Utils.newDownloadTask('Photos', photo.pre, albumFolder + '/Images', photo.custom_filename, photo);
API.Utils.newDownloadTask('Photos', photo.pre, albumFolder + '/images', photo.custom_filename, photo);
}
}
}
@ -956,7 +959,7 @@ API.Photos.addPhotosDownloadTasks = async(album, photos) => {
}
// 添加评论的下载任务
await API.Photos.addCommentDownloadTasks(photo, albumFolder + '/Images');
await API.Photos.addCommentDownloadTasks(photo, albumFolder + '/images');
}
// 完成
@ -1761,4 +1764,121 @@ API.Photos.resetAlbumOrderNumber = albums => {
const album = albums[idx];
album.order = idx;
}
}
/**
* 获取相片名称
* @param {Object} photo 相片
* @param {String} prefix 前缀
* @returns
*/
API.Photos.getImageFileName = (photo, prefix) => {
// 固定
const fileNames = [API.Utils.filenameValidate(prefix + '_' + photo.name)];
// 上传时间
const uploadTime = (photo.uploadtime || photo.uploadTime) && API.Utils.parseDate(photo.uploadtime || photo.uploadTime).getTime();
// 上传地点
const uploadLbs = photo.lbs && photo.lbs.idname && photo.lbs;
// 拍摄时间
const shootTime = (photo.rawshoottime || photo.shootTime) && API.Utils.parseDate(photo.rawshoottime || photo.shootTime).getTime();
// 拍摄地点
const shootGeo = photo.shootGeo && photo.shootGeo.idname && photo.shootGeo;
if (QZone_Config.Photos.Images.RenameType === 'Default') {
// 序号_相片名_随机码
fileNames.push(API.Utils.newSimpleUid(8, 16));
} else if (QZone_Config.Photos.Images.RenameType === 'Time') {
// 序号_相片名_拍摄/上传时间
fileNames.push(API.Utils.formatDate((shootTime || uploadTime) / 1000, 'yyyyMMdd_hhmmss'));
} else if (QZone_Config.Photos.Images.RenameType === 'Time_Lbs1') {
// 序号_相片名_拍摄/上传时间_拍摄/上传地点
fileNames.push(API.Utils.formatDate((shootTime || uploadTime) / 1000, 'yyyyMMdd_hhmmss'));
let customLbs = shootGeo || uploadLbs || undefined;
if (customLbs) {
fileNames.push(customLbs.idname || customLbs.name);
}
} else if (QZone_Config.Photos.Images.RenameType === 'Time_Lbs2') {
// 序号_相片名_上传/拍摄时间_上传/拍摄地点
fileNames.push(API.Utils.formatDate((shootTime || uploadTime) / 1000, 'yyyyMMdd_hhmmss'));
let customLbs = uploadLbs || shootGeo || undefined;
if (customLbs) {
fileNames.push(customLbs.idname || customLbs.name);
}
} else if (QZone_Config.Photos.Images.RenameType === 'ALL') {
// 序号_相片名_上传时间_上传地点_拍摄时间_拍摄地点/上传地点
if (uploadTime) {
fileNames.push(API.Utils.formatDate(uploadTime / 1000, 'yyyyMMdd_hhmmss'));
}
if (uploadLbs) {
fileNames.push(uploadLbs.idname || uploadLbs.name);
}
if (shootTime) {
fileNames.push(API.Utils.formatDate(shootTime / 1000, 'yyyyMMdd_hhmmss'));
}
if (shootGeo) {
fileNames.push(shootGeo.idname || shootGeo.name);
}
} else if (QZone_Config.Photos.Images.RenameType === 'UploadTime') {
// 序号_相片名_上传时间
fileNames.push(API.Utils.formatDate(uploadTime / 1000, 'yyyyMMdd_hhmmss'));
} else if (QZone_Config.Photos.Images.RenameType === 'ShootTime') {
// 序号_相片名_拍摄时间
fileNames.push(API.Utils.formatDate(shootTime / 1000, 'yyyyMMdd_hhmmss'));
} else if (QZone_Config.Photos.Images.RenameType === 'ShootTime_ShootLbs') {
// 序号_相片名_拍摄时间_拍摄地点
if (shootTime) {
fileNames.push(API.Utils.formatDate(shootTime / 1000, 'yyyyMMdd_hhmmss'));
}
if (shootGeo) {
fileNames.push(shootGeo.idname || shootGeo.name);
}
} else if (QZone_Config.Photos.Images.RenameType === 'ShootTime_Lbs1') {
// 序号_相片名_拍摄时间_拍摄/上传地点
if (shootTime) {
fileNames.push(API.Utils.formatDate(shootTime / 1000, 'yyyyMMdd_hhmmss'));
}
let customLbs = shootGeo || uploadLbs || undefined;
if (customLbs) {
fileNames.push(customLbs.idname || customLbs.name);
}
} else if (QZone_Config.Photos.Images.RenameType === 'ShootTime_Lbs2') {
// 序号_相片名_拍摄时间_上传/拍摄地点
if (shootTime) {
fileNames.push(API.Utils.formatDate(shootTime / 1000, 'yyyyMMdd_hhmmss'));
}
let customLbs = uploadLbs || shootGeo || undefined;
if (customLbs) {
fileNames.push(customLbs.idname || customLbs.name);
}
} else if (QZone_Config.Photos.Images.RenameType === 'UploadTime_UploadLbs') {
// 序号_相片名_上传时间_上传地点
if (uploadTime) {
fileNames.push(API.Utils.formatDate(uploadTime / 1000, 'yyyyMMdd_hhmmss'));
}
if (uploadLbs) {
fileNames.push(uploadLbs.idname || uploadLbs.name);
}
} else if (QZone_Config.Photos.Images.RenameType === 'UploadTime_Lbs1') {
// 序号_相片名_上传时间_上传/拍摄地点
if (uploadTime) {
fileNames.push(API.Utils.formatDate(uploadTime / 1000, 'yyyyMMdd_hhmmss'));
}
let customLbs = uploadLbs || shootGeo || undefined;
if (customLbs) {
fileNames.push(customLbs.idname || customLbs.name);
}
} else if (QZone_Config.Photos.Images.RenameType === 'UploadTime_Lbs2') {
// 序号_相片名_上传时间_拍摄/上传地点
if (uploadTime) {
fileNames.push(API.Utils.formatDate(uploadTime / 1000, 'yyyyMMdd_hhmmss'));
}
let customLbs = shootGeo || uploadLbs || undefined;
if (customLbs) {
fileNames.push(customLbs.idname || customLbs.name);
}
}
photo.custom_filename = fileNames.join('_');
return photo.custom_filename;
}

@ -29,7 +29,7 @@ API.Shares.export = async() => {
// 根据导出类型导出数据
await API.Shares.exportAllListToFiles(items);
} catch (error) {
console.error('分享导出异常:', error);
}
@ -74,8 +74,8 @@ API.Shares.getAllList = async() => {
// 合并数据
QZone.Shares.Data = API.Utils.unionItems(QZone.Shares.Data, dataList);
if (!_.isEmpty(QZone.Shares.OLD_Data) && API.Common.isPreBackupPos(dataList, CONFIG)) {
// 如果备份到已备份过的数据,则停止获取下一页,适用于增量备份
if (!API.Common.isGetNextPage(QZone.Shares.OLD_Data, dataList, CONFIG)) {
// 不再继续获取下一页
return QZone.Shares.Data;
}
// 递归获取下一页
@ -369,7 +369,7 @@ API.Shares.getAllVisitorList = async(items) => {
*/
API.Shares.addMediaToTasks = async(dataList) => {
// 下载相对目录
const module_dir = 'Shares/Images';
const module_dir = 'Shares/images';
for (const item of dataList) {
if (!API.Common.isNewItem(item)) {

@ -27,7 +27,7 @@ API.Videos.export = async() => {
await API.Videos.getAllLikeList(videos);
// 添加视频下载任务
API.Videos.addDownloadTasks('Videos', videos, 'Videos/Images');
API.Videos.addDownloadTasks('Videos', videos, 'Videos/images');
// 根据导出类型导出数据
await API.Videos.exportAllToFiles(videos);
@ -101,8 +101,8 @@ API.Videos.getAllList = async() => {
return await API.Videos.getPageList(pageIndex, indicator).then(async(dataList) => {
// 合并数据
QZone.Videos.Data = API.Utils.unionItems(QZone.Videos.Data, dataList);
if (!_.isEmpty(QZone.Videos.OLD_Data) && API.Common.isPreBackupPos(dataList, CONFIG)) {
// 如果备份到已备份过的数据,则停止获取下一页,适用于增量备份
if (!API.Common.isGetNextPage(QZone.Videos.OLD_Data, dataList, CONFIG)) {
// 不再继续获取下一页
return QZone.Videos.Data;
}
// 递归获取下一页
@ -191,8 +191,8 @@ API.Videos.getAllComments = async(videos) => {
// 合并数据
video.comments = API.Utils.unionItems(video.comments, data.comments);
if (!_.isEmpty(QZone.Videos.OLD_Data) && API.Common.isPreBackupPos(data.comments, CONFIG)) {
// 如果备份到已备份过的数据,则停止获取下一页,适用于增量备份
if (!API.Common.isGetNextPage(QZone.Videos.OLD_Data, data.comments, CONFIG)) {
// 不再继续获取下一页
return video.comments;
}
@ -253,7 +253,7 @@ API.Videos.addDownloadTasks = (module, videos, module_dir, source) => {
video.custom_pre_url = video.pre || video.url1 || video.preview_img;
// 预览图直接写死后缀
video.custom_pre_filename = API.Utils.newSimpleUid(8, 16) + '.jpeg';
video.custom_pre_filepath = 'Images/' + video.custom_pre_filename;
video.custom_pre_filepath = 'images/' + video.custom_pre_filename;
API.Utils.newDownloadTask(module, video.custom_pre_url, module_dir, video.custom_pre_filename, video);
// 如果是外部视频,跳过不下载
@ -270,14 +270,14 @@ API.Videos.addDownloadTasks = (module, videos, module_dir, source) => {
continue;
}
video.custom_filename = API.Videos.getFileName(video.custom_url);
video.custom_filename = isVideo ? orderNumber + '_' + video.custom_filename : video.custom_filename;
video.custom_filename = isVideo ? API.Videos.getVideoFileName(video, orderNumber) : video.custom_filename;
// 添加下载任务
const categoryPath = API.Videos.getFileStructureFolderPath(video);
const downloadFolder = categoryPath ? 'Videos/' + categoryPath : 'Videos';
// 文件路径
video.custom_filepath = 'Images/' + video.custom_filename;
video.custom_filepath = 'images/' + video.custom_filename;
if (isVideo) {
video.custom_filepath = categoryPath ? categoryPath + '/' + video.custom_filename : video.custom_filename;
}
@ -674,4 +674,33 @@ API.Videos.getAllLikeList = async(items) => {
indicator.complete();
return items;
}
/**
* 获取视频名称
* @param {Object} video 视频
* @param {String} prefix 前缀
* @returns
*/
API.Videos.getVideoFileName = (video, prefix) => {
// 上传时间
const dateTime = API.Utils.parseDate(video.uploadtime || video.uploadTime).getTime();
if (QZone_Config.Videos.RenameType === 'Default') {
// 文件名称,排序号+空间名称
video.custom_filename = API.Utils.filenameValidate(prefix + '_' + video.custom_filename);
} else if (QZone_Config.Videos.RenameType === 'Name') {
// 文件名称,排序号+视频标题
video.custom_filename = API.Utils.filenameValidate(prefix + '_' + (video.title || API.Utils.formatDate(dateTime / 1000, 'yyyyMMdd_hhmmss')));
} else if (QZone_Config.Videos.RenameType === 'Time') {
// 文件名称,排序号+视频标题+拍摄/上传时间
if (video.title) {
video.custom_filename = API.Utils.filenameValidate(prefix + '_' + video.title + '_' + API.Utils.formatDate(dateTime / 1000, 'yyyyMMdd_hhmmss'));
} else {
video.custom_filename = API.Utils.filenameValidate(prefix + '_' + API.Utils.formatDate(dateTime / 1000, 'yyyyMMdd_hhmmss'));
}
}
// 追加后缀
video.custom_filename = video.custom_filename.endsWith('.mp4') ? video.custom_filename : video.custom_filename + '.mp4';
video.custom_filename = API.Utils.filenameValidate(video.custom_filename);
return video.custom_filename;
}

@ -125,7 +125,7 @@ API.Visitors.getAllList = async() => {
*/
API.Visitors.addMediaToTasks = async(visitorInfo) => {
// 下载相对目录
const module_dir = 'Visitors/Images';
const module_dir = 'Visitors/images';
const items = visitorInfo.items || [];

@ -241,6 +241,7 @@
// 提示信息
const $download_type_help = $('#common_download_type_help');
const $common_refererUrls = $('#common_refererUrls_row');
switch (value) {
case 'File':
$task_count_row.hide();
@ -253,6 +254,7 @@
$file_suffix_row.show();
$suffix_timeout_row.show();
$download_thread_row.show();
$common_refererUrls.show();
$download_type_help.html('助手内部目前<span style="color:red">暂不支持数据容量大于2G的备份</span>,2G内建议使用助手内部下载,超2G的建议使用其他方式下载');
break;
@ -262,6 +264,7 @@
$task_sleep_row.hide();
$download_status_row.hide();
$download_thread_row.hide();
$common_refererUrls.hide();
// 显示Aria2配置
$common_aria2_rpc_row.show();
@ -276,6 +279,7 @@
// 隐藏Aria2配置
$common_aria2_rpc_row.hide();
$common_aria2_token_row.hide();
$common_refererUrls.hide();
$task_count_row.show();
$task_sleep_row.show();
@ -290,6 +294,7 @@
// 隐藏Aria2配置
$common_aria2_rpc_row.hide();
$common_aria2_token_row.hide();
$common_refererUrls.hide();
$task_count_row.show();
$task_sleep_row.show();
@ -304,6 +309,7 @@
// 隐藏Aria2配置
$common_aria2_rpc_row.hide();
$common_aria2_token_row.hide();
$common_refererUrls.hide();
$task_count_row.show();
$task_sleep_row.hide();
@ -324,6 +330,7 @@
$file_suffix_row.show();
$suffix_timeout_row.show();
$download_thread_row.show();
$common_refererUrls.show();
$download_type_help.html('使用浏览器下载,请确保已关闭浏览器设置中的<span style="color:red">【下载前询问每个文件的保存位置】</span>选项,否则浏览器将会一直弹窗提示保存文件');
break;
@ -333,6 +340,7 @@
$file_suffix_row.hide();
$suffix_timeout_row.hide();
$download_thread_row.hide();
$common_refererUrls.hide();
// 隐藏Aria2配置
$common_aria2_rpc_row.hide();
@ -695,6 +703,7 @@
$("#photos_images_list_type").val(options.Photos.Images.listType).change();
// 文件夹结构类型
$("#photos_file_structure_type").val(options.Photos.Images.fileStructureType);
$("#photos_images_rename_type").val(options.Photos.Images.RenameType);
$("#photos_images_cost_min").val(options.Photos.Images.randomSeconds.min);
$("#photos_images_cost_max").val(options.Photos.Images.randomSeconds.max);
$("#photos_images_limit").val(options.Photos.Images.pageSize);
@ -721,6 +730,7 @@
// 视频模块赋值
$("#videos_exportFormat").val(options.Videos.exportType).change();
$("#videos_file_structure_type").val(options.Videos.fileStructureType);
$("#videos_file_rename_type").val(options.Videos.RenameType);
$("#videos_increment_type").val(options.Videos.IncrementType).change();
$("#videos_increment_time").val(options.Videos.IncrementTime);
$("#videos_list_cost_min").val(options.Videos.randomSeconds.min);
@ -804,9 +814,18 @@
$("#common_aria2_token").val(options.Common.Aria2.token || '');
$('#common_user_link').prop("checked", options.Common.hasUserLink);
// 开发者
$('#dev_maps_tx_key').val(options.Dev.Maps.TxKey);
$('#dev_maps_bd_key').val(options.Dev.Maps.BdKey);
$('#dev_maps_gd_key').val(options.Dev.Maps.GdKey);
// 那年今日
renderValueToDom(options, 'hasThatYearToday');
// 微信坐标
renderValueToDom(options, 'refreshWeChatLbs');
// 图片类型识别
renderValueToDom(options, 'isAutoFileSuffix');
@ -821,6 +840,9 @@
// 空间权限
renderValueToDom(options, 'ZoneAccess');
// 引用来源
$('#common_refererUrls').val(QZone_Config.Common.refererUrls.join('\n'));
}
// 读取数据,第一个参数是指定要读取的key以及设置默认值
@ -857,8 +879,8 @@
* @param {string} field 属性名称
*/
const setValueByFrom = (options, field) => {
const $hasThatYearTodayFields = $('input[name="' + field + '"],select[name="' + field + '"]');
for (const item of $hasThatYearTodayFields) {
const $fields = $('input[name="' + field + '"],select[name="' + field + '"]');
for (const item of $fields) {
const moduleName = $(item).attr('data-module');
if (!moduleName) {
continue;
@ -961,6 +983,7 @@
QZone_Config.Photos.Comments.randomSeconds.max = $("#photos_albums_comments_cost_max").val() * 1;
QZone_Config.Photos.Comments.pageSize = $("#photos_albums_comments_limit").val() * 1;
QZone_Config.Photos.Images.RenameType = $("#photos_images_rename_type").val();
QZone_Config.Photos.Images.listType = $("#photos_images_list_type").val();
QZone_Config.Photos.Images.fileStructureType = $("#photos_file_structure_type").val();
QZone_Config.Photos.Images.randomSeconds.min = $("#photos_images_cost_min").val() * 1;
@ -990,6 +1013,7 @@
// 视频模块赋值
QZone_Config.Videos.exportType = $("#videos_exportFormat").val();
QZone_Config.Videos.fileStructureType = $("#videos_file_structure_type").val();
QZone_Config.Videos.RenameType = $("#videos_file_rename_type").val();
QZone_Config.Videos.IncrementType = $("#videos_increment_type").val();
QZone_Config.Videos.IncrementTime = $("#videos_increment_time").val();
QZone_Config.Videos.randomSeconds.min = $("#videos_list_cost_min").val() * 1;
@ -1071,12 +1095,19 @@
QZone_Config.Common.downloadThread = $("#common_download_thread").val() * 1;
QZone_Config.Common.Aria2.rpc = $("#common_aria2_rpc").val();
QZone_Config.Common.Aria2.token = $("#common_aria2_token").val();
QZone_Config.Common.hasUserLink = $('#common_user_link').prop("checked");
// 开发者
QZone_Config.Dev.Maps.TxKey = $("#dev_maps_tx_key").val();
QZone_Config.Dev.Maps.BdKey = $("#dev_maps_bd_key").val();
QZone_Config.Dev.Maps.GdKey = $("#dev_maps_gd_key").val();
// 那年今日
setValueByFrom(QZone_Config, 'hasThatYearToday');
// 微信坐标
setValueByFrom(QZone_Config, 'refreshWeChatLbs');
// 图片类型识别
setValueByFrom(QZone_Config, 'isAutoFileSuffix');
@ -1092,6 +1123,60 @@
// 空间权限
setValueByFrom(QZone_Config, 'ZoneAccess');
// 引用来源
QZone_Config.Common.refererUrls = $('#common_refererUrls').val().split('\n');
// 获取动态规则
chrome.declarativeNetRequest && chrome.declarativeNetRequest.getDynamicRules(
function(res) {
// 需要添加的规则
const addRules = [];
for (let idx = 0; idx < QZone_Config.Common.refererUrls.length; idx++) {
const url = QZone_Config.Common.refererUrls[idx];
addRules.push({
"id": idx + 1,
"priority": idx + 1,
"action": {
"requestHeaders": [{
"header": "Referer",
"operation": "set",
"value": "https://user.qzone.qq.com/"
}],
"type": "modifyHeaders"
},
"condition": {
"urlFilter": url,
"resourceTypes": [
"xmlhttprequest"
]
}
});
}
// 删除的规则
const removeRuleIds = res.map(item => item.id);
try {
// 移除动态规则
chrome.declarativeNetRequest.updateDynamicRules({
removeRuleIds: removeRuleIds
}, function() {
// 添加动态规则
chrome.declarativeNetRequest.updateDynamicRules({
addRules: addRules
})
})
} catch (error) {
try {
// 移除动态规则
chrome.declarativeNetRequest.updateDynamicRules(removeRuleIds, addRules)
} catch (error) {
}
}
}
)
chrome.storage.sync.set(QZone_Config, function() {
console.info("保存成功!");
});

@ -2,7 +2,7 @@
"manifest_version": 2,
"name": "QQ空间导出助手",
"description": "QQ空间导出助手,用于导出备份QQ空间的说说、日志、私密日记、相册、视频、留言板、QQ好友、收藏夹、分享、访客为文件,便于迁移与保存",
"version": "1.1.6",
"version": "1.1.7",
"icons": {
"128": "img/icon-128.png"
},
@ -62,7 +62,7 @@
"default_popup": "html/popup.html"
},
"options_page": "html/options.html",
"content_security_policy": "script-src 'self' 'unsafe-eval' https://open.thunderurl.com/ https://res-etl-ssl.xunlei.com/ https://cdn.jsdelivr.net/ http://127.0.0.1; frame-src 'self' https://open.thunderurl.com/ https://res-etl-ssl.xunlei.com/ https://cdn.jsdelivr.net/; object-src 'self'",
"content_security_policy": "script-src 'self' 'unsafe-eval' https://open.thunderurl.com/ https://res-etl-ssl.xunlei.com/ https://cdn.jsdelivr.net/ https://fastly.jsdelivr.net/ https://gcore.jsdelivr.net/ https://cdn.staticfile.org/ http://127.0.0.1; frame-src 'self' https://open.thunderurl.com/ https://res-etl-ssl.xunlei.com/ https://cdn.jsdelivr.net/ https://fastly.jsdelivr.net/ https://gcore.jsdelivr.net/ https://cdn.staticfile.org/; object-src 'self'",
"web_accessible_resources": [
"html/indicator.html",
"export/*.*",
@ -79,6 +79,7 @@
"downloads.shelf",
"declarativeContent",
"clipboardWrite",
"declarativeNetRequest",
"<all_urls>"
]
}

@ -5,13 +5,13 @@
<link rel="icon" href="https://qzonestyle.gtimg.cn/aoi/img/logo/favicon.ico">
<title>QQ空间备份-相册</title>
<meta charset="utf-8" name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/font-awesome@4.7.0/css/font-awesome.min.css" integrity="sha256-eZrrJcwDc/3uDhsdt61sL2oOBY362qM3lon1gyExkL0=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css" integrity="sha384-zCbKRCUGaJDkqS1kPbPd7TveP5iyJE0EjAuZQTgFLD2ylzuqKfdKlfG/eSrtxUkn" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.staticfile.org/font-awesome/4.7.0/css/font-awesome.min.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/bootstrap/4.6.1/css/bootstrap.min.css">
<link rel="stylesheet" type="text/css" href="../Common/css/common.css">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-fQybjgWLrvvRgtW6bFlB7jaZrFsaBXjsOMm/tB9LTS58ONXgqbR9W8oWht/amnpF" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/template_js@2.2.1/dist/index.aio.min.js" integrity="sha256-gnK+GsIXEBgu/mJouMDtUxXvXM3M0jzxNYmjnlsifgY=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js" integrity="sha256-qXBd/EfAdjOA2FGrGAG+b3YBn2tn5A6bhz+LSgYD96k=" crossorigin="anonymous"></script>
<script src="https://cdn.staticfile.org/jquery/3.6.0/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/bootstrap/4.6.1/js/bootstrap.bundle.min.js"></script>
<script src="https://fastly.jsdelivr.net/npm/template_js@2.2.1/dist/index.aio.min.js" integrity="sha256-gnK+GsIXEBgu/mJouMDtUxXvXM3M0jzxNYmjnlsifgY=" crossorigin="anonymous"></script>
<script src="https://cdn.staticfile.org/lodash.js/4.17.21/lodash.min.js"></script>
<script src="https://www.lvshuncai.com/custom/js/clicklove.min.js"></script>
<script type="text/javascript" src="json/albums.js"></script>

@ -5,26 +5,26 @@
<link rel="icon" href="https://qzonestyle.gtimg.cn/aoi/img/logo/favicon.ico">
<meta charset="utf-8" name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<title>QQ空间备份-日志标题</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/font-awesome@4.7.0/css/font-awesome.min.css" integrity="sha256-eZrrJcwDc/3uDhsdt61sL2oOBY362qM3lon1gyExkL0=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css" integrity="sha384-zCbKRCUGaJDkqS1kPbPd7TveP5iyJE0EjAuZQTgFLD2ylzuqKfdKlfG/eSrtxUkn" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/css/lightgallery.css" integrity="sha256-u/8xxXqgHmqInTUqModtj8UvjfzppMhunF8mGI5gpAM=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/css/lightgallery-bundle.min.css" integrity="sha256-S8sL5U5HwTa3JmR1y0ASCyQH111hgvPpKOkYXZHa4sA=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.staticfile.org/font-awesome/4.7.0/css/font-awesome.min.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/bootstrap/4.6.1/css/bootstrap.min.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/lightgallery/2.3.0/css/lightgallery.min.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/lightgallery/2.3.0/css/lightgallery-bundle.min.css">
<link rel="stylesheet" type="text/css" href="../Common/css/common.css">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-fQybjgWLrvvRgtW6bFlB7jaZrFsaBXjsOMm/tB9LTS58ONXgqbR9W8oWht/amnpF" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js" integrity="sha256-qXBd/EfAdjOA2FGrGAG+b3YBn2tn5A6bhz+LSgYD96k=" crossorigin="anonymous"></script>
<script src="https://cdn.staticfile.org/jquery/3.6.0/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/bootstrap/4.6.1/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.staticfile.org/lodash.js/4.17.21/lodash.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/lightgallery.min.js" integrity="sha256-dkTk5cgrLUjjQiGNZsoDnjhCI+UuhTffLnyrN7qLutw=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/zoom/lg-zoom.min.js" integrity="sha256-6Ny31P8WSBcY1SFaWxg4zgDzZJNNIJ4BchV+RxFiDR0=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/video/lg-video.min.js" integrity="sha256-lkYYtHLEk1Rnr3TOXc/l1tfObPXEzvgKwePG49fZ1Rw=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/thumbnail/lg-thumbnail.min.js" integrity="sha256-X+UxSQGUfsYDhXAsKkzoI2g7Jjn7wWK/vzRfcmYNop4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/rotate/lg-rotate.min.js" integrity="sha256-G1VF4wLKwDc+R5n/GbOkQFhdhGEKXve+GUlrdyRKXaE=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/fullscreen/lg-fullscreen.min.js" integrity="sha256-7SXgJ9rT6uPHY7fse2NsZN7Yq96f+9I35bDtUwX8ZHc=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/comment/lg-comment.min.js" integrity="sha256-RszgszIiPRvEWMviw43SzoZwsvKZNbz2Djio7kUemrY=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/autoplay/lg-autoplay.min.js" integrity="sha256-XGqZJI2/fqI+ph7+msYWRIi9NLzsZ2PlhrhltWEUmOM=" crossorigin="anonymous"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/lightgallery.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/zoom/lg-zoom.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/video/lg-video.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/thumbnail/lg-thumbnail.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/rotate/lg-rotate.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/fullscreen/lg-fullscreen.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/comment/lg-comment.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/autoplay/lg-autoplay.min.js"></script>
<script src="https://www.lvshuncai.com/custom/js/clicklove.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/template_js@2.2.1/dist/index.aio.min.js" integrity="sha256-gnK+GsIXEBgu/mJouMDtUxXvXM3M0jzxNYmjnlsifgY=" crossorigin="anonymous"></script>
<script src="https://fastly.jsdelivr.net/npm/template_js@2.2.1/dist/index.aio.min.js" integrity="sha256-gnK+GsIXEBgu/mJouMDtUxXvXM3M0jzxNYmjnlsifgY=" crossorigin="anonymous"></script>
<script type="text/javascript" src="json/blogs.js"></script>
<script type="text/javascript" src="../Common/js/common.js"></script>
<script type="text/javascript" src="js/bloginfo.js"></script>

@ -5,23 +5,23 @@
<link rel="icon" href="https://qzonestyle.gtimg.cn/aoi/img/logo/favicon.ico">
<meta charset="utf-8" name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<title>QQ空间备份-<%:=blog.custom_title%></title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/font-awesome@4.7.0/css/font-awesome.min.css" integrity="sha256-eZrrJcwDc/3uDhsdt61sL2oOBY362qM3lon1gyExkL0=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css" integrity="sha384-zCbKRCUGaJDkqS1kPbPd7TveP5iyJE0EjAuZQTgFLD2ylzuqKfdKlfG/eSrtxUkn" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/css/lightgallery.css" integrity="sha256-u/8xxXqgHmqInTUqModtj8UvjfzppMhunF8mGI5gpAM=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/css/lightgallery-bundle.min.css" integrity="sha256-S8sL5U5HwTa3JmR1y0ASCyQH111hgvPpKOkYXZHa4sA=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.staticfile.org/font-awesome/4.7.0/css/font-awesome.min.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/bootstrap/4.6.1/css/bootstrap.min.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/lightgallery/2.3.0/css/lightgallery.min.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/lightgallery/2.3.0/css/lightgallery-bundle.min.css">
<link rel="stylesheet" type="text/css" href="../Common/css/common.css">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-fQybjgWLrvvRgtW6bFlB7jaZrFsaBXjsOMm/tB9LTS58ONXgqbR9W8oWht/amnpF" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js" integrity="sha256-qXBd/EfAdjOA2FGrGAG+b3YBn2tn5A6bhz+LSgYD96k=" crossorigin="anonymous"></script>
<script src="https://cdn.staticfile.org/jquery/3.6.0/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/bootstrap/4.6.1/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.staticfile.org/lodash.js/4.17.21/lodash.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/lightgallery.min.js" integrity="sha256-dkTk5cgrLUjjQiGNZsoDnjhCI+UuhTffLnyrN7qLutw=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/zoom/lg-zoom.min.js" integrity="sha256-6Ny31P8WSBcY1SFaWxg4zgDzZJNNIJ4BchV+RxFiDR0=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/video/lg-video.min.js" integrity="sha256-lkYYtHLEk1Rnr3TOXc/l1tfObPXEzvgKwePG49fZ1Rw=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/thumbnail/lg-thumbnail.min.js" integrity="sha256-X+UxSQGUfsYDhXAsKkzoI2g7Jjn7wWK/vzRfcmYNop4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/rotate/lg-rotate.min.js" integrity="sha256-G1VF4wLKwDc+R5n/GbOkQFhdhGEKXve+GUlrdyRKXaE=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/fullscreen/lg-fullscreen.min.js" integrity="sha256-7SXgJ9rT6uPHY7fse2NsZN7Yq96f+9I35bDtUwX8ZHc=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/comment/lg-comment.min.js" integrity="sha256-RszgszIiPRvEWMviw43SzoZwsvKZNbz2Djio7kUemrY=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/autoplay/lg-autoplay.min.js" integrity="sha256-XGqZJI2/fqI+ph7+msYWRIi9NLzsZ2PlhrhltWEUmOM=" crossorigin="anonymous"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/lightgallery.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/zoom/lg-zoom.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/video/lg-video.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/thumbnail/lg-thumbnail.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/rotate/lg-rotate.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/fullscreen/lg-fullscreen.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/comment/lg-comment.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/autoplay/lg-autoplay.min.js"></script>
<script src="https://www.lvshuncai.com/custom/js/clicklove.min.js"></script>
</head>

@ -5,16 +5,16 @@
<link rel="icon" href="https://qzonestyle.gtimg.cn/aoi/img/logo/favicon.ico">
<meta charset="utf-8" name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<title>QQ空间备份-日志</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/font-awesome@4.7.0/css/font-awesome.min.css" integrity="sha256-eZrrJcwDc/3uDhsdt61sL2oOBY362qM3lon1gyExkL0=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css" integrity="sha384-zCbKRCUGaJDkqS1kPbPd7TveP5iyJE0EjAuZQTgFLD2ylzuqKfdKlfG/eSrtxUkn" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-table@1.19.1/dist/bootstrap-table.min.css" integrity="sha256-ZD9Tb2mCr01yh68j+JrUV91+SoL5xpUzChErCIHDCko=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.staticfile.org/font-awesome/4.7.0/css/font-awesome.min.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/bootstrap/4.6.1/css/bootstrap.min.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/bootstrap-table/1.19.1/bootstrap-table.min.css">
<link rel="stylesheet" type="text/css" href="../Common/css/common.css">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-fQybjgWLrvvRgtW6bFlB7jaZrFsaBXjsOMm/tB9LTS58ONXgqbR9W8oWht/amnpF" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap-table@1.19.1/dist/bootstrap-table.min.js" integrity="sha256-BqVxqb61C9Xd1gUXFZd13+wfPnmP/zj7EXriNQ3Jup0=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap-table@1.19.1/dist/locale/bootstrap-table-zh-CN.min.js" integrity="sha256-pE+tLWBaNzEJufpbligmXg6jcxEHGXrWjQe4rv3yUNY=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/template_js@2.2.1/dist/index.aio.min.js" integrity="sha256-gnK+GsIXEBgu/mJouMDtUxXvXM3M0jzxNYmjnlsifgY=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js" integrity="sha256-qXBd/EfAdjOA2FGrGAG+b3YBn2tn5A6bhz+LSgYD96k=" crossorigin="anonymous"></script>
<script src="https://cdn.staticfile.org/jquery/3.6.0/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/bootstrap/4.6.1/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.staticfile.org/bootstrap-table/1.19.1/bootstrap-table.min.js"></script>
<script src="https://cdn.staticfile.org/bootstrap-table/1.19.1/locale/bootstrap-table-zh-CN.min.js"></script>
<script src="https://fastly.jsdelivr.net/npm/template_js@2.2.1/dist/index.aio.min.js" integrity="sha256-gnK+GsIXEBgu/mJouMDtUxXvXM3M0jzxNYmjnlsifgY=" crossorigin="anonymous"></script>
<script src="https://cdn.staticfile.org/lodash.js/4.17.21/lodash.min.js"></script>
<script src="https://www.lvshuncai.com/custom/js/clicklove.min.js"></script>
<script src="json/blogs.js"></script>

@ -5,24 +5,24 @@
<link rel="icon" href="https://qzonestyle.gtimg.cn/aoi/img/logo/favicon.ico">
<meta charset="utf-8" name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<title>QQ空间备份-留言板</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/font-awesome@4.7.0/css/font-awesome.min.css" integrity="sha256-eZrrJcwDc/3uDhsdt61sL2oOBY362qM3lon1gyExkL0=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css" integrity="sha384-zCbKRCUGaJDkqS1kPbPd7TveP5iyJE0EjAuZQTgFLD2ylzuqKfdKlfG/eSrtxUkn" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/css/lightgallery.css" integrity="sha256-u/8xxXqgHmqInTUqModtj8UvjfzppMhunF8mGI5gpAM=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/css/lightgallery-bundle.min.css" integrity="sha256-S8sL5U5HwTa3JmR1y0ASCyQH111hgvPpKOkYXZHa4sA=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.staticfile.org/font-awesome/4.7.0/css/font-awesome.min.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/bootstrap/4.6.1/css/bootstrap.min.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/lightgallery/2.3.0/css/lightgallery.min.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/lightgallery/2.3.0/css/lightgallery-bundle.min.css">
<link rel="stylesheet" type="text/css" href="../Common/css/common.css">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-fQybjgWLrvvRgtW6bFlB7jaZrFsaBXjsOMm/tB9LTS58ONXgqbR9W8oWht/amnpF" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lazyload@2.0.0-rc.2/lazyload.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js" integrity="sha256-qXBd/EfAdjOA2FGrGAG+b3YBn2tn5A6bhz+LSgYD96k=" crossorigin="anonymous"></script>
<script src="https://cdn.staticfile.org/jquery/3.6.0/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/bootstrap/4.6.1/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.staticfile.org/jquery_lazyload/2.0.0-rc.2/lazyload.min.js"></script>
<script src="https://cdn.staticfile.org/lodash.js/4.17.21/lodash.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/lightgallery.min.js" integrity="sha256-dkTk5cgrLUjjQiGNZsoDnjhCI+UuhTffLnyrN7qLutw=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/zoom/lg-zoom.min.js" integrity="sha256-6Ny31P8WSBcY1SFaWxg4zgDzZJNNIJ4BchV+RxFiDR0=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/thumbnail/lg-thumbnail.min.js" integrity="sha256-X+UxSQGUfsYDhXAsKkzoI2g7Jjn7wWK/vzRfcmYNop4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/rotate/lg-rotate.min.js" integrity="sha256-G1VF4wLKwDc+R5n/GbOkQFhdhGEKXve+GUlrdyRKXaE=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/fullscreen/lg-fullscreen.min.js" integrity="sha256-7SXgJ9rT6uPHY7fse2NsZN7Yq96f+9I35bDtUwX8ZHc=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/autoplay/lg-autoplay.min.js" integrity="sha256-XGqZJI2/fqI+ph7+msYWRIi9NLzsZ2PlhrhltWEUmOM=" crossorigin="anonymous"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/lightgallery.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/zoom/lg-zoom.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/thumbnail/lg-thumbnail.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/rotate/lg-rotate.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/fullscreen/lg-fullscreen.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/autoplay/lg-autoplay.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/template_js@2.2.1/dist/index.aio.min.js" integrity="sha256-gnK+GsIXEBgu/mJouMDtUxXvXM3M0jzxNYmjnlsifgY=" crossorigin="anonymous"></script>
<script src="https://fastly.jsdelivr.net/npm/template_js@2.2.1/dist/index.aio.min.js" integrity="sha256-gnK+GsIXEBgu/mJouMDtUxXvXM3M0jzxNYmjnlsifgY=" crossorigin="anonymous"></script>
<script src="https://www.lvshuncai.com/custom/js/clicklove.min.js"></script>
<script type="text/javascript" src="../Common/json/config.js"></script>

@ -5,16 +5,16 @@
<link rel="icon" href="https://qzonestyle.gtimg.cn/aoi/img/logo/favicon.ico">
<meta charset="utf-8" name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<title>QQ空间备份-私密日记</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/font-awesome@4.7.0/css/font-awesome.min.css" integrity="sha256-eZrrJcwDc/3uDhsdt61sL2oOBY362qM3lon1gyExkL0=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css" integrity="sha384-zCbKRCUGaJDkqS1kPbPd7TveP5iyJE0EjAuZQTgFLD2ylzuqKfdKlfG/eSrtxUkn" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-table@1.19.1/dist/bootstrap-table.min.css" integrity="sha256-ZD9Tb2mCr01yh68j+JrUV91+SoL5xpUzChErCIHDCko=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.staticfile.org/font-awesome/4.7.0/css/font-awesome.min.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/bootstrap/4.6.1/css/bootstrap.min.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/bootstrap-table/1.19.1/bootstrap-table.min.css">
<link rel="stylesheet" type="text/css" href="../Common/css/common.css">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-fQybjgWLrvvRgtW6bFlB7jaZrFsaBXjsOMm/tB9LTS58ONXgqbR9W8oWht/amnpF" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap-table@1.19.1/dist/bootstrap-table.min.js" integrity="sha256-BqVxqb61C9Xd1gUXFZd13+wfPnmP/zj7EXriNQ3Jup0=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap-table@1.19.1/dist/locale/bootstrap-table-zh-CN.min.js" integrity="sha256-pE+tLWBaNzEJufpbligmXg6jcxEHGXrWjQe4rv3yUNY=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/template_js@2.2.1/dist/index.aio.min.js" integrity="sha256-gnK+GsIXEBgu/mJouMDtUxXvXM3M0jzxNYmjnlsifgY=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js" integrity="sha256-qXBd/EfAdjOA2FGrGAG+b3YBn2tn5A6bhz+LSgYD96k=" crossorigin="anonymous"></script>
<script src="https://cdn.staticfile.org/jquery/3.6.0/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/bootstrap/4.6.1/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.staticfile.org/bootstrap-table/1.19.1/bootstrap-table.min.js"></script>
<script src="https://cdn.staticfile.org/bootstrap-table/1.19.1/locale/bootstrap-table-zh-CN.min.js"></script>
<script src="https://fastly.jsdelivr.net/npm/template_js@2.2.1/dist/index.aio.min.js" integrity="sha256-gnK+GsIXEBgu/mJouMDtUxXvXM3M0jzxNYmjnlsifgY=" crossorigin="anonymous"></script>
<script src="https://cdn.staticfile.org/lodash.js/4.17.21/lodash.min.js"></script>
<script src="https://www.lvshuncai.com/custom/js/clicklove.min.js"></script>
<script type="text/javascript" src="json/diaries.js"></script>

@ -5,25 +5,25 @@
<link rel="icon" href="https://qzonestyle.gtimg.cn/aoi/img/logo/favicon.ico">
<meta charset="utf-8" name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<title>QQ空间备份-日志日记</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/font-awesome@4.7.0/css/font-awesome.min.css" integrity="sha256-eZrrJcwDc/3uDhsdt61sL2oOBY362qM3lon1gyExkL0=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css" integrity="sha384-zCbKRCUGaJDkqS1kPbPd7TveP5iyJE0EjAuZQTgFLD2ylzuqKfdKlfG/eSrtxUkn" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/css/lightgallery.css" integrity="sha256-u/8xxXqgHmqInTUqModtj8UvjfzppMhunF8mGI5gpAM=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/css/lightgallery-bundle.min.css" integrity="sha256-S8sL5U5HwTa3JmR1y0ASCyQH111hgvPpKOkYXZHa4sA=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.staticfile.org/font-awesome/4.7.0/css/font-awesome.min.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/bootstrap/4.6.1/css/bootstrap.min.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/lightgallery/2.3.0/css/lightgallery.min.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/lightgallery/2.3.0/css/lightgallery-bundle.min.css">
<link rel="stylesheet" type="text/css" href="../Common/css/common.css">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-fQybjgWLrvvRgtW6bFlB7jaZrFsaBXjsOMm/tB9LTS58ONXgqbR9W8oWht/amnpF" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js" integrity="sha256-qXBd/EfAdjOA2FGrGAG+b3YBn2tn5A6bhz+LSgYD96k=" crossorigin="anonymous"></script>
<script src="https://cdn.staticfile.org/jquery/3.6.0/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/bootstrap/4.6.1/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.staticfile.org/lodash.js/4.17.21/lodash.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/lightgallery.min.js" integrity="sha256-dkTk5cgrLUjjQiGNZsoDnjhCI+UuhTffLnyrN7qLutw=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/zoom/lg-zoom.min.js" integrity="sha256-6Ny31P8WSBcY1SFaWxg4zgDzZJNNIJ4BchV+RxFiDR0=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/video/lg-video.min.js" integrity="sha256-lkYYtHLEk1Rnr3TOXc/l1tfObPXEzvgKwePG49fZ1Rw=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/thumbnail/lg-thumbnail.min.js" integrity="sha256-X+UxSQGUfsYDhXAsKkzoI2g7Jjn7wWK/vzRfcmYNop4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/rotate/lg-rotate.min.js" integrity="sha256-G1VF4wLKwDc+R5n/GbOkQFhdhGEKXve+GUlrdyRKXaE=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/fullscreen/lg-fullscreen.min.js" integrity="sha256-7SXgJ9rT6uPHY7fse2NsZN7Yq96f+9I35bDtUwX8ZHc=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/comment/lg-comment.min.js" integrity="sha256-RszgszIiPRvEWMviw43SzoZwsvKZNbz2Djio7kUemrY=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/autoplay/lg-autoplay.min.js" integrity="sha256-XGqZJI2/fqI+ph7+msYWRIi9NLzsZ2PlhrhltWEUmOM=" crossorigin="anonymous"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/lightgallery.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/zoom/lg-zoom.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/video/lg-video.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/thumbnail/lg-thumbnail.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/rotate/lg-rotate.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/fullscreen/lg-fullscreen.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/comment/lg-comment.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/autoplay/lg-autoplay.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/template_js@2.2.1/dist/index.aio.min.js" integrity="sha256-gnK+GsIXEBgu/mJouMDtUxXvXM3M0jzxNYmjnlsifgY=" crossorigin="anonymous"></script>
<script src="https://fastly.jsdelivr.net/npm/template_js@2.2.1/dist/index.aio.min.js" integrity="sha256-gnK+GsIXEBgu/mJouMDtUxXvXM3M0jzxNYmjnlsifgY=" crossorigin="anonymous"></script>
<script src="https://www.lvshuncai.com/custom/js/clicklove.min.js"></script>
<script type="text/javascript" src="json/diaries.js"></script>

@ -5,23 +5,23 @@
<link rel="icon" href="https://qzonestyle.gtimg.cn/aoi/img/logo/favicon.ico">
<meta charset="utf-8" name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<title>QQ空间备份-<%:=blog.custom_title%></title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/font-awesome@4.7.0/css/font-awesome.min.css" integrity="sha256-eZrrJcwDc/3uDhsdt61sL2oOBY362qM3lon1gyExkL0=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css" integrity="sha384-zCbKRCUGaJDkqS1kPbPd7TveP5iyJE0EjAuZQTgFLD2ylzuqKfdKlfG/eSrtxUkn" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/css/lightgallery.css" integrity="sha256-u/8xxXqgHmqInTUqModtj8UvjfzppMhunF8mGI5gpAM=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/css/lightgallery-bundle.min.css" integrity="sha256-S8sL5U5HwTa3JmR1y0ASCyQH111hgvPpKOkYXZHa4sA=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.staticfile.org/font-awesome/4.7.0/css/font-awesome.min.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/bootstrap/4.6.1/css/bootstrap.min.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/lightgallery/2.3.0/css/lightgallery.min.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/lightgallery/2.3.0/css/lightgallery-bundle.min.css">
<link rel="stylesheet" type="text/css" href="../Common/css/common.css">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-fQybjgWLrvvRgtW6bFlB7jaZrFsaBXjsOMm/tB9LTS58ONXgqbR9W8oWht/amnpF" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js" integrity="sha256-qXBd/EfAdjOA2FGrGAG+b3YBn2tn5A6bhz+LSgYD96k=" crossorigin="anonymous"></script>
<script src="https://cdn.staticfile.org/jquery/3.6.0/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/bootstrap/4.6.1/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.staticfile.org/lodash.js/4.17.21/lodash.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/lightgallery.min.js" integrity="sha256-dkTk5cgrLUjjQiGNZsoDnjhCI+UuhTffLnyrN7qLutw=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/zoom/lg-zoom.min.js" integrity="sha256-6Ny31P8WSBcY1SFaWxg4zgDzZJNNIJ4BchV+RxFiDR0=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/video/lg-video.min.js" integrity="sha256-lkYYtHLEk1Rnr3TOXc/l1tfObPXEzvgKwePG49fZ1Rw=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/thumbnail/lg-thumbnail.min.js" integrity="sha256-X+UxSQGUfsYDhXAsKkzoI2g7Jjn7wWK/vzRfcmYNop4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/rotate/lg-rotate.min.js" integrity="sha256-G1VF4wLKwDc+R5n/GbOkQFhdhGEKXve+GUlrdyRKXaE=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/fullscreen/lg-fullscreen.min.js" integrity="sha256-7SXgJ9rT6uPHY7fse2NsZN7Yq96f+9I35bDtUwX8ZHc=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/comment/lg-comment.min.js" integrity="sha256-RszgszIiPRvEWMviw43SzoZwsvKZNbz2Djio7kUemrY=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/autoplay/lg-autoplay.min.js" integrity="sha256-XGqZJI2/fqI+ph7+msYWRIi9NLzsZ2PlhrhltWEUmOM=" crossorigin="anonymous"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/lightgallery.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/zoom/lg-zoom.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/video/lg-video.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/thumbnail/lg-thumbnail.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/rotate/lg-rotate.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/fullscreen/lg-fullscreen.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/comment/lg-comment.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/autoplay/lg-autoplay.min.js"></script>
<script src="https://www.lvshuncai.com/custom/js/clicklove.min.js"></script>
</head>

@ -5,28 +5,28 @@
<link rel="icon" href="https://qzonestyle.gtimg.cn/aoi/img/logo/favicon.ico">
<meta charset="utf-8" name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<title>QQ空间备份-收藏夹</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/font-awesome@4.7.0/css/font-awesome.min.css" integrity="sha256-eZrrJcwDc/3uDhsdt61sL2oOBY362qM3lon1gyExkL0=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css" integrity="sha384-zCbKRCUGaJDkqS1kPbPd7TveP5iyJE0EjAuZQTgFLD2ylzuqKfdKlfG/eSrtxUkn" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.staticfile.org/font-awesome/4.7.0/css/font-awesome.min.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/bootstrap/4.6.1/css/bootstrap.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/css/lightgallery.css" integrity="sha256-u/8xxXqgHmqInTUqModtj8UvjfzppMhunF8mGI5gpAM=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/css/lightgallery-bundle.min.css" integrity="sha256-S8sL5U5HwTa3JmR1y0ASCyQH111hgvPpKOkYXZHa4sA=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.staticfile.org/lightgallery/2.3.0/css/lightgallery.min.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/lightgallery/2.3.0/css/lightgallery-bundle.min.css">
<link rel="stylesheet" type="text/css" href="../Common/css/common.css">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/jquery-mousewheel@3.1.13/jquery.mousewheel.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-fQybjgWLrvvRgtW6bFlB7jaZrFsaBXjsOMm/tB9LTS58ONXgqbR9W8oWht/amnpF" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js" integrity="sha256-qXBd/EfAdjOA2FGrGAG+b3YBn2tn5A6bhz+LSgYD96k=" crossorigin="anonymous"></script>
<script src="https://cdn.staticfile.org/jquery/3.6.0/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/jquery-mousewheel/3.1.13/jquery.mousewheel.min.js"></script>
<script src="https://cdn.staticfile.org/bootstrap/4.6.1/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.staticfile.org/lodash.js/4.17.21/lodash.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/lightgallery.min.js" integrity="sha256-dkTk5cgrLUjjQiGNZsoDnjhCI+UuhTffLnyrN7qLutw=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/zoom/lg-zoom.min.js" integrity="sha256-6Ny31P8WSBcY1SFaWxg4zgDzZJNNIJ4BchV+RxFiDR0=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/video/lg-video.min.js" integrity="sha256-lkYYtHLEk1Rnr3TOXc/l1tfObPXEzvgKwePG49fZ1Rw=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/thumbnail/lg-thumbnail.min.js" integrity="sha256-X+UxSQGUfsYDhXAsKkzoI2g7Jjn7wWK/vzRfcmYNop4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/rotate/lg-rotate.min.js" integrity="sha256-G1VF4wLKwDc+R5n/GbOkQFhdhGEKXve+GUlrdyRKXaE=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/fullscreen/lg-fullscreen.min.js" integrity="sha256-7SXgJ9rT6uPHY7fse2NsZN7Yq96f+9I35bDtUwX8ZHc=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/autoplay/lg-autoplay.min.js" integrity="sha256-XGqZJI2/fqI+ph7+msYWRIi9NLzsZ2PlhrhltWEUmOM=" crossorigin="anonymous"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/lightgallery.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/zoom/lg-zoom.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/video/lg-video.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/thumbnail/lg-thumbnail.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/rotate/lg-rotate.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/fullscreen/lg-fullscreen.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/autoplay/lg-autoplay.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lazyload@2.0.0-rc.2/lazyload.js"></script>
<script src="https://cdn.jsdelivr.net/npm/template_js@2.2.1/dist/index.aio.min.js" integrity="sha256-gnK+GsIXEBgu/mJouMDtUxXvXM3M0jzxNYmjnlsifgY=" crossorigin="anonymous"></script>
<script src="https://cdn.staticfile.org/jquery_lazyload/2.0.0-rc.2/lazyload.min.js"></script>
<script src="https://fastly.jsdelivr.net/npm/template_js@2.2.1/dist/index.aio.min.js" integrity="sha256-gnK+GsIXEBgu/mJouMDtUxXvXM3M0jzxNYmjnlsifgY=" crossorigin="anonymous"></script>
<script src="https://www.lvshuncai.com/custom/js/clicklove.min.js"></script>
<script type="text/javascript" src="../Common/js/common.js"></script>

@ -5,18 +5,18 @@
<link rel="icon" href="https://qzonestyle.gtimg.cn/aoi/img/logo/favicon.ico">
<meta charset="utf-8" name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<title>QQ空间备份-好友</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/font-awesome@4.7.0/css/font-awesome.min.css" integrity="sha256-eZrrJcwDc/3uDhsdt61sL2oOBY362qM3lon1gyExkL0=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css" integrity="sha384-zCbKRCUGaJDkqS1kPbPd7TveP5iyJE0EjAuZQTgFLD2ylzuqKfdKlfG/eSrtxUkn" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-table@1.19.1/dist/bootstrap-table.min.css" integrity="sha256-ZD9Tb2mCr01yh68j+JrUV91+SoL5xpUzChErCIHDCko=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.staticfile.org/font-awesome/4.7.0/css/font-awesome.min.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/bootstrap/4.6.1/css/bootstrap.min.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/bootstrap-table/1.19.1/bootstrap-table.min.css">
<link rel="stylesheet" type="text/css" href="../Common/css/common.css">
<script src="https://cdn.jsdelivr.net/npm/moment@2.27.0/min/moment.min.js" integrity="sha256-ZsWP0vT+akWmvEMkNYgZrPHKU9Ke8nYBPC3dqONp1mY=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/moment@2.27.0/min/moment-with-locales.min.js" integrity="sha256-wdiCkHJlqyoIJxG49WbDO0D3/EnppQp6GVOGQA6PBkA=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-fQybjgWLrvvRgtW6bFlB7jaZrFsaBXjsOMm/tB9LTS58ONXgqbR9W8oWht/amnpF" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap-table@1.19.1/dist/bootstrap-table.min.js" integrity="sha256-BqVxqb61C9Xd1gUXFZd13+wfPnmP/zj7EXriNQ3Jup0=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap-table@1.19.1/dist/locale/bootstrap-table-zh-CN.min.js" integrity="sha256-pE+tLWBaNzEJufpbligmXg6jcxEHGXrWjQe4rv3yUNY=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/template_js@2.2.1/dist/index.aio.min.js" integrity="sha256-gnK+GsIXEBgu/mJouMDtUxXvXM3M0jzxNYmjnlsifgY=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js" integrity="sha256-qXBd/EfAdjOA2FGrGAG+b3YBn2tn5A6bhz+LSgYD96k=" crossorigin="anonymous"></script>
<script src="https://cdn.staticfile.org/moment.js/2.27.0/moment.min.js"></script>
<script src="https://cdn.staticfile.org/moment.js/2.27.0/locale/zh-cn.min.js"></script>
<script src="https://cdn.staticfile.org/jquery/3.6.0/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/bootstrap/4.6.1/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.staticfile.org/bootstrap-table/1.19.1/bootstrap-table.min.js"></script>
<script src="https://cdn.staticfile.org/bootstrap-table/1.19.1/locale/bootstrap-table-zh-CN.min.js"></script>
<script src="https://fastly.jsdelivr.net/npm/template_js@2.2.1/dist/index.aio.min.js" integrity="sha256-gnK+GsIXEBgu/mJouMDtUxXvXM3M0jzxNYmjnlsifgY=" crossorigin="anonymous"></script>
<script src="https://cdn.staticfile.org/lodash.js/4.17.21/lodash.min.js"></script>
<script src="https://www.lvshuncai.com/custom/js/clicklove.min.js"></script>
<script src="json/friends.js"></script>

@ -5,11 +5,11 @@
<link rel="icon" href="https://qzonestyle.gtimg.cn/aoi/img/logo/favicon.ico">
<meta charset="utf-8" name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<title>QQ空间备份-<%:=user.spacename%></title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css" integrity="sha384-zCbKRCUGaJDkqS1kPbPd7TveP5iyJE0EjAuZQTgFLD2ylzuqKfdKlfG/eSrtxUkn" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.staticfile.org/bootstrap/4.6.1/css/bootstrap.min.css">
<link rel="stylesheet" type="text/css" href="Common/css/common.css">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-fQybjgWLrvvRgtW6bFlB7jaZrFsaBXjsOMm/tB9LTS58ONXgqbR9W8oWht/amnpF" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js" integrity="sha256-qXBd/EfAdjOA2FGrGAG+b3YBn2tn5A6bhz+LSgYD96k=" crossorigin="anonymous"></script>
<script src="https://cdn.staticfile.org/jquery/3.6.0/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/bootstrap/4.6.1/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.staticfile.org/lodash.js/4.17.21/lodash.min.js"></script>
<script src="https://www.lvshuncai.com/custom/js/clicklove.min.js"></script>
</head>

@ -5,27 +5,27 @@
<link rel="icon" href="https://qzonestyle.gtimg.cn/aoi/img/logo/favicon.ico">
<meta charset="utf-8" name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<title>QQ空间备份-说说</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/font-awesome@4.7.0/css/font-awesome.min.css" integrity="sha256-eZrrJcwDc/3uDhsdt61sL2oOBY362qM3lon1gyExkL0=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css" integrity="sha384-zCbKRCUGaJDkqS1kPbPd7TveP5iyJE0EjAuZQTgFLD2ylzuqKfdKlfG/eSrtxUkn" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/css/lightgallery.css" integrity="sha256-u/8xxXqgHmqInTUqModtj8UvjfzppMhunF8mGI5gpAM=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/css/lightgallery-bundle.min.css" integrity="sha256-S8sL5U5HwTa3JmR1y0ASCyQH111hgvPpKOkYXZHa4sA=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.staticfile.org/font-awesome/4.7.0/css/font-awesome.min.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/bootstrap/4.6.1/css/bootstrap.min.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/lightgallery/2.3.0/css/lightgallery.min.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/lightgallery/2.3.0/css/lightgallery-bundle.min.css">
<link rel="stylesheet" type="text/css" href="../Common/css/common.css">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/jquery-mousewheel@3.1.13/jquery.mousewheel.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-fQybjgWLrvvRgtW6bFlB7jaZrFsaBXjsOMm/tB9LTS58ONXgqbR9W8oWht/amnpF" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js" integrity="sha256-qXBd/EfAdjOA2FGrGAG+b3YBn2tn5A6bhz+LSgYD96k=" crossorigin="anonymous"></script>
<script src="https://cdn.staticfile.org/jquery/3.6.0/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/jquery-mousewheel/3.1.13/jquery.mousewheel.min.js"></script>
<script src="https://cdn.staticfile.org/bootstrap/4.6.1/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.staticfile.org/lodash.js/4.17.21/lodash.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/lightgallery.min.js" integrity="sha256-dkTk5cgrLUjjQiGNZsoDnjhCI+UuhTffLnyrN7qLutw=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/zoom/lg-zoom.min.js" integrity="sha256-6Ny31P8WSBcY1SFaWxg4zgDzZJNNIJ4BchV+RxFiDR0=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/video/lg-video.min.js" integrity="sha256-lkYYtHLEk1Rnr3TOXc/l1tfObPXEzvgKwePG49fZ1Rw=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/thumbnail/lg-thumbnail.min.js" integrity="sha256-X+UxSQGUfsYDhXAsKkzoI2g7Jjn7wWK/vzRfcmYNop4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/rotate/lg-rotate.min.js" integrity="sha256-G1VF4wLKwDc+R5n/GbOkQFhdhGEKXve+GUlrdyRKXaE=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/fullscreen/lg-fullscreen.min.js" integrity="sha256-7SXgJ9rT6uPHY7fse2NsZN7Yq96f+9I35bDtUwX8ZHc=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/comment/lg-comment.min.js" integrity="sha256-RszgszIiPRvEWMviw43SzoZwsvKZNbz2Djio7kUemrY=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/autoplay/lg-autoplay.min.js" integrity="sha256-XGqZJI2/fqI+ph7+msYWRIi9NLzsZ2PlhrhltWEUmOM=" crossorigin="anonymous"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/lightgallery.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/zoom/lg-zoom.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/video/lg-video.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/thumbnail/lg-thumbnail.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/rotate/lg-rotate.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/fullscreen/lg-fullscreen.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/comment/lg-comment.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/autoplay/lg-autoplay.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lazyload@2.0.0-rc.2/lazyload.js"></script>
<script src="https://cdn.jsdelivr.net/npm/template_js@2.2.1/dist/index.aio.min.js" integrity="sha256-gnK+GsIXEBgu/mJouMDtUxXvXM3M0jzxNYmjnlsifgY=" crossorigin="anonymous"></script>
<script src="https://cdn.staticfile.org/jquery_lazyload/2.0.0-rc.2/lazyload.min.js"></script>
<script src="https://fastly.jsdelivr.net/npm/template_js@2.2.1/dist/index.aio.min.js" integrity="sha256-gnK+GsIXEBgu/mJouMDtUxXvXM3M0jzxNYmjnlsifgY=" crossorigin="anonymous"></script>
<script src="https://www.lvshuncai.com/custom/js/clicklove.min.js"></script>
<script type="text/javascript" src="../Common/json/config.js"></script>
@ -140,14 +140,14 @@
<!-- 外部视频 -->
<a class="medias-item border message-lightbox-external" href="<%:=API.Videos.getVideoUrl(video)%>" target="_blank">
<span class="message-video"></span>
<img class="lazyload loading w-100 h-100" src="../Common/Images/loading.gif" data-src="<%:=video.custom_pre_filepath || video.custom_pre_url || video.url1%>">
<img class="lazyload loading w-100 h-100" src="../Common/images/loading.gif" data-src="<%:=video.custom_pre_filepath || video.custom_pre_url || video.url1%>">
</a>
<%}else{%>
<!-- 空间视频 -->
<a class="medias-item border message-lightbox" data-idx="<%:=imgIdx%>" data-video='{"source": [{"src":"<%:=(video.custom_filepath || video.custom_url || video.url3)%>", "type":"video/mp4"}],"attributes": {"preload": false, "controls": true}}'
data-poster="<%:=video.custom_pre_filepath || video.custom_pre_url || video.url1%>" data-sub-html="#<%:= 'QZIMG-'+ message.tid%>">
<span class="message-video"></span>
<img class="lazyload loading w-100 h-100" data-id="<%:=video.video_id%>" src="../Common/Images/loading.gif" data-src="<%:=video.custom_pre_filepath || video.custom_pre_url || video.url1%>" />
<img class="lazyload loading w-100 h-100" data-id="<%:=video.video_id%>" src="../Common/images/loading.gif" data-src="<%:=video.custom_pre_filepath || video.custom_pre_url || video.url1%>" />
</a>
<%imgIdx++%>
<%}%>
@ -162,20 +162,20 @@
<!-- 外部视频 -->
<a class="medias-item border message-lightbox-external" href="<%:=API.Videos.getVideoUrl(image.video_info)%>" target="_blank">
<span class="message-video"></span>
<img class="lazyload loading w-100 h-100" src="../Common/Images/loading.gif" data-src="<%:=image.video_info.custom_pre_filepath || image.video_info.custom_pre_url || image.video_info.url1%>">
<img class="lazyload loading w-100 h-100" src="../Common/images/loading.gif" data-src="<%:=image.video_info.custom_pre_filepath || image.video_info.custom_pre_url || image.video_info.url1%>">
</a>
<%}else{%>
<!-- 空间视频 -->
<a class="medias-item border message-lightbox" data-idx="<%:=imgIdx%>" data-video='{"source": [{"src":"<%:=(image.video_info.custom_filepath || image.video_info.custom_url || image.video_info.url3)%>", "type":"video/mp4"}],"attributes": {"preload": false, "controls": true}}'
data-poster="<%:=image.video_info.custom_pre_filepath || image.video_info.custom_pre_url || image.video_info.url1%>" data-sub-html="#<%:= 'QZIMG-'+ message.tid%>">
<span class="message-video"></span>
<img class="lazyload loading w-100 h-100" data-id="<%:=image.video_info.video_id%>" src="../Common/Images/loading.gif" data-src="<%:=image.video_info.custom_pre_filepath || image.video_info.custom_pre_url || image.video_info.url1%>" />
<img class="lazyload loading w-100 h-100" data-id="<%:=image.video_info.video_id%>" src="../Common/images/loading.gif" data-src="<%:=image.video_info.custom_pre_filepath || image.video_info.custom_pre_url || image.video_info.url1%>" />
</a>
<%imgIdx++%>
<%}%>
<%}else{%>
<a class="medias-item border message-lightbox" data-idx="<%:=imgIdx%>" data-src="<%:=(image.custom_filepath || image.custom_url)%>" data-sub-html="#<%:= 'QZIMG-'+ message.tid%>">
<img class="lazyload loading w-100 h-100" data-id="<%:=image.pic_id%>" src="../Common/Images/loading.gif" src="../Common/Images/loading.gif" data-src="<%:=(image.custom_filepath || image.custom_url)%>">
<img class="lazyload loading w-100 h-100" data-id="<%:=image.pic_id%>" src="../Common/images/loading.gif" src="../Common/images/loading.gif" data-src="<%:=(image.custom_filepath || image.custom_url)%>">
</a>
<%imgIdx++%>
<%}%>
@ -293,17 +293,20 @@
</div>
<!-- 说说额外信息 -->
<ul class="message-infos small list-group list-group-flush">
<!-- 坐标信息 -->
<%if(message.lbs && message.lbs.pos_x && message.lbs.pos_y){%>
<li class="list-group-item pl-0">
<a class="fa fa-map-marker" target="_blank" href="<%:=API.Messages.getMapUrl(message.lbs)%>" class="card-link"> <%:=message.lbs.idname || message.lbs.name%></a>
</li>
<%}%>
<!-- 故事信息 -->
<%if(!(!message.story_info || !message.story_info.time || !message.story_info.lbs)){%>
<li class="list-group-item pl-0">
<a class="fa fa-map-marker" target="_blank" href="<%:=API.Messages.getMapUrl(message.story_info.lbs)%>" class="card-link"><%:=message.story_info.lbs.idname || message.story_info.lbs.name%></a>
<span class="fa fa-camera text-muted">拍摄于 <%:=API.Utils.formatDate(message.story_info.time)%> </span>
</li>
<%}%>
<!-- 设备 -->
<%if(message.source_name){%>
<li class="list-group-item pl-0">
<%if(message.source_url){%>
@ -313,6 +316,12 @@
<%}%>
</li>
<%}%>
<!-- 说说来源 -->
<%if(API.Messages.getSourceHTML(message)){%>
<li class="list-group-item pl-0">
<%:=API.Messages.getSourceHTML(message)%>
</li>
<%}%>
</ul>
</div>
<div class="card-footer text-muted">

@ -5,28 +5,28 @@
<link rel="icon" href="https://qzonestyle.gtimg.cn/aoi/img/logo/favicon.ico">
<meta charset="utf-8" name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<title>QQ空间备份-相片</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/font-awesome@4.7.0/css/font-awesome.min.css" integrity="sha256-eZrrJcwDc/3uDhsdt61sL2oOBY362qM3lon1gyExkL0=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css" integrity="sha384-zCbKRCUGaJDkqS1kPbPd7TveP5iyJE0EjAuZQTgFLD2ylzuqKfdKlfG/eSrtxUkn" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/css/lightgallery.css" integrity="sha256-u/8xxXqgHmqInTUqModtj8UvjfzppMhunF8mGI5gpAM=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/css/lightgallery-bundle.min.css" integrity="sha256-S8sL5U5HwTa3JmR1y0ASCyQH111hgvPpKOkYXZHa4sA=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.staticfile.org/font-awesome/4.7.0/css/font-awesome.min.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/bootstrap/4.6.1/css/bootstrap.min.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/lightgallery/2.3.0/css/lightgallery.min.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/lightgallery/2.3.0/css/lightgallery-bundle.min.css">
<link rel="stylesheet" type="text/css" href="../Common/css/common.css">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/jquery-mousewheel@3.1.13/jquery.mousewheel.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-fQybjgWLrvvRgtW6bFlB7jaZrFsaBXjsOMm/tB9LTS58ONXgqbR9W8oWht/amnpF" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js" integrity="sha256-qXBd/EfAdjOA2FGrGAG+b3YBn2tn5A6bhz+LSgYD96k=" crossorigin="anonymous"></script>
<script src="https://cdn.staticfile.org/jquery/3.6.0/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/jquery-mousewheel/3.1.13/jquery.mousewheel.min.js"></script>
<script src="https://cdn.staticfile.org/bootstrap/4.6.1/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.staticfile.org/lodash.js/4.17.21/lodash.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/lightgallery.min.js" integrity="sha256-dkTk5cgrLUjjQiGNZsoDnjhCI+UuhTffLnyrN7qLutw=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/zoom/lg-zoom.min.js" integrity="sha256-6Ny31P8WSBcY1SFaWxg4zgDzZJNNIJ4BchV+RxFiDR0=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/video/lg-video.min.js" integrity="sha256-lkYYtHLEk1Rnr3TOXc/l1tfObPXEzvgKwePG49fZ1Rw=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/thumbnail/lg-thumbnail.min.js" integrity="sha256-X+UxSQGUfsYDhXAsKkzoI2g7Jjn7wWK/vzRfcmYNop4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/rotate/lg-rotate.min.js" integrity="sha256-G1VF4wLKwDc+R5n/GbOkQFhdhGEKXve+GUlrdyRKXaE=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/hash/lg-hash.min.js" integrity="sha256-dZZn/EW966Oyxku9pLIystmhVbAD9QOKtIKtiFCqPQo=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/fullscreen/lg-fullscreen.min.js" integrity="sha256-7SXgJ9rT6uPHY7fse2NsZN7Yq96f+9I35bDtUwX8ZHc=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/comment/lg-comment.min.js" integrity="sha256-RszgszIiPRvEWMviw43SzoZwsvKZNbz2Djio7kUemrY=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/autoplay/lg-autoplay.min.js" integrity="sha256-XGqZJI2/fqI+ph7+msYWRIi9NLzsZ2PlhrhltWEUmOM=" crossorigin="anonymous"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/lightgallery.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/zoom/lg-zoom.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/video/lg-video.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/thumbnail/lg-thumbnail.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/rotate/lg-rotate.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/hash/lg-hash.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/fullscreen/lg-fullscreen.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/comment/lg-comment.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/autoplay/lg-autoplay.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lazyload@2.0.0-rc.2/lazyload.js"></script>
<script src="https://cdn.jsdelivr.net/npm/template_js@2.2.1/dist/index.aio.min.js" integrity="sha256-gnK+GsIXEBgu/mJouMDtUxXvXM3M0jzxNYmjnlsifgY=" crossorigin="anonymous"></script>
<script src="https://cdn.staticfile.org/jquery_lazyload/2.0.0-rc.2/lazyload.min.js"></script>
<script src="https://fastly.jsdelivr.net/npm/template_js@2.2.1/dist/index.aio.min.js" integrity="sha256-gnK+GsIXEBgu/mJouMDtUxXvXM3M0jzxNYmjnlsifgY=" crossorigin="anonymous"></script>
<script src="https://www.lvshuncai.com/custom/js/clicklove.min.js"></script>
<script type="text/javascript" src="../Albums/json/albums.js"></script>
@ -96,7 +96,7 @@
<%if(photo.isLocal){%>
<img class="lazyload loading" />
<%}else{%>
<img class="lazyload loading" src="../Common/Images/loading.gif" data-src="<%:=API.Common.getMediaPath(photo.custom_url, photo.custom_pre_filepath,'Photos_HTML')%>" />
<img class="lazyload loading" src="../Common/images/loading.gif" data-src="<%:=API.Common.getMediaPath(photo.custom_url, photo.custom_pre_filepath,'Photos_HTML')%>" />
<%}%>
</a>
<div class="card-body text-truncate">
@ -112,7 +112,7 @@
</div>
<%}else{%>
<a class="lightbox" href="<%:=API.Common.getMediaPath(photo.custom_url, photo.custom_filepath, 'Photos_HTML')%>" data-toggle="tooltip" data-html="true" title="<%:=photo.desc || photo.name%>" data-sub-html="#<%:=photo.uid%>">
<img class="lazyload loading card-img" height="225px" src="../Common/Images/loading.gif" data-src="<%:=API.Common.getMediaPath(photo.custom_url, photo.custom_pre_filepath || photo.custom_filepath, 'Photos_HTML')%>">
<img class="lazyload loading card-img" height="225px" src="../Common/images/loading.gif" data-src="<%:=API.Common.getMediaPath(photo.custom_url, photo.custom_pre_filepath || photo.custom_filepath, 'Photos_HTML')%>">
</a>
<div class="card-body text-truncate">
<span class="card-title" data-toggle="tooltip" data-html="true" title="<%:=(API.Common.formatContent(photo.name, 'HTML', false, false) || API.Utils.formatDate(photo.uploadtime || photo.uploadTime))%>"><%:=(API.Common.formatContent(photo.name, 'HTML', false, false) || API.Utils.formatDate(photo.uploadtime || photo.uploadTime))%></span>

@ -5,27 +5,27 @@
<link rel="icon" href="https://qzonestyle.gtimg.cn/aoi/img/logo/favicon.ico">
<meta charset="utf-8" name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<title>QQ空间备份-分享</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/font-awesome@4.7.0/css/font-awesome.min.css" integrity="sha256-eZrrJcwDc/3uDhsdt61sL2oOBY362qM3lon1gyExkL0=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css" integrity="sha384-zCbKRCUGaJDkqS1kPbPd7TveP5iyJE0EjAuZQTgFLD2ylzuqKfdKlfG/eSrtxUkn" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/css/lightgallery.css" integrity="sha256-u/8xxXqgHmqInTUqModtj8UvjfzppMhunF8mGI5gpAM=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/css/lightgallery-bundle.min.css" integrity="sha256-S8sL5U5HwTa3JmR1y0ASCyQH111hgvPpKOkYXZHa4sA=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.staticfile.org/font-awesome/4.7.0/css/font-awesome.min.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/bootstrap/4.6.1/css/bootstrap.min.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/lightgallery/2.3.0/css/lightgallery.min.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/lightgallery/2.3.0/css/lightgallery-bundle.min.css">
<link rel="stylesheet" type="text/css" href="../Common/css/common.css">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-fQybjgWLrvvRgtW6bFlB7jaZrFsaBXjsOMm/tB9LTS58ONXgqbR9W8oWht/amnpF" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js" integrity="sha256-qXBd/EfAdjOA2FGrGAG+b3YBn2tn5A6bhz+LSgYD96k=" crossorigin="anonymous"></script>
<script src="https://cdn.staticfile.org/jquery/3.6.0/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/bootstrap/4.6.1/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.staticfile.org/lodash.js/4.17.21/lodash.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/lightgallery.min.js" integrity="sha256-dkTk5cgrLUjjQiGNZsoDnjhCI+UuhTffLnyrN7qLutw=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/zoom/lg-zoom.min.js" integrity="sha256-6Ny31P8WSBcY1SFaWxg4zgDzZJNNIJ4BchV+RxFiDR0=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/video/lg-video.min.js" integrity="sha256-lkYYtHLEk1Rnr3TOXc/l1tfObPXEzvgKwePG49fZ1Rw=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/thumbnail/lg-thumbnail.min.js" integrity="sha256-X+UxSQGUfsYDhXAsKkzoI2g7Jjn7wWK/vzRfcmYNop4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/rotate/lg-rotate.min.js" integrity="sha256-G1VF4wLKwDc+R5n/GbOkQFhdhGEKXve+GUlrdyRKXaE=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/fullscreen/lg-fullscreen.min.js" integrity="sha256-7SXgJ9rT6uPHY7fse2NsZN7Yq96f+9I35bDtUwX8ZHc=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/comment/lg-comment.min.js" integrity="sha256-RszgszIiPRvEWMviw43SzoZwsvKZNbz2Djio7kUemrY=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/autoplay/lg-autoplay.min.js" integrity="sha256-XGqZJI2/fqI+ph7+msYWRIi9NLzsZ2PlhrhltWEUmOM=" crossorigin="anonymous"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/lightgallery.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/zoom/lg-zoom.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/video/lg-video.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/thumbnail/lg-thumbnail.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/rotate/lg-rotate.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/fullscreen/lg-fullscreen.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/comment/lg-comment.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/autoplay/lg-autoplay.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/jquery-mousewheel@3.1.13/jquery.mousewheel.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lazyload@2.0.0-rc.2/lazyload.js"></script>
<script src="https://cdn.jsdelivr.net/npm/template_js@2.2.1/dist/index.aio.min.js" integrity="sha256-gnK+GsIXEBgu/mJouMDtUxXvXM3M0jzxNYmjnlsifgY=" crossorigin="anonymous"></script>
<script src="https://cdn.staticfile.org/jquery-mousewheel/3.1.13/jquery.mousewheel.min.js"></script>
<script src="https://cdn.staticfile.org/jquery_lazyload/2.0.0-rc.2/lazyload.min.js"></script>
<script src="https://fastly.jsdelivr.net/npm/template_js@2.2.1/dist/index.aio.min.js" integrity="sha256-gnK+GsIXEBgu/mJouMDtUxXvXM3M0jzxNYmjnlsifgY=" crossorigin="anonymous"></script>
<script src="https://www.lvshuncai.com/custom/js/clicklove.min.js"></script>
<script type="text/javascript" src="../Common/json/config.js"></script>

@ -5,29 +5,29 @@
<link rel="icon" href="https://qzonestyle.gtimg.cn/aoi/img/logo/favicon.ico">
<meta charset="utf-8" name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<title>QQ空间备份-视频</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/font-awesome@4.7.0/css/font-awesome.min.css" integrity="sha256-eZrrJcwDc/3uDhsdt61sL2oOBY362qM3lon1gyExkL0=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css" integrity="sha384-zCbKRCUGaJDkqS1kPbPd7TveP5iyJE0EjAuZQTgFLD2ylzuqKfdKlfG/eSrtxUkn" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/css/lightgallery.css" integrity="sha256-u/8xxXqgHmqInTUqModtj8UvjfzppMhunF8mGI5gpAM=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/css/lightgallery-bundle.min.css" integrity="sha256-S8sL5U5HwTa3JmR1y0ASCyQH111hgvPpKOkYXZHa4sA=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.staticfile.org/font-awesome/4.7.0/css/font-awesome.min.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/bootstrap/4.6.1/css/bootstrap.min.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/lightgallery/2.3.0/css/lightgallery.min.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/lightgallery/2.3.0/css/lightgallery-bundle.min.css">
<link rel="stylesheet" type="text/css" href="../Common/css/common.css">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/jquery-mousewheel@3.1.13/jquery.mousewheel.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-fQybjgWLrvvRgtW6bFlB7jaZrFsaBXjsOMm/tB9LTS58ONXgqbR9W8oWht/amnpF" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js" integrity="sha256-qXBd/EfAdjOA2FGrGAG+b3YBn2tn5A6bhz+LSgYD96k=" crossorigin="anonymous"></script>
<script src="https://cdn.staticfile.org/jquery/3.6.0/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/jquery-mousewheel/3.1.13/jquery.mousewheel.min.js"></script>
<script src="https://cdn.staticfile.org/bootstrap/4.6.1/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.staticfile.org/lodash.js/4.17.21/lodash.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/lightgallery.min.js" integrity="sha256-dkTk5cgrLUjjQiGNZsoDnjhCI+UuhTffLnyrN7qLutw=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/zoom/lg-zoom.min.js" integrity="sha256-6Ny31P8WSBcY1SFaWxg4zgDzZJNNIJ4BchV+RxFiDR0=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/video/lg-video.min.js" integrity="sha256-lkYYtHLEk1Rnr3TOXc/l1tfObPXEzvgKwePG49fZ1Rw=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/thumbnail/lg-thumbnail.min.js" integrity="sha256-X+UxSQGUfsYDhXAsKkzoI2g7Jjn7wWK/vzRfcmYNop4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/rotate/lg-rotate.min.js" integrity="sha256-G1VF4wLKwDc+R5n/GbOkQFhdhGEKXve+GUlrdyRKXaE=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/hash/lg-hash.min.js" integrity="sha256-dZZn/EW966Oyxku9pLIystmhVbAD9QOKtIKtiFCqPQo=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/fullscreen/lg-fullscreen.min.js" integrity="sha256-7SXgJ9rT6uPHY7fse2NsZN7Yq96f+9I35bDtUwX8ZHc=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/comment/lg-comment.min.js" integrity="sha256-RszgszIiPRvEWMviw43SzoZwsvKZNbz2Djio7kUemrY=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.3.0/plugins/autoplay/lg-autoplay.min.js" integrity="sha256-XGqZJI2/fqI+ph7+msYWRIi9NLzsZ2PlhrhltWEUmOM=" crossorigin="anonymous"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/lightgallery.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/zoom/lg-zoom.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/video/lg-video.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/thumbnail/lg-thumbnail.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/rotate/lg-rotate.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/hash/lg-hash.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/fullscreen/lg-fullscreen.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/comment/lg-comment.min.js"></script>
<script src="https://cdn.staticfile.org/lightgallery/2.3.0/plugins/autoplay/lg-autoplay.min.js"></script>
<script src="https://www.lvshuncai.com/custom/js/clicklove.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lazyload@2.0.0-rc.2/lazyload.js"></script>
<script src="https://cdn.jsdelivr.net/npm/template_js@2.2.1/dist/index.aio.min.js" integrity="sha256-gnK+GsIXEBgu/mJouMDtUxXvXM3M0jzxNYmjnlsifgY=" crossorigin="anonymous"></script>
<script src="https://cdn.staticfile.org/jquery_lazyload/2.0.0-rc.2/lazyload.min.js"></script>
<script src="https://fastly.jsdelivr.net/npm/template_js@2.2.1/dist/index.aio.min.js" integrity="sha256-gnK+GsIXEBgu/mJouMDtUxXvXM3M0jzxNYmjnlsifgY=" crossorigin="anonymous"></script>
<script type="text/javascript" src="json/videos.js"></script>
</head>
@ -80,7 +80,7 @@
<a class="lightbox" data-video='{"source": [{"src":"<%:=(video.custom_filepath || video.custom_url || video.url)%>", "type":"video/mp4"}],"attributes": {"preload": false, "controls": true}}'
data-poster="<%:=API.Common.getMediaPath(video.pre || video.custom_pre_url, video.custom_pre_filepath)%>" data-toggle="tooltip" data-html="true" title="<%:=video.desc || video.name%>" data-sub-html="#<%:=video.uid%>">
<span class="photo-video"></span>
<img class="lazyload loading" src="../Common/Images/loading.gif" data-src="<%:=API.Common.getMediaPath(video.pre || video.custom_pre_url, video.custom_pre_filepath)%>" />
<img class="lazyload loading" src="../Common/images/loading.gif" data-src="<%:=API.Common.getMediaPath(video.pre || video.custom_pre_url, video.custom_pre_filepath)%>" />
</a>
<div class="card-body text-truncate">
<span class="card-title" data-toggle="tooltip" data-html="true" title="<%:=API.Common.formatContent(video.desc || API.Utils.formatDate(video.uploadTime)) %>"><%:=API.Common.formatContent(video.desc || API.Utils.formatDate(video.uploadTime)) %></span>

@ -5,17 +5,15 @@
<link rel="icon" href="https://qzonestyle.gtimg.cn/aoi/img/logo/favicon.ico">
<meta charset="utf-8" name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<title>QQ空间备份-访客</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/font-awesome@4.7.0/css/font-awesome.min.css" integrity="sha256-eZrrJcwDc/3uDhsdt61sL2oOBY362qM3lon1gyExkL0=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css" integrity="sha384-zCbKRCUGaJDkqS1kPbPd7TveP5iyJE0EjAuZQTgFLD2ylzuqKfdKlfG/eSrtxUkn" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/lightgallery@1.6.14/dist/css/lightgallery.min.css" integrity="sha256-8rfHbJr+ju3Oc099jFJMR1xAPu8CTPHU8uP5J3X/VAY=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.staticfile.org/font-awesome/4.7.0/css/font-awesome.min.css">
<link rel="stylesheet" href="https://cdn.staticfile.org/bootstrap/4.6.1/css/bootstrap.min.css">
<link rel="stylesheet" type="text/css" href="../Common/css/common.css">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-fQybjgWLrvvRgtW6bFlB7jaZrFsaBXjsOMm/tB9LTS58ONXgqbR9W8oWht/amnpF" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@1.6.14/dist/js/lightgallery-all.min.js" integrity="sha256-0q70xbZ3GMwdiseCj/wfChJhq/3wzpNdgZinlSxSw14=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/jquery-mousewheel@3.1.13/jquery.mousewheel.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lazyload@2.0.0-rc.2/lazyload.js"></script>
<script src="https://cdn.jsdelivr.net/npm/template_js@2.2.1/dist/index.aio.min.js" integrity="sha256-gnK+GsIXEBgu/mJouMDtUxXvXM3M0jzxNYmjnlsifgY=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js" integrity="sha256-qXBd/EfAdjOA2FGrGAG+b3YBn2tn5A6bhz+LSgYD96k=" crossorigin="anonymous"></script>
<script src="https://cdn.staticfile.org/jquery/3.6.0/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/bootstrap/4.6.1/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.staticfile.org/jquery-mousewheel/3.1.13/jquery.mousewheel.min.js"></script>
<script src="https://cdn.staticfile.org/jquery_lazyload/2.0.0-rc.2/lazyload.min.js"></script>
<script src="https://fastly.jsdelivr.net/npm/template_js@2.2.1/dist/index.aio.min.js" integrity="sha256-gnK+GsIXEBgu/mJouMDtUxXvXM3M0jzxNYmjnlsifgY=" crossorigin="anonymous"></script>
<script src="https://cdn.staticfile.org/lodash.js/4.17.21/lodash.min.js"></script>
<script src="https://www.lvshuncai.com/custom/js/clicklove.min.js"></script>
<script type="text/javascript" src="json/visitors.js"></script>
@ -84,7 +82,7 @@
<span><%:=API.Utils.formatDate(item.time,'hh:mm')%></span>
</div>
<div class="timeline2-icon">
<a href="<%:=API.Common.getUserUrl(item.uin)%>" target="_blank">
<a class="avatar" href="<%:=API.Common.getUserUrl(item.uin)%>" target="_blank">
<img class="lazyload loading w-100 h-100 border rounded-circle" data-src="<%:=API.Common.getUserLogoUrl(item.uin)%>" src="<%:=API.Common.getUserLogoUrl(item.uin)%>"></i>
</a>
</div>

@ -0,0 +1,18 @@
.rc-handle-container {
position: relative;
}
.rc-handle {
position: absolute;
width: 7px;
cursor: ew-resize;
margin-left: -3px;
z-index: 2;
}
table.rc-table-resizing {
cursor: ew-resize;
}
table.rc-table-resizing thead,
table.rc-table-resizing thead > th,
table.rc-table-resizing thead > th > a {
cursor: ew-resize;
}

File diff suppressed because one or more lines are too long

@ -0,0 +1,40 @@
@CHARSET "UTF-8";
/************************************/
.mask-hidden {
overflow: hidden !important;
}
.mask-relative {
position: relative;
}
.mask-backdrop {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
z-index: 1000;
background-color: #ccc;
opacity: 0.5;
filter: alpha(opacity = 50);
}
.mask-icon {
position: absolute;
z-index: 1001;
top: 0;
left: 0;
cursor: wait;
}
.mask-backdrop-fixed {
position: fixed;
z-index: 999999999;
}
.mask-icon-fixed {
position: fixed;
z-index: 999999999;
}

@ -0,0 +1,273 @@
;
(function(root, factory) {
if (typeof define === 'function' && define.amd) {
// AMD
define([ 'jquery', './jquery.loadmask.css' ], factory);
} else if (typeof exports === 'object') {
require("./jquery.loadmask.css");
// Node, CommonJS之类的
module.exports = factory(require('jquery'));
} else {
// 浏览器全局变量(root 即 window)
root.returnExports = factory(root.jQuery);
}
}(this, function($) {
// 需要调整大小的遮罩元素
var $mask_elements = [];
// 窗口调整大小定时器
var mask_resize_timer;
$(window).on("resize.mask", function() {
mask_resize_timer && clearTimeout(mask_resize_timer);
mask_resize_timer = setTimeout(function() {
var $body = $(document.body);
if ($body.hasClass("mask"))
reposIcon($body, $body.find("> .mask-icon"));
for (var i = 0, l = $mask_elements.length; i < l; i++) {
var $ele = $mask_elements[i];
var $maskEle = $ele;
if (!$ele.hasClass("mask")) {
$maskEle = $ele.parent();
$maskEle.css({
width : "",
height : ""
});
$maskEle.width($ele.outerWidth());
$maskEle.height($ele.outerHeight());
}
reposIcon($maskEle, $maskEle.find("> .mask-icon"));
}
}, 20);
});
// 有些元素需要包装一层DIV去执行MASK
function isElementAskDiv($ele) {
var tagName = $ele[0].tagName;
if (tagName == 'TABLE')
return true;
return false;
}
function calMaskElementRect($ele) {
if ($ele[0].tagName == 'BODY') {
var width = window.innerWidth, height = window.innerHeight;
if (typeof width != 'number') {// IE 5/6/7/8
if (document.compatMode == 'CSS1Compat') {
width = document.documentElement.clientWidth;
height = document.docuementElement.clientHeight;
} else {
width = document.body.clientWidth;
height = document.body.clientHeight;
}
}
return {
width : width,
height : height
};
}
return {
height : $ele.outerHeight(),
width : $ele.outerWidth()
};
}
function reposIcon($maskEle, $icon) {
var windowRect = calMaskElementRect($maskEle);
var width = windowRect.width, height = windowRect.height;
var iheight = $icon.outerHeight(), iwidth = $icon.outerWidth();
var top = (height - iheight) / 2, left = (width - iwidth) / 2;
$icon.css({
top : top + "px",
left : left + "px"
});
}
// DIV等容器性元素
function maskElement($ele, options) {
if ($ele[0].tagName == 'BODY')
return maskBody($ele, options);
var maskCount = ($ele.data("masked") || 0) + 1;
$ele.data("masked", maskCount);
// 已经开启遮罩了,
if (maskCount > 1)
return;
options.iconCls = options.iconCls || "fa fa-spinner fa-spin fa-3x";
var $maskEle = $ele;
$mask_elements.push($ele);
if (isElementAskDiv($ele)) {
$maskEle = $ele.wrap('<div></div>').parent();
$maskEle.width($ele.outerWidth());
$maskEle.height($ele.outerHeight());
}
$maskEle.addClass("mask mask-hidden");
$maskEle.css("position") == 'static'
&& $maskEle.addClass("mask-relative");
var $mask = $('<div class="mask-backdrop"></div>').appendTo($maskEle);
var $icon = $('<i class="mask-icon ' + options.iconCls + '"></i>')
.appendTo($maskEle);
reposIcon($maskEle, $icon);
}
function unMaskElement($ele) {
if ($ele[0].tagName == 'BODY')
return unMaskBody($ele);
var maskCount = ($ele.data("masked") || 0) - 1;
// 从来没遮罩过
if (maskCount > 0)
return $ele.data("masked", maskCount);
$ele.removeData("masked");
var $maskEle = $ele.hasClass("mask") ? $ele : $ele.parent();
$maskEle.removeClass("mask mask-relative mask-hidden");
$maskEle.find("> .mask-backdrop").remove();
$maskEle.find("> .mask-icon").remove();
// 窗口缩放监听从数组中移除出去
for (var i = 0, l = $mask_elements.length; i < l; i++)
if ($mask_elements[i].get(0) == $maskEle[0])
$mask_elements.splice(i, 1);
}
function maskBody($ele, options) {
if ($ele[0].tagName != 'BODY')
return maskElement($ele, options);
var maskCount = ($ele.data("masked") || 0) + 1;
$ele.data("masked", maskCount);
// 已经开启遮罩了,
if (maskCount > 1)
return;
options.iconCls = options.iconCls || "fa fa-spinner fa-spin fa-5x";
var $maskEle = $ele.addClass("mask");
var $mask = $('<div class="mask-backdrop mask-backdrop-fixed"></div>')
.appendTo($maskEle);
var $icon = $(
'<i class="mask-icon mask-icon-fixed ' + options.iconCls
+ '"></i>').appendTo($maskEle);
reposIcon($maskEle, $icon);
}
function unMaskBody($ele) {
if ($ele[0].tagName != 'BODY')
return unMaskElement($ele);
var maskCount = ($ele.data("masked") || 0) - 1;
// 从来没遮罩过
if (maskCount > 0)
return $ele.data("masked", maskCount);
var $maskEle = $ele.removeData("masked");
$maskEle.removeClass("mask");
$maskEle.find("> .mask-backdrop").remove();
$maskEle.find("> .mask-icon").remove();
}
$.fn.mask = function(options) {
options = options || {};
$(this).each(function() {
maskElement($(this), options);
});
};
$.fn.unmask = function() {
$(this).each(function() {
unMaskElement($(this));
});
};
$.fn.isMasked = function() {
return (this.data("masked") || 0) > 1;
};
return $;
}));

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long
Loading…
Cancel
Save