批量下载七牛云图片并更新博客图片链接

本文主要解决两个问题:

  1. 将七牛云bucket中的图片批量下载回本地,并放入相应的文件夹;
  2. 批量更新markdown文件中的图片链接,重新部署到云端。

一年余来,被Windows Insider坑到重装系统之后,就没搞过hexo博客。近期重装部署了一下,发现步骤还是非常快的。

然后发现七牛云图床的图片全部不能显示了。这一年由于忙其他事情,七牛云发过来的关于测试域名过期的邮件也没有认真看。

当年七牛云还是一个比较主流的图床,使用者众,所以网上也有很多补救的方法。有相当一部分博主是把换用腾讯云作为图床。去腾讯云看了一下,发现现在只能免费半年了。还有一部分绑定了备案域名。

我的博客是Coding.net和Github两地部署 ,其中Github一直是无限容量,而Coding.net刚好出了新政策,升高到腾讯云开发者平台也能有无限容量。于是先试用 不使用外部图床 的方案。

思路很清晰,先从把七牛云的图片批量下载回本地,放入文章对应的文件夹,更新markdown文件中的图片链接,重新部署到云端。这是markdown中本地和线上图片自动传图床并替换链接 的反向操作,那应该也可以使用python解决。

搜索了一番,居然没有现成的代码。大多数人是使用七牛云的qshell工具来下载图片,这种方法下载的图片都在本地的一个文件夹里面,遇到重名的图片不知道怎么解决,后期整理再更新链接还很麻烦。感觉花了太多时间搜索,其实七牛云官方就有关于Python SDK的详细文档(写得甚至比腾讯云Python SDK文档还好)。《Hexo博客(23)弃用七牛云图床改为git仓库图床》这篇文章解释了这个SDK怎么用。

接下来讲讲具体的操作:

一、将过期bucket中的图片批量复制到新bucket

由于原先图床的bucket测试域名已过期,没办法直接下载其中的图片,需要先将图片转移到新bucket。

根据官方提供的批量查询文件信息批量复制文件两段python代码,分步测试,直接拼成我们需要的代码。

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
42
43
44
45
46
47
48
# -*- coding: utf-8 -*-
# flake8: noqa

"""
python获取指定bucket中的文件列表
获取指定前缀文件列表
https://developer.qiniu.com/kodo/sdk/1242/python#rs-list
"""

from qiniu import Auth
from qiniu import BucketManager,build_batch_copy

access_key = ''
secret_key = ''

q = Auth(access_key, secret_key)
bucket = BucketManager(q)

bucket_name = '' # 填入旧的bucket名
# 前缀
prefix = None
# 列举条目
limit = 200
# 列举出除'/'的所有文件以及以'/'为分隔的所有前缀
delimiter = None
# 标记
marker = None

ret, eof, info = bucket.list(bucket_name, prefix, marker, limit, delimiter)

print(info)
print('')

assert len(ret.get('items')) is not None
file_count = 0 #用于计算复制了多少文件
keys = {}
for i in ret['items']:
print(i['key'])
file_count = file_count +1
keys[i['key']] = i['key'] # 原文件名key与目标文件同名,所以构建一个key=value的字典
print(file_count)
print(keys)

target_bucket_name = 'bucketnew' # 新的bucket名
# force为true时强制同名覆盖, 字典的键为原文件,值为目标文件
ops = build_batch_copy(bucket_name, keys, target_bucket_name, force='true')
ret, info = bucket.batch(ops)
print(info)

在七牛云的后台可以看到运行成功的结果。我的bucket中有100多个文件(后续的操作得知有80个图片),一共就7点几MB,手工搞链接还是比较繁琐的。

运行结果大概如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
2017-11-11_zgtvi0
201711-test.png
201711111555_629.png
201711111557_865.png
20171116_VMware-Horizon-View-Client(虚拟桌面)常问问题/1
20171116_VMware-Horizon-View-Client(虚拟桌面)常问问题/10
20171116_VMware-Horizon-View-Client(虚拟桌面)常问问题/11
……
20171116_VMware-Horizon-View-Client(虚拟桌面)常问问题/8
20171116_VMware-Horizon-View-Client(虚拟桌面)常问问题/9
20171125_健迅HIS系统的4个实用技巧/image1
20171125_健迅HIS系统的4个实用技巧/image10
……

注意bucket的文件的key并不就是文件名,有时还包含了路径(子文件夹)。

由于搞博客时搞过几个版本的图片命名方式,所以图床的图片名有几个版本,后期的版本还没有图片后缀。幸好在没有后缀的情况下,浏览器和图片查看软件也能解析

二、下载图片、替换链接

hexo启用了文章资源文件夹之后,文章的图片是放在同名文件夹中,markdown写作时使用![](文件名\图片名) 引用。网上别人文章的解决思路多是先批量下载图片、再去放置图片和修改链接,实际去匹配图片和链接也麻烦。而我的思路如下:

Chalkit wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!
坚持原创技术分享,您的支持将鼓励我继续创作!