Fork me on GitHub

七牛云图床外链失效后的重新下载方法

前言

一直以来我的 Hexo 博客 的图片都放在七牛云的对象存储中,通过其提供的链接来访问。由于七牛取消了测试域名的免费使用,导致博客中的图片都无法正常显示,继续使用七牛的话需要一个已经备案的域名,无奈只能放弃。这篇文章记录从七牛空间中批量下载图片文件的过程。

下载七牛云中保存的文件

1. 使用七牛提供的工具(qrsctl)

注:window 下载后文件名为 qrsctl-v3.2.20170501

  1. 使用如下命令登录

    1
    qrsctl-v3.2.20170501 login <User> <Passwd>
  2. 进入对象存储空间:

    1
    qrsctl-v3.2.20170501 buckets
  3. 查看空间中的图片

    1
    qrsctl-v3.2.20170501 listprefix <空间名> ""

    可以看到文件列表

    1
    2
    3
    4
    5
    6
    7
    8
    9
    marker:
    17-1-14/10038807-file_1484368678860_b99e.png
    17-1-14/12057450-file_1484368445392_1304.png
    17-1-14/16481236-file_1484368665443_9e5a.png
    17-1-14/20779378-file_1484369378883_2419.png
    17-1-14/2119039-file_1484368662478_10338.png
    17-1-14/30903876-file_1484368712279_a685.png
    17-1-14/32657150-file_1484368828842_d411.pn
    .....
  4. 下载某个文件

    1
    qrsctl-v3.2.20170501 get <空间名> <文件名> ./文件名

2. 批量下载

知道怎么下载单个文件之后,写个脚本根据文件列表批量下载每个文件到本机即可,参考七牛云图床链接失效解决方案的代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# -*- coding: utf-8 -*-
import os
# list all your buckets
print("存储空间列表(buckets): ")
os.system('qrsctl-v3.2.20170501 buckets')
print('\n\n')
bucket = input("input your bucket: ")
# install images information of bucket
cmd = 'qrsctl-v3.2.20170501 listprefix {} "" > out_file.txt'.format(bucket)
os.system(cmd)
# remove first line 'marker: '
with open('out_file.txt','r',encoding='utf-8') as fin:
data = fin.read().splitlines(True)
with open('out_file.txt','w',encoding='utf-8') as fout:
fout.writelines(data[1:])
# mkdir folder of bucket to store images
os.mkdir('./{}'.format(bucket))
# dowdload images cmd
cmd_dowdload='qrsctl-v3.2.20170501 get {0} {1} ./{0}/{1}'
with open('out_file.txt','r',encoding='utf-8') as f:
# remove \n
image = f.readline().strip()
number=1
while image:
# load file
tmp=cmd_dowdload.format(bucket,image)
print("the {} image dowdloading...".format(number))
os.system(tmp)
# next image
image = f.readline().strip()
number = number + 1

由于之前博客图片都是通过极简图床插件来上传的,默认通过上传时间进行文件分类,如17-1-14/10038807-file_1484368678860_b99e.png,所以在下载文件的时候本地没有相应文件夹就会出错,在代码中处理以下即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# dowdload images cmd
cmd_dowdload='qrsctl-v3.2.20170501 get {0} {1} ./{0}/{2}'
with open('out_file.txt','r',encoding='utf-8') as f:
# remove \n
image = f.readline().strip()
number=1
while image:
# load file
image_out = image.split('/')[1]
tmp=cmd_dowdload.format(bucket,image,image_out)
print("the {} image dowdloading...".format(number))
os.system(tmp)
# next image
image = f.readline().strip()
number = number + 1
------------- The endThanks for reading-------------