起因

七牛回收测试域名

最近七牛在回收qbox.me的测试子域名,然而很不幸博客图床当初注册七牛使用的是匿名邮箱,转发后全进了垃圾箱。关注到这个事情的时候域名已经回收。

更尴尬的是,如果存储空间绑定的七牛测试域名被回收,不仅无法访问资源,而且登录到七牛后台也是无法查看和下载COS中的文件。除非新绑定融合CDN域名且主域通过备案(即使只用海外CDN加速节点)。

由于短期内没有做这事的计划,所以决定将博客的静态资源和图片从七牛迁移到其他图床,不过首先得导出COS上的存量文件。

未绑定域名的七牛存储空间文件导出

创建新的存储空间

由于源空间已经没有域名了,在不绑定自定义域名的情况下是无法获取到COS的文件的。
而新创建的存储空间会带一个30天有效期的七牛测试域名(见七牛文档:测试域名使用规范)
所以可以新创建一个存储空间,将源空间下的资源复制到新空间中,借用新空间的测试域名,将资源拉取出来。

在管理后台新建一个公开的存储空间,假定创建的空间名是target-bucket,存储区域选择和源空间相同,就能在空间概览-融合CDN测试域名中看到测试域名了,这个域名后面批量下载时会用到。

使用qshell导出文件

七牛的qshell是利用七牛文档上公开的API实现的一个方便开发者测试和使用七牛API服务的命令行工具,文档可见:https://github.com/qiniu/qshell
添加账户鉴权信息(AK/SK)照文档说明即可,这里略去不提。

1,导出源空间下的所有文件清单

使用listbucket命令,如果文件实在太多的话也可以考虑用listbucket2

这里假定要导出的源空间名称是source-bucket,导出的清单文件名是backup.log

1
qshell -m listbucket source-bucket backup.log

2.提取清单文件中的路径

清单文件大致是这样的格式:

1
2
3
4
hello.jpg	1710619	FlUqUK7zqbqm3NPwzq2q7TMZ-Ijs	14209629320769140	image/jpeg  1
hello.mp4 8495868 lns2dAHvO0qYseZFgDn3UqZlMOi- 14207312835630132 video/mp4 0
hhh 1492031 FjiRl_U0AeSsVCHXscCGObKyMy8f 14200176147531840 image/jpeg 1
jemygraw.jpg 1900176 FtmHAbztWfPEqPMv4t4vMNRYMETK 14208960018750329 application/octet-stream 1 QiniuAndroid

后续步骤只需要路径字段,可以在IDE里用正则匹配过滤一下,并将分组1整理输出来:

1
^([^\s]+)\s+.+\n

因为路径字段在第一列,也可以直接使用awk命令更为方便(这里排除了第一行表头):

1
awk 'NR>1 {print $1}' backup.log > file-list.log

整理的文件路径清单保存在file-list.log

3.将清单中的文件拷贝到新的存储空间

使用qshell的https://github.com/qiniu/qshell/blob/master/docs/batchcopy.md命令,将清单文件从源空间拷贝到目标空间:

1
qshell -m batchcopy source-bucket target-bucket file-list.log

这一步会要求输入一个验证码来确认操作,按指示说明即可。

4.批量下载文件

其实到了这一步,已经能在后台管理页面的新存储空间target-bucket中看到文件并手动下载了
当然如果不愿意一个个手动下载的话,可以使用qdownload命令批量下载。
在下载之前需要先创建一个下载配置文件:

1
2
3
4
5
6
7
8
{
"cdn_domain" : "xxx.bkt.clouddn.com",//cdn域名,即新创建的存储空间分配的测试域名
"dest_dir" : "/path/to/downloadDir",//批量下载的目标目录
"bucket" : "target-bucket",//存储空间名称
"log_file" : "download.log",//下载日志输出文件
"log_level" : "info",//下载日志输出级别
"log_stdout" : true
}

注意上述配置中需要设置cdn_domain才可以使用七牛的10G免费流量

10线程并发下载:

1
qshell -m qdownload 10 qdisk_down.conf

这样就成功把存储空间下的所有文件下载到本地了

新图床选择

新图床的选择花费了一点时间,各方面了解了下以后,决定利用现有闲置资源将OneDrive改造为一个私人图床,比较成熟的解决方案是OneIndex,大致看了下实现方式:

  • 通过创建Azure AD应用程序,获取OneDrive的SharePoint Online访问授权
  • OneIndex应用程序通过留存的refreshToken,定时刷新维护accessToken
  • 在网盘中维护单独的目录结构,访问资源时通过302跳转到解析的对应资源文件访问路径,且携带临时的资源访问授权信息

而且这东西也有Docker,部署起来更为方便。