图床一键迁移脚本

前段时间更换了图床的位置,决定把之前博客里的所有图片统一转移到新图床。But一张一张手动上传也未免太痛苦和呆逼了,所以决定用脚本实现统一上传。正好,亲爱的zhullyb也在更换图床,遂直接搬运了他的脚本

批量迁移脚本

zhullyb的原文

脚本内容展示如下:

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import os
import re
import requests

# 哪些后缀的文件需要检测是否存在老图床的 URL 并进行迁移?
file_extension = [
'.md',
'.yml',
'.html'
]

pic_urls = []

_files = []


# 修改后的正则表达式,用于匹配 Markdown 图片链接
pattern = r'!\[.*?\]\((.*?)\)'

# 图片的上传部分,需要先从原 url 中下载图片,在上传到新图床中,如果需要的话可以在中途转换为 webp 格式
def upload(url):
"""
此处的返回值应该是新的 url
"""

# 遍历目标后缀文件名的文件,如果存在老图床的 url,则将 url 加入到 pic_urls 列表中,并将这个文件的文件名(相对路径)添加到 _files 列表中
for root, dirs, files in os.walk("."):
for file in files:
if file.endswith(tuple(file_extension)):
file_name = os.path.join(root, file)
with open(file_name, 'r') as f:
content = f.read()
urls = re.findall(pattern, content)
if urls:
pic_urls.extend(urls)
_files.append(file_name)

# 先转为集合,再转回列表,进行去重
pic_urls = list(set(pic_urls))
print("共找到图片:", len(pic_urls))

url_dict = {}

# 将列表中的图片进行上传,每张图片最多尝试三次上传,如果三次都失败,则保留原连接
for i,u in enumerate(pci_urls, start=1):
for t in range(1,4):
try:
new_u = upload(u)
continue
except:
if t == 3:
new_u = u
print(f"{u} 无法上传:{e}")
url_dict[u] = new_u
print(f"{i} / {len(pic_urls)}")

# 对 _files 列表中的文件一一完成替换
for file in _files:
with open(file, 'r') as f:
content = f.read()
for k, v in url_dict.items():
content = content.replace(k, v)
with open(file, 'w') as f:
f.write(content)
print("完成替换:", file)

如上,经过脚本内容与zhullyb的原版略有差别,主要是由于之前所用的图片来源有些五花八门:直接引用的其他外链图片、以前用的github图床、vercel图床等等,过于混乱,因此在这里修改为统一识别出文件中markdown格式的图片来,并通过上传脚本下载到本地—上传到新的图床。

至此,完美实现了该脚本的功能,成功将本博客的图片切换统一的自建图床。

多地备份

同时,通过挂载多种网盘、储存桶到Alist的方式,采用TaoSync项目进行各个图床间的自动同步,确保图片文件在多个储存桶内均能稳定运行。

1726738327986.webp

至此完美实现图床的使用和迁移


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!